From db751e59323e7a2c0ecd030c8b78339dbeba1ae4 Mon Sep 17 00:00:00 2001 From: jvved Date: Mon, 3 Feb 2025 13:31:35 -0500 Subject: [PATCH] Removed ignored files from tracking --- .idea/.gitignore | 3 - .../inspectionProfiles/profiles_settings.xml | 6 - .idea/misc.xml | 6 - .idea/modules.xml | 8 - .idea/testpks.iml | 10 - .idea/vcs.xml | 6 - .read_stats.py.swp | Bin 12288 -> 0 bytes .venv/bin/Activate.ps1 | 247 - .venv/bin/activate | 70 - .venv/bin/activate.csh | 27 - .venv/bin/activate.fish | 69 - .venv/bin/ipython | 8 - .venv/bin/ipython3 | 8 - .venv/bin/markdown-it | 8 - .venv/bin/pip | 8 - .venv/bin/pip3 | 8 - .venv/bin/pip3.12 | 8 - .venv/bin/pygmentize | 8 - .venv/bin/python | 1 - .venv/bin/python3 | 1 - .venv/bin/python3.12 | 1 - .venv/bin/uwsgi | Bin 1455200 -> 0 bytes .../site-packages/IPython/__init__.py | 163 - .../site-packages/IPython/__main__.py | 15 - .../__pycache__/__init__.cpython-312.pyc | Bin 5892 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 300 -> 0 bytes .../__pycache__/conftest.cpython-312.pyc | Bin 3978 -> 0 bytes .../__pycache__/consoleapp.cpython-312.pyc | Bin 552 -> 0 bytes .../__pycache__/display.cpython-312.pyc | Bin 952 -> 0 bytes .../IPython/__pycache__/paths.cpython-312.pyc | Bin 5767 -> 0 bytes .../site-packages/IPython/conftest.py | 87 - .../site-packages/IPython/consoleapp.py | 12 - .../site-packages/IPython/core/__init__.py | 0 .../core/__pycache__/__init__.cpython-312.pyc | Bin 180 -> 0 bytes .../core/__pycache__/alias.cpython-312.pyc | Bin 10522 -> 0 bytes .../__pycache__/application.cpython-312.pyc | Bin 22883 -> 0 bytes .../__pycache__/async_helpers.cpython-312.pyc | Bin 6256 -> 0 bytes .../core/__pycache__/autocall.cpython-312.pyc | Bin 2359 -> 0 bytes .../__pycache__/builtin_trap.cpython-312.pyc | Bin 4023 -> 0 bytes .../__pycache__/compilerop.cpython-312.pyc | Bin 7038 -> 0 bytes .../__pycache__/completer.cpython-312.pyc | Bin 125535 -> 0 bytes .../__pycache__/completerlib.cpython-312.pyc | Bin 14274 -> 0 bytes .../__pycache__/crashhandler.cpython-312.pyc | Bin 9227 -> 0 bytes .../core/__pycache__/debugger.cpython-312.pyc | Bin 44322 -> 0 bytes .../core/__pycache__/display.cpython-312.pyc | Bin 52324 -> 0 bytes .../display_functions.cpython-312.pyc | Bin 13494 -> 0 bytes .../__pycache__/display_trap.cpython-312.pyc | Bin 2294 -> 0 bytes .../__pycache__/displayhook.cpython-312.pyc | Bin 15104 -> 0 bytes .../__pycache__/displaypub.cpython-312.pyc | Bin 6065 -> 0 bytes .../core/__pycache__/error.cpython-312.pyc | Bin 1794 -> 0 bytes .../core/__pycache__/events.cpython-312.pyc | Bin 6279 -> 0 bytes .../core/__pycache__/excolors.cpython-312.pyc | Bin 5315 -> 0 bytes .../__pycache__/extensions.cpython-312.pyc | Bin 6298 -> 0 bytes .../__pycache__/formatters.cpython-312.pyc | Bin 40842 -> 0 bytes .../__pycache__/getipython.cpython-312.pyc | Bin 679 -> 0 bytes .../__pycache__/guarded_eval.cpython-312.pyc | Bin 34278 -> 0 bytes .../core/__pycache__/history.cpython-312.pyc | Bin 41405 -> 0 bytes .../__pycache__/historyapp.cpython-312.pyc | Bin 7625 -> 0 bytes .../core/__pycache__/hooks.cpython-312.pyc | Bin 6241 -> 0 bytes .../__pycache__/inputsplitter.cpython-312.pyc | Bin 28868 -> 0 bytes .../inputtransformer.cpython-312.pyc | Bin 23981 -> 0 bytes .../inputtransformer2.cpython-312.pyc | Bin 35719 -> 0 bytes .../interactiveshell.cpython-312.pyc | Bin 151879 -> 0 bytes .../__pycache__/latex_symbols.cpython-312.pyc | Bin 53872 -> 0 bytes .../core/__pycache__/logger.cpython-312.pyc | Bin 9184 -> 0 bytes .../core/__pycache__/macro.cpython-312.pyc | Bin 2490 -> 0 bytes .../core/__pycache__/magic.cpython-312.pyc | Bin 28119 -> 0 bytes .../magic_arguments.cpython-312.pyc | Bin 11792 -> 0 bytes .../core/__pycache__/oinspect.cpython-312.pyc | Bin 43670 -> 0 bytes .../core/__pycache__/page.cpython-312.pyc | Bin 12704 -> 0 bytes .../core/__pycache__/payload.cpython-312.pyc | Bin 1826 -> 0 bytes .../__pycache__/payloadpage.cpython-312.pyc | Bin 1698 -> 0 bytes .../__pycache__/prefilter.cpython-312.pyc | Bin 28502 -> 0 bytes .../__pycache__/profileapp.cpython-312.pyc | Bin 13228 -> 0 bytes .../__pycache__/profiledir.cpython-312.pyc | Bin 11292 -> 0 bytes .../core/__pycache__/prompts.cpython-312.pyc | Bin 1452 -> 0 bytes .../__pycache__/pylabtools.cpython-312.pyc | Bin 17176 -> 0 bytes .../core/__pycache__/release.cpython-312.pyc | Bin 838 -> 0 bytes .../core/__pycache__/shellapp.cpython-312.pyc | Bin 24049 -> 0 bytes .../__pycache__/splitinput.cpython-312.pyc | Bin 4967 -> 0 bytes .../core/__pycache__/ultratb.cpython-312.pyc | Bin 57942 -> 0 bytes .../core/__pycache__/usage.cpython-312.pyc | Bin 13506 -> 0 bytes .../site-packages/IPython/core/alias.py | 267 - .../site-packages/IPython/core/application.py | 492 - .../IPython/core/async_helpers.py | 155 - .../site-packages/IPython/core/autocall.py | 70 - .../IPython/core/builtin_trap.py | 86 - .../site-packages/IPython/core/compilerop.py | 214 - .../site-packages/IPython/core/completer.py | 3421 ------- .../IPython/core/completerlib.py | 382 - .../IPython/core/crashhandler.py | 248 - .../site-packages/IPython/core/debugger.py | 1136 --- .../site-packages/IPython/core/display.py | 1373 --- .../IPython/core/display_functions.py | 391 - .../IPython/core/display_trap.py | 70 - .../site-packages/IPython/core/displayhook.py | 336 - .../site-packages/IPython/core/displaypub.py | 149 - .../site-packages/IPython/core/error.py | 60 - .../site-packages/IPython/core/events.py | 158 - .../site-packages/IPython/core/excolors.py | 192 - .../site-packages/IPython/core/extensions.py | 135 - .../site-packages/IPython/core/formatters.py | 1090 --- .../site-packages/IPython/core/getipython.py | 24 - .../IPython/core/guarded_eval.py | 895 -- .../site-packages/IPython/core/history.py | 989 -- .../site-packages/IPython/core/historyapp.py | 158 - .../site-packages/IPython/core/hooks.py | 173 - .../IPython/core/inputsplitter.py | 799 -- .../IPython/core/inputtransformer.py | 577 -- .../IPython/core/inputtransformer2.py | 830 -- .../IPython/core/interactiveshell.py | 3989 -------- .../IPython/core/latex_symbols.py | 1301 --- .../site-packages/IPython/core/logger.py | 231 - .../site-packages/IPython/core/macro.py | 53 - .../site-packages/IPython/core/magic.py | 759 -- .../IPython/core/magic_arguments.py | 310 - .../IPython/core/magics/__init__.py | 42 - .../__pycache__/__init__.cpython-312.pyc | Bin 1470 -> 0 bytes .../__pycache__/ast_mod.cpython-312.pyc | Bin 13238 -> 0 bytes .../magics/__pycache__/auto.cpython-312.pyc | Bin 5384 -> 0 bytes .../magics/__pycache__/basic.cpython-312.pyc | Bin 28870 -> 0 bytes .../magics/__pycache__/code.cpython-312.pyc | Bin 29099 -> 0 bytes .../magics/__pycache__/config.cpython-312.pyc | Bin 5089 -> 0 bytes .../__pycache__/display.cpython-312.pyc | Bin 3670 -> 0 bytes .../__pycache__/execution.cpython-312.pyc | Bin 65936 -> 0 bytes .../__pycache__/extension.cpython-312.pyc | Bin 2594 -> 0 bytes .../__pycache__/history.cpython-312.pyc | Bin 13169 -> 0 bytes .../__pycache__/logging.cpython-312.pyc | Bin 7064 -> 0 bytes .../__pycache__/namespace.cpython-312.pyc | Bin 26379 -> 0 bytes .../magics/__pycache__/osm.cpython-312.pyc | Bin 36216 -> 0 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 6956 -> 0 bytes .../magics/__pycache__/pylab.cpython-312.pyc | Bin 6935 -> 0 bytes .../magics/__pycache__/script.cpython-312.pyc | Bin 17684 -> 0 bytes .../IPython/core/magics/ast_mod.py | 330 - .../site-packages/IPython/core/magics/auto.py | 144 - .../IPython/core/magics/basic.py | 666 -- .../site-packages/IPython/core/magics/code.py | 757 -- .../IPython/core/magics/config.py | 140 - .../IPython/core/magics/display.py | 93 - .../IPython/core/magics/execution.py | 1638 ---- .../IPython/core/magics/extension.py | 63 - .../IPython/core/magics/history.py | 338 - .../IPython/core/magics/logging.py | 195 - .../IPython/core/magics/namespace.py | 711 -- .../site-packages/IPython/core/magics/osm.py | 855 -- .../IPython/core/magics/packaging.py | 181 - .../IPython/core/magics/pylab.py | 173 - .../IPython/core/magics/script.py | 393 - .../site-packages/IPython/core/oinspect.py | 1283 --- .../site-packages/IPython/core/page.py | 348 - .../site-packages/IPython/core/payload.py | 54 - .../site-packages/IPython/core/payloadpage.py | 51 - .../site-packages/IPython/core/prefilter.py | 707 -- .../IPython/core/profile/README_STARTUP | 11 - .../site-packages/IPython/core/profileapp.py | 315 - .../site-packages/IPython/core/profiledir.py | 244 - .../site-packages/IPython/core/prompts.py | 23 - .../site-packages/IPython/core/pylabtools.py | 542 -- .../site-packages/IPython/core/release.py | 45 - .../site-packages/IPython/core/shellapp.py | 495 - .../site-packages/IPython/core/splitinput.py | 145 - .../site-packages/IPython/core/tests/2x2.jpg | Bin 331 -> 0 bytes .../site-packages/IPython/core/tests/2x2.png | Bin 71 -> 0 bytes .../IPython/core/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 186 -> 0 bytes .../tests/__pycache__/bad_all.cpython-312.pyc | Bin 517 -> 0 bytes .../__pycache__/nonascii.cpython-312.pyc | Bin 211 -> 0 bytes .../__pycache__/nonascii2.cpython-312.pyc | Bin 216 -> 0 bytes .../__pycache__/print_argv.cpython-312.pyc | Bin 284 -> 0 bytes .../tests/__pycache__/refbug.cpython-312.pyc | Bin 1521 -> 0 bytes .../__pycache__/simpleerr.cpython-312.pyc | Bin 1265 -> 0 bytes .../tests/__pycache__/tclass.cpython-312.pyc | Bin 1440 -> 0 bytes .../__pycache__/test_alias.cpython-312.pyc | Bin 3584 -> 0 bytes .../test_application.cpython-312.pyc | Bin 3926 -> 0 bytes .../test_async_helpers.cpython-312.pyc | Bin 12344 -> 0 bytes .../__pycache__/test_autocall.cpython-312.pyc | Bin 1954 -> 0 bytes .../test_compilerop.cpython-312.pyc | Bin 2742 -> 0 bytes .../test_completer.cpython-312.pyc | Bin 85246 -> 0 bytes .../test_completerlib.cpython-312.pyc | Bin 10348 -> 0 bytes .../__pycache__/test_debugger.cpython-312.pyc | Bin 19664 -> 0 bytes .../__pycache__/test_display.cpython-312.pyc | Bin 26112 -> 0 bytes .../test_displayhook.cpython-312.pyc | Bin 6687 -> 0 bytes .../__pycache__/test_events.cpython-312.pyc | Bin 5319 -> 0 bytes .../test_exceptiongroup_tb.cpython-312.pyc | Bin 4374 -> 0 bytes .../test_extension.cpython-312.pyc | Bin 5333 -> 0 bytes .../test_formatters.cpython-312.pyc | Bin 29334 -> 0 bytes .../test_guarded_eval.cpython-312.pyc | Bin 38973 -> 0 bytes .../__pycache__/test_handlers.cpython-312.pyc | Bin 2523 -> 0 bytes .../__pycache__/test_history.cpython-312.pyc | Bin 15193 -> 0 bytes .../__pycache__/test_hooks.cpython-312.pyc | Bin 3140 -> 0 bytes .../__pycache__/test_imports.cpython-312.pyc | Bin 2731 -> 0 bytes .../test_inputsplitter.cpython-312.pyc | Bin 35921 -> 0 bytes .../test_inputtransformer.cpython-312.pyc | Bin 13423 -> 0 bytes .../test_inputtransformer2.cpython-312.pyc | Bin 16569 -> 0 bytes ...est_inputtransformer2_line.cpython-312.pyc | Bin 4004 -> 0 bytes .../test_interactiveshell.cpython-312.pyc | Bin 72728 -> 0 bytes .../__pycache__/test_iplib.cpython-312.pyc | Bin 7679 -> 0 bytes .../__pycache__/test_logger.cpython-312.pyc | Bin 1747 -> 0 bytes .../__pycache__/test_magic.cpython-312.pyc | Bin 82548 -> 0 bytes .../test_magic_arguments.cpython-312.pyc | Bin 6152 -> 0 bytes .../test_magic_terminal.cpython-312.pyc | Bin 9929 -> 0 bytes .../__pycache__/test_oinspect.cpython-312.pyc | Bin 29445 -> 0 bytes .../__pycache__/test_page.cpython-312.pyc | Bin 652 -> 0 bytes .../__pycache__/test_paths.cpython-312.pyc | Bin 13367 -> 0 bytes .../test_prefilter.cpython-312.pyc | Bin 7548 -> 0 bytes .../__pycache__/test_profile.cpython-312.pyc | Bin 6935 -> 0 bytes .../__pycache__/test_prompts.cpython-312.pyc | Bin 2346 -> 0 bytes .../test_pylabtools.cpython-312.pyc | Bin 17269 -> 0 bytes .../__pycache__/test_run.cpython-312.pyc | Bin 32046 -> 0 bytes .../__pycache__/test_shellapp.cpython-312.pyc | Bin 2303 -> 0 bytes .../test_splitinput.cpython-312.pyc | Bin 1614 -> 0 bytes .../__pycache__/test_ultratb.cpython-312.pyc | Bin 25821 -> 0 bytes .../IPython/core/tests/bad_all.py | 14 - .../daft_extension.cpython-312.pyc | Bin 699 -> 0 bytes .../tests/daft_extension/daft_extension.py | 12 - .../IPython/core/tests/nonascii.py | 4 - .../IPython/core/tests/nonascii2.py | 4 - .../IPython/core/tests/print_argv.py | 3 - .../IPython/core/tests/refbug.py | 46 - .../IPython/core/tests/simpleerr.py | 33 - .../IPython/core/tests/tclass.py | 34 - .../IPython/core/tests/test_alias.py | 66 - .../IPython/core/tests/test_application.py | 70 - .../IPython/core/tests/test_async_helpers.py | 325 - .../IPython/core/tests/test_autocall.py | 68 - .../IPython/core/tests/test_compilerop.py | 68 - .../IPython/core/tests/test_completer.py | 1819 ---- .../IPython/core/tests/test_completerlib.py | 193 - .../IPython/core/tests/test_debugger.py | 592 -- .../IPython/core/tests/test_display.py | 513 - .../IPython/core/tests/test_displayhook.py | 112 - .../IPython/core/tests/test_events.py | 78 - .../core/tests/test_exceptiongroup_tb.py | 112 - .../IPython/core/tests/test_extension.py | 95 - .../IPython/core/tests/test_formatters.py | 545 -- .../IPython/core/tests/test_guarded_eval.py | 785 -- .../IPython/core/tests/test_handlers.py | 75 - .../IPython/core/tests/test_history.py | 306 - .../IPython/core/tests/test_hooks.py | 76 - .../IPython/core/tests/test_imports.py | 52 - .../IPython/core/tests/test_inputsplitter.py | 643 -- .../core/tests/test_inputtransformer.py | 469 - .../core/tests/test_inputtransformer2.py | 448 - .../core/tests/test_inputtransformer2_line.py | 167 - .../core/tests/test_interactiveshell.py | 1221 --- .../IPython/core/tests/test_iplib.py | 246 - .../IPython/core/tests/test_logger.py | 27 - .../IPython/core/tests/test_magic.py | 1623 ---- .../core/tests/test_magic_arguments.py | 142 - .../IPython/core/tests/test_magic_terminal.py | 216 - .../IPython/core/tests/test_oinspect.py | 589 -- .../IPython/core/tests/test_page.py | 20 - .../IPython/core/tests/test_paths.py | 202 - .../IPython/core/tests/test_prefilter.py | 149 - .../IPython/core/tests/test_profile.py | 161 - .../IPython/core/tests/test_prompts.py | 30 - .../IPython/core/tests/test_pylabtools.py | 375 - .../IPython/core/tests/test_run.py | 626 -- .../IPython/core/tests/test_shellapp.py | 56 - .../IPython/core/tests/test_splitinput.py | 41 - .../IPython/core/tests/test_ultratb.py | 457 - .../site-packages/IPython/core/ultratb.py | 1547 --- .../site-packages/IPython/core/usage.py | 341 - .../site-packages/IPython/display.py | 44 - .../IPython/extensions/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 248 -> 0 bytes .../__pycache__/autoreload.cpython-312.pyc | Bin 26811 -> 0 bytes .../__pycache__/storemagic.cpython-312.pyc | Bin 10139 -> 0 bytes .../IPython/extensions/autoreload.py | 727 -- .../IPython/extensions/storemagic.py | 236 - .../IPython/extensions/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 192 -> 0 bytes .../test_autoreload.cpython-312.pyc | Bin 32485 -> 0 bytes .../test_storemagic.cpython-312.pyc | Bin 4509 -> 0 bytes .../extensions/tests/test_autoreload.py | 712 -- .../extensions/tests/test_storemagic.py | 71 - .../IPython/external/__init__.py | 7 - .../__pycache__/__init__.cpython-312.pyc | Bin 385 -> 0 bytes .../__pycache__/qt_for_kernel.cpython-312.pyc | Bin 3675 -> 0 bytes .../__pycache__/qt_loaders.cpython-312.pyc | Bin 14205 -> 0 bytes .../IPython/external/qt_for_kernel.py | 124 - .../IPython/external/qt_loaders.py | 423 - .../IPython/external/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 0 bytes .../test_qt_loaders.cpython-312.pyc | Bin 942 -> 0 bytes .../IPython/external/tests/test_qt_loaders.py | 11 - .../site-packages/IPython/lib/__init__.py | 11 - .../lib/__pycache__/__init__.cpython-312.pyc | Bin 228 -> 0 bytes .../backgroundjobs.cpython-312.pyc | Bin 21436 -> 0 bytes .../lib/__pycache__/clipboard.cpython-312.pyc | Bin 4956 -> 0 bytes .../__pycache__/deepreload.cpython-312.pyc | Bin 9150 -> 0 bytes .../lib/__pycache__/demo.cpython-312.pyc | Bin 29141 -> 0 bytes .../lib/__pycache__/display.cpython-312.pyc | Bin 29273 -> 0 bytes .../__pycache__/editorhooks.cpython-312.pyc | Bin 4969 -> 0 bytes .../__pycache__/guisupport.cpython-312.pyc | Bin 5897 -> 0 bytes .../__pycache__/latextools.cpython-312.pyc | Bin 10395 -> 0 bytes .../lib/__pycache__/lexers.cpython-312.pyc | Bin 19467 -> 0 bytes .../lib/__pycache__/pretty.cpython-312.pyc | Bin 44481 -> 0 bytes .../IPython/lib/backgroundjobs.py | 491 - .../site-packages/IPython/lib/clipboard.py | 102 - .../site-packages/IPython/lib/deepreload.py | 310 - .../site-packages/IPython/lib/demo.py | 672 -- .../site-packages/IPython/lib/display.py | 677 -- .../site-packages/IPython/lib/editorhooks.py | 127 - .../site-packages/IPython/lib/guisupport.py | 155 - .../site-packages/IPython/lib/latextools.py | 257 - .../site-packages/IPython/lib/lexers.py | 540 -- .../site-packages/IPython/lib/pretty.py | 961 -- .../IPython/lib/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 185 -> 0 bytes .../test_backgroundjobs.cpython-312.pyc | Bin 3190 -> 0 bytes .../test_clipboard.cpython-312.pyc | Bin 819 -> 0 bytes .../test_deepreload.cpython-312.pyc | Bin 3024 -> 0 bytes .../__pycache__/test_display.cpython-312.pyc | Bin 15424 -> 0 bytes .../test_editorhooks.cpython-312.pyc | Bin 1731 -> 0 bytes .../__pycache__/test_imports.cpython-312.pyc | Bin 719 -> 0 bytes .../test_latextools.cpython-312.pyc | Bin 8775 -> 0 bytes .../__pycache__/test_lexers.cpython-312.pyc | Bin 8854 -> 0 bytes .../__pycache__/test_pretty.cpython-312.pyc | Bin 24509 -> 0 bytes .../__pycache__/test_pygments.cpython-312.pyc | Bin 1414 -> 0 bytes .../site-packages/IPython/lib/tests/test.wav | Bin 44144 -> 0 bytes .../IPython/lib/tests/test_backgroundjobs.py | 85 - .../IPython/lib/tests/test_clipboard.py | 20 - .../IPython/lib/tests/test_deepreload.py | 57 - .../IPython/lib/tests/test_display.py | 272 - .../IPython/lib/tests/test_editorhooks.py | 32 - .../IPython/lib/tests/test_imports.py | 14 - .../IPython/lib/tests/test_latextools.py | 192 - .../IPython/lib/tests/test_lexers.py | 184 - .../IPython/lib/tests/test_pretty.py | 540 -- .../IPython/lib/tests/test_pygments.py | 26 - .../python3.12/site-packages/IPython/paths.py | 125 - .../python3.12/site-packages/IPython/py.typed | 0 .../IPython/sphinxext/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 185 -> 0 bytes .../custom_doctests.cpython-312.pyc | Bin 4847 -> 0 bytes ...ython_console_highlighting.cpython-312.pyc | Bin 867 -> 0 bytes .../ipython_directive.cpython-312.pyc | Bin 40314 -> 0 bytes .../IPython/sphinxext/custom_doctests.py | 155 - .../sphinxext/ipython_console_highlighting.py | 28 - .../IPython/sphinxext/ipython_directive.py | 1278 --- .../IPython/terminal/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 184 -> 0 bytes .../__pycache__/console.cpython-312.pyc | Bin 731 -> 0 bytes .../__pycache__/debugger.cpython-312.pyc | Bin 9298 -> 0 bytes .../__pycache__/embed.cpython-312.pyc | Bin 17569 -> 0 bytes .../interactiveshell.cpython-312.pyc | Bin 45792 -> 0 bytes .../__pycache__/ipapp.cpython-312.pyc | Bin 14093 -> 0 bytes .../__pycache__/magics.cpython-312.pyc | Bin 10125 -> 0 bytes .../__pycache__/prompts.cpython-312.pyc | Bin 7551 -> 0 bytes .../__pycache__/ptutils.cpython-312.pyc | Bin 9752 -> 0 bytes .../site-packages/IPython/terminal/console.py | 19 - .../IPython/terminal/debugger.py | 187 - .../site-packages/IPython/terminal/embed.py | 426 - .../IPython/terminal/interactiveshell.py | 1075 --- .../site-packages/IPython/terminal/ipapp.py | 338 - .../site-packages/IPython/terminal/magics.py | 214 - .../site-packages/IPython/terminal/prompts.py | 128 - .../terminal/pt_inputhooks/__init__.py | 139 - .../__pycache__/__init__.cpython-312.pyc | Bin 4484 -> 0 bytes .../__pycache__/asyncio.cpython-312.pyc | Bin 2015 -> 0 bytes .../__pycache__/glut.cpython-312.pyc | Bin 4250 -> 0 bytes .../__pycache__/gtk.cpython-312.pyc | Bin 1264 -> 0 bytes .../__pycache__/gtk3.cpython-312.pyc | Bin 891 -> 0 bytes .../__pycache__/gtk4.cpython-312.pyc | Bin 1571 -> 0 bytes .../__pycache__/osx.cpython-312.pyc | Bin 5677 -> 0 bytes .../__pycache__/pyglet.cpython-312.pyc | Bin 2267 -> 0 bytes .../__pycache__/qt.cpython-312.pyc | Bin 3873 -> 0 bytes .../__pycache__/tk.cpython-312.pyc | Bin 2861 -> 0 bytes .../__pycache__/wx.cpython-312.pyc | Bin 8430 -> 0 bytes .../IPython/terminal/pt_inputhooks/asyncio.py | 63 - .../IPython/terminal/pt_inputhooks/glut.py | 140 - .../IPython/terminal/pt_inputhooks/gtk.py | 60 - .../IPython/terminal/pt_inputhooks/gtk3.py | 14 - .../IPython/terminal/pt_inputhooks/gtk4.py | 27 - .../IPython/terminal/pt_inputhooks/osx.py | 147 - .../IPython/terminal/pt_inputhooks/pyglet.py | 66 - .../IPython/terminal/pt_inputhooks/qt.py | 90 - .../IPython/terminal/pt_inputhooks/tk.py | 90 - .../IPython/terminal/pt_inputhooks/wx.py | 219 - .../site-packages/IPython/terminal/ptutils.py | 204 - .../IPython/terminal/shortcuts/__init__.py | 638 -- .../__pycache__/__init__.cpython-312.pyc | Bin 21942 -> 0 bytes .../__pycache__/auto_match.cpython-312.pyc | Bin 4785 -> 0 bytes .../__pycache__/auto_suggest.cpython-312.pyc | Bin 29358 -> 0 bytes .../__pycache__/filters.cpython-312.pyc | Bin 13707 -> 0 bytes .../IPython/terminal/shortcuts/auto_match.py | 105 - .../terminal/shortcuts/auto_suggest.py | 648 -- .../IPython/terminal/shortcuts/filters.py | 322 - .../IPython/terminal/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 0 bytes .../test_debug_magic.cpython-312.pyc | Bin 2932 -> 0 bytes .../__pycache__/test_embed.cpython-312.pyc | Bin 5741 -> 0 bytes .../__pycache__/test_help.cpython-312.pyc | Bin 1685 -> 0 bytes .../test_interactivshell.cpython-312.pyc | Bin 12926 -> 0 bytes .../test_pt_inputhooks.cpython-312.pyc | Bin 2002 -> 0 bytes .../test_shortcuts.cpython-312.pyc | Bin 20304 -> 0 bytes .../terminal/tests/test_debug_magic.py | 82 - .../IPython/terminal/tests/test_embed.py | 138 - .../IPython/terminal/tests/test_help.py | 30 - .../terminal/tests/test_interactivshell.py | 255 - .../terminal/tests/test_pt_inputhooks.py | 50 - .../IPython/terminal/tests/test_shortcuts.py | 485 - .../site-packages/IPython/testing/__init__.py | 20 - .../__pycache__/__init__.cpython-312.pyc | Bin 409 -> 0 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 7619 -> 0 bytes .../__pycache__/globalipapp.cpython-312.pyc | Bin 3860 -> 0 bytes .../__pycache__/ipunittest.cpython-312.pyc | Bin 7375 -> 0 bytes .../__pycache__/skipdoctest.cpython-312.pyc | Bin 891 -> 0 bytes .../testing/__pycache__/tools.cpython-312.pyc | Bin 18473 -> 0 bytes .../IPython/testing/decorators.py | 204 - .../IPython/testing/globalipapp.py | 114 - .../IPython/testing/ipunittest.py | 186 - .../IPython/testing/plugin/README.txt | 34 - .../IPython/testing/plugin/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 0 bytes .../__pycache__/dtexample.cpython-312.pyc | Bin 3634 -> 0 bytes .../__pycache__/ipdoctest.cpython-312.pyc | Bin 11812 -> 0 bytes .../pytest_ipdoctest.cpython-312.pyc | Bin 38375 -> 0 bytes .../plugin/__pycache__/setup.cpython-312.pyc | Bin 664 -> 0 bytes .../plugin/__pycache__/simple.cpython-312.pyc | Bin 1052 -> 0 bytes .../__pycache__/simplevars.cpython-312.pyc | Bin 248 -> 0 bytes .../test_ipdoctest.cpython-312.pyc | Bin 2485 -> 0 bytes .../__pycache__/test_refs.cpython-312.pyc | Bin 1076 -> 0 bytes .../IPython/testing/plugin/dtexample.py | 167 - .../IPython/testing/plugin/ipdoctest.py | 299 - .../testing/plugin/pytest_ipdoctest.py | 879 -- .../IPython/testing/plugin/setup.py | 18 - .../IPython/testing/plugin/simple.py | 44 - .../IPython/testing/plugin/simplevars.py | 2 - .../IPython/testing/plugin/test_combo.txt | 36 - .../IPython/testing/plugin/test_example.txt | 24 - .../IPython/testing/plugin/test_exampleip.txt | 30 - .../IPython/testing/plugin/test_ipdoctest.py | 92 - .../IPython/testing/plugin/test_refs.py | 39 - .../IPython/testing/skipdoctest.py | 19 - .../IPython/testing/tests/__init__.py | 10 - .../__pycache__/__init__.cpython-312.pyc | Bin 231 -> 0 bytes .../test_decorators.cpython-312.pyc | Bin 5641 -> 0 bytes .../test_ipunittest.cpython-312.pyc | Bin 3414 -> 0 bytes .../__pycache__/test_tools.cpython-312.pyc | Bin 5924 -> 0 bytes .../IPython/testing/tests/test_decorators.py | 168 - .../IPython/testing/tests/test_ipunittest.py | 131 - .../IPython/testing/tests/test_tools.py | 133 - .../site-packages/IPython/testing/tools.py | 471 - .../site-packages/IPython/utils/PyColorize.py | 331 - .../site-packages/IPython/utils/__init__.py | 0 .../__pycache__/PyColorize.cpython-312.pyc | Bin 11722 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 181 -> 0 bytes .../__pycache__/_process_cli.cpython-312.pyc | Bin 2856 -> 0 bytes .../_process_common.cpython-312.pyc | Bin 7733 -> 0 bytes .../_process_emscripten.cpython-312.pyc | Bin 839 -> 0 bytes .../_process_posix.cpython-312.pyc | Bin 6358 -> 0 bytes .../_process_win32.cpython-312.pyc | Bin 7195 -> 0 bytes .../_process_win32_controller.cpython-312.pyc | Bin 21715 -> 0 bytes .../__pycache__/_sysinfo.cpython-312.pyc | Bin 206 -> 0 bytes .../utils/__pycache__/capture.cpython-312.pyc | Bin 8168 -> 0 bytes .../__pycache__/colorable.cpython-312.pyc | Bin 1075 -> 0 bytes .../__pycache__/coloransi.cpython-312.pyc | Bin 9121 -> 0 bytes .../__pycache__/contexts.cpython-312.pyc | Bin 2239 -> 0 bytes .../__pycache__/daemonize.cpython-312.pyc | Bin 442 -> 0 bytes .../utils/__pycache__/data.cpython-312.pyc | Bin 1174 -> 0 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 2516 -> 0 bytes .../utils/__pycache__/dir2.cpython-312.pyc | Bin 2547 -> 0 bytes .../utils/__pycache__/docs.cpython-312.pyc | Bin 343 -> 0 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2169 -> 0 bytes .../__pycache__/eventful.cpython-312.pyc | Bin 365 -> 0 bytes .../utils/__pycache__/frame.cpython-312.pyc | Bin 3783 -> 0 bytes .../__pycache__/generics.cpython-312.pyc | Bin 1073 -> 0 bytes .../__pycache__/importstring.cpython-312.pyc | Bin 1296 -> 0 bytes .../utils/__pycache__/io.cpython-312.pyc | Bin 6778 -> 0 bytes .../__pycache__/ipstruct.cpython-312.pyc | Bin 12600 -> 0 bytes .../__pycache__/jsonutil.cpython-312.pyc | Bin 375 -> 0 bytes .../localinterfaces.cpython-312.pyc | Bin 404 -> 0 bytes .../utils/__pycache__/log.cpython-312.pyc | Bin 345 -> 0 bytes .../__pycache__/module_paths.cpython-312.pyc | Bin 1563 -> 0 bytes .../utils/__pycache__/openpy.cpython-312.pyc | Bin 4602 -> 0 bytes .../utils/__pycache__/path.cpython-312.pyc | Bin 15905 -> 0 bytes .../utils/__pycache__/process.cpython-312.pyc | Bin 2758 -> 0 bytes .../__pycache__/py3compat.cpython-312.pyc | Bin 2374 -> 0 bytes .../__pycache__/sentinel.cpython-312.pyc | Bin 899 -> 0 bytes .../__pycache__/shimmodule.cpython-312.pyc | Bin 4769 -> 0 bytes .../__pycache__/signatures.cpython-312.pyc | Bin 805 -> 0 bytes .../__pycache__/strdispatch.cpython-312.pyc | Bin 3151 -> 0 bytes .../utils/__pycache__/sysinfo.cpython-312.pyc | Bin 4921 -> 0 bytes .../syspathcontext.cpython-312.pyc | Bin 2814 -> 0 bytes .../utils/__pycache__/tempdir.cpython-312.pyc | Bin 3483 -> 0 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 4343 -> 0 bytes .../utils/__pycache__/text.cpython-312.pyc | Bin 31816 -> 0 bytes .../utils/__pycache__/timing.cpython-312.pyc | Bin 4413 -> 0 bytes .../__pycache__/tokenutil.cpython-312.pyc | Bin 5755 -> 0 bytes .../__pycache__/traitlets.cpython-312.pyc | Bin 371 -> 0 bytes .../utils/__pycache__/tz.cpython-312.pyc | Bin 2343 -> 0 bytes .../__pycache__/ulinecache.cpython-312.pyc | Bin 1025 -> 0 bytes .../utils/__pycache__/version.cpython-312.pyc | Bin 1192 -> 0 bytes .../__pycache__/wildcard.cpython-312.pyc | Bin 4676 -> 0 bytes .../IPython/utils/_process_cli.py | 71 - .../IPython/utils/_process_common.py | 210 - .../IPython/utils/_process_emscripten.py | 22 - .../IPython/utils/_process_posix.py | 219 - .../IPython/utils/_process_win32.py | 184 - .../utils/_process_win32_controller.py | 573 -- .../site-packages/IPython/utils/_sysinfo.py | 2 - .../site-packages/IPython/utils/capture.py | 170 - .../site-packages/IPython/utils/colorable.py | 25 - .../site-packages/IPython/utils/coloransi.py | 246 - .../site-packages/IPython/utils/contexts.py | 61 - .../site-packages/IPython/utils/daemonize.py | 4 - .../site-packages/IPython/utils/data.py | 30 - .../site-packages/IPython/utils/decorators.py | 83 - .../site-packages/IPython/utils/dir2.py | 84 - .../site-packages/IPython/utils/docs.py | 3 - .../site-packages/IPython/utils/encoding.py | 71 - .../site-packages/IPython/utils/eventful.py | 5 - .../site-packages/IPython/utils/frame.py | 94 - .../site-packages/IPython/utils/generics.py | 29 - .../IPython/utils/importstring.py | 39 - .../site-packages/IPython/utils/io.py | 153 - .../site-packages/IPython/utils/ipstruct.py | 379 - .../site-packages/IPython/utils/jsonutil.py | 5 - .../IPython/utils/localinterfaces.py | 5 - .../site-packages/IPython/utils/log.py | 5 - .../IPython/utils/module_paths.py | 72 - .../site-packages/IPython/utils/openpy.py | 105 - .../site-packages/IPython/utils/path.py | 407 - .../site-packages/IPython/utils/process.py | 71 - .../site-packages/IPython/utils/py3compat.py | 68 - .../site-packages/IPython/utils/sentinel.py | 17 - .../site-packages/IPython/utils/shimmodule.py | 89 - .../site-packages/IPython/utils/signatures.py | 12 - .../IPython/utils/strdispatch.py | 68 - .../site-packages/IPython/utils/sysinfo.py | 143 - .../IPython/utils/syspathcontext.py | 71 - .../site-packages/IPython/utils/tempdir.py | 59 - .../site-packages/IPython/utils/terminal.py | 131 - .../IPython/utils/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 187 -> 0 bytes .../__pycache__/test_capture.cpython-312.pyc | Bin 7368 -> 0 bytes .../test_decorators.cpython-312.pyc | Bin 648 -> 0 bytes .../test_deprecated.cpython-312.pyc | Bin 603 -> 0 bytes .../__pycache__/test_dir2.cpython-312.pyc | Bin 3540 -> 0 bytes .../__pycache__/test_imports.cpython-312.pyc | Bin 1112 -> 0 bytes .../test_importstring.cpython-312.pyc | Bin 1108 -> 0 bytes .../tests/__pycache__/test_io.cpython-312.pyc | Bin 2801 -> 0 bytes .../test_module_paths.cpython-312.pyc | Bin 4146 -> 0 bytes .../__pycache__/test_openpy.cpython-312.pyc | Bin 2347 -> 0 bytes .../__pycache__/test_path.cpython-312.pyc | Bin 27723 -> 0 bytes .../__pycache__/test_process.cpython-312.pyc | Bin 8797 -> 0 bytes .../test_pycolorize.cpython-312.pyc | Bin 1915 -> 0 bytes .../test_shimmodule.cpython-312.pyc | Bin 831 -> 0 bytes .../__pycache__/test_sysinfo.cpython-312.pyc | Bin 964 -> 0 bytes .../__pycache__/test_tempdir.cpython-312.pyc | Bin 1648 -> 0 bytes .../__pycache__/test_text.cpython-312.pyc | Bin 10934 -> 0 bytes .../test_tokenutil.cpython-312.pyc | Bin 5777 -> 0 bytes .../__pycache__/test_wildcard.cpython-312.pyc | Bin 6247 -> 0 bytes .../IPython/utils/tests/test_capture.py | 166 - .../IPython/utils/tests/test_decorators.py | 10 - .../IPython/utils/tests/test_deprecated.py | 7 - .../IPython/utils/tests/test_dir2.py | 66 - .../IPython/utils/tests/test_imports.py | 20 - .../IPython/utils/tests/test_importstring.py | 40 - .../IPython/utils/tests/test_io.py | 61 - .../IPython/utils/tests/test_module_paths.py | 107 - .../IPython/utils/tests/test_openpy.py | 38 - .../IPython/utils/tests/test_path.py | 506 - .../IPython/utils/tests/test_process.py | 188 - .../IPython/utils/tests/test_pycolorize.py | 70 - .../IPython/utils/tests/test_shimmodule.py | 12 - .../IPython/utils/tests/test_sysinfo.py | 22 - .../IPython/utils/tests/test_tempdir.py | 29 - .../IPython/utils/tests/test_text.py | 268 - .../IPython/utils/tests/test_tokenutil.py | 141 - .../IPython/utils/tests/test_wildcard.py | 143 - .../site-packages/IPython/utils/text.py | 886 -- .../site-packages/IPython/utils/timing.py | 123 - .../site-packages/IPython/utils/tokenutil.py | 160 - .../site-packages/IPython/utils/traitlets.py | 6 - .../site-packages/IPython/utils/tz.py | 82 - .../site-packages/IPython/utils/ulinecache.py | 21 - .../site-packages/IPython/utils/version.py | 43 - .../site-packages/IPython/utils/wildcard.py | 111 - .../__pycache__/decorator.cpython-312.pyc | Bin 20917 -> 0 bytes .../typing_extensions.cpython-312.pyc | Bin 139481 -> 0 bytes .../uwsgidecorators.cpython-312.pyc | Bin 21529 -> 0 bytes .../annotated_types-0.7.0.dist-info/INSTALLER | 1 - .../annotated_types-0.7.0.dist-info/METADATA | 295 - .../annotated_types-0.7.0.dist-info/RECORD | 10 - .../annotated_types-0.7.0.dist-info/WHEEL | 4 - .../licenses/LICENSE | 21 - .../site-packages/annotated_types/__init__.py | 432 - .../__pycache__/__init__.cpython-312.pyc | Bin 18614 -> 0 bytes .../__pycache__/test_cases.cpython-312.pyc | Bin 13233 -> 0 bytes .../site-packages/annotated_types/py.typed | 0 .../annotated_types/test_cases.py | 151 - .../asttokens-3.0.0.dist-info/INSTALLER | 1 - .../asttokens-3.0.0.dist-info/LICENSE | 201 - .../asttokens-3.0.0.dist-info/METADATA | 118 - .../asttokens-3.0.0.dist-info/RECORD | 21 - .../asttokens-3.0.0.dist-info/WHEEL | 5 - .../asttokens-3.0.0.dist-info/top_level.txt | 1 - .../site-packages/asttokens/__init__.py | 24 - .../__pycache__/__init__.cpython-312.pyc | Bin 589 -> 0 bytes .../astroid_compat.cpython-312.pyc | Bin 657 -> 0 bytes .../__pycache__/asttokens.cpython-312.pyc | Bin 17997 -> 0 bytes .../__pycache__/line_numbers.cpython-312.pyc | Bin 3635 -> 0 bytes .../__pycache__/mark_tokens.cpython-312.pyc | Bin 20001 -> 0 bytes .../__pycache__/util.cpython-312.pyc | Bin 20500 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 202 -> 0 bytes .../site-packages/asttokens/astroid_compat.py | 18 - .../site-packages/asttokens/asttokens.py | 450 - .../site-packages/asttokens/line_numbers.py | 76 - .../site-packages/asttokens/mark_tokens.py | 467 - .../site-packages/asttokens/py.typed | 0 .../site-packages/asttokens/util.py | 485 - .../site-packages/asttokens/version.py | 1 - .../decorator-5.1.1.dist-info/INSTALLER | 1 - .../decorator-5.1.1.dist-info/LICENSE.txt | 26 - .../decorator-5.1.1.dist-info/METADATA | 127 - .../decorator-5.1.1.dist-info/RECORD | 9 - .../decorator-5.1.1.dist-info/WHEEL | 5 - .../decorator-5.1.1.dist-info/pbr.json | 1 - .../decorator-5.1.1.dist-info/top_level.txt | 1 - .../lib/python3.12/site-packages/decorator.py | 451 - .../executing-2.2.0.dist-info/INSTALLER | 1 - .../executing-2.2.0.dist-info/LICENSE.txt | 21 - .../executing-2.2.0.dist-info/METADATA | 170 - .../executing-2.2.0.dist-info/RECORD | 19 - .../executing-2.2.0.dist-info/WHEEL | 6 - .../executing-2.2.0.dist-info/top_level.txt | 1 - .../site-packages/executing/__init__.py | 28 - .../__pycache__/__init__.cpython-312.pyc | Bin 1104 -> 0 bytes .../__pycache__/_exceptions.cpython-312.pyc | Bin 1122 -> 0 bytes .../_position_node_finder.cpython-312.pyc | Bin 35167 -> 0 bytes .../__pycache__/_pytest_utils.cpython-312.pyc | Bin 731 -> 0 bytes .../__pycache__/executing.cpython-312.pyc | Bin 48973 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 202 -> 0 bytes .../site-packages/executing/_exceptions.py | 22 - .../executing/_position_node_finder.py | 992 -- .../site-packages/executing/_pytest_utils.py | 16 - .../site-packages/executing/executing.py | 1160 --- .../site-packages/executing/py.typed | 0 .../site-packages/executing/version.py | 1 - .../ipython-8.32.0.dist-info/INSTALLER | 1 - .../ipython-8.32.0.dist-info/LICENSE | 33 - .../ipython-8.32.0.dist-info/METADATA | 128 - .../ipython-8.32.0.dist-info/RECORD | 569 -- .../ipython-8.32.0.dist-info/WHEEL | 5 - .../ipython-8.32.0.dist-info/entry_points.txt | 8 - .../ipython-8.32.0.dist-info/top_level.txt | 1 - .../jedi-0.19.2.dist-info/AUTHORS.txt | 72 - .../jedi-0.19.2.dist-info/INSTALLER | 1 - .../jedi-0.19.2.dist-info/LICENSE.txt | 24 - .../jedi-0.19.2.dist-info/METADATA | 623 -- .../jedi-0.19.2.dist-info/RECORD | 1965 ---- .../site-packages/jedi-0.19.2.dist-info/WHEEL | 6 - .../jedi-0.19.2.dist-info/top_level.txt | 1 - .../python3.12/site-packages/jedi/__init__.py | 42 - .../python3.12/site-packages/jedi/__main__.py | 72 - .../jedi/__pycache__/__init__.cpython-312.pyc | Bin 1792 -> 0 bytes .../jedi/__pycache__/__main__.cpython-312.pyc | Bin 3315 -> 0 bytes .../_compatibility.cpython-312.pyc | Bin 1800 -> 0 bytes .../jedi/__pycache__/cache.cpython-312.pyc | Bin 5368 -> 0 bytes .../jedi/__pycache__/common.cpython-312.pyc | Bin 1338 -> 0 bytes .../jedi/__pycache__/debug.cpython-312.pyc | Bin 5070 -> 0 bytes .../jedi/__pycache__/file_io.cpython-312.pyc | Bin 5346 -> 0 bytes .../__pycache__/parser_utils.cpython-312.pyc | Bin 14414 -> 0 bytes .../jedi/__pycache__/settings.cpython-312.pyc | Bin 2446 -> 0 bytes .../jedi/__pycache__/utils.cpython-312.pyc | Bin 5755 -> 0 bytes .../site-packages/jedi/_compatibility.py | 45 - .../site-packages/jedi/api/__init__.py | 798 -- .../api/__pycache__/__init__.cpython-312.pyc | Bin 36904 -> 0 bytes .../api/__pycache__/classes.cpython-312.pyc | Bin 39443 -> 0 bytes .../__pycache__/completion.cpython-312.pyc | Bin 31515 -> 0 bytes .../completion_cache.cpython-312.pyc | Bin 1689 -> 0 bytes .../__pycache__/environment.cpython-312.pyc | Bin 19350 -> 0 bytes .../api/__pycache__/errors.cpython-312.pyc | Bin 2618 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 1677 -> 0 bytes .../api/__pycache__/file_name.cpython-312.pyc | Bin 7207 -> 0 bytes .../api/__pycache__/helpers.cpython-312.pyc | Bin 21255 -> 0 bytes .../__pycache__/interpreter.cpython-312.pyc | Bin 4239 -> 0 bytes .../api/__pycache__/keywords.cpython-312.pyc | Bin 2300 -> 0 bytes .../api/__pycache__/project.cpython-312.pyc | Bin 19259 -> 0 bytes .../__pycache__/replstartup.cpython-312.pyc | Bin 1143 -> 0 bytes .../api/__pycache__/strings.cpython-312.pyc | Bin 4723 -> 0 bytes .../site-packages/jedi/api/classes.py | 895 -- .../site-packages/jedi/api/completion.py | 696 -- .../jedi/api/completion_cache.py | 31 - .../site-packages/jedi/api/environment.py | 480 - .../site-packages/jedi/api/errors.py | 46 - .../site-packages/jedi/api/exceptions.py | 31 - .../site-packages/jedi/api/file_name.py | 155 - .../site-packages/jedi/api/helpers.py | 522 - .../site-packages/jedi/api/interpreter.py | 74 - .../site-packages/jedi/api/keywords.py | 51 - .../site-packages/jedi/api/project.py | 448 - .../jedi/api/refactoring/__init__.py | 264 - .../__pycache__/__init__.cpython-312.pyc | Bin 14122 -> 0 bytes .../__pycache__/extract.cpython-312.pyc | Bin 16111 -> 0 bytes .../jedi/api/refactoring/extract.py | 386 - .../site-packages/jedi/api/replstartup.py | 29 - .../site-packages/jedi/api/strings.py | 111 - .../python3.12/site-packages/jedi/cache.py | 115 - .../python3.12/site-packages/jedi/common.py | 24 - .../python3.12/site-packages/jedi/debug.py | 132 - .../python3.12/site-packages/jedi/file_io.py | 83 - .../site-packages/jedi/inference/__init__.py | 199 - .../__pycache__/__init__.cpython-312.pyc | Bin 10333 -> 0 bytes .../__pycache__/analysis.cpython-312.pyc | Bin 10986 -> 0 bytes .../__pycache__/arguments.cpython-312.pyc | Bin 15932 -> 0 bytes .../__pycache__/base_value.cpython-312.pyc | Bin 31509 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 5612 -> 0 bytes .../__pycache__/context.cpython-312.pyc | Bin 24326 -> 0 bytes .../docstring_utils.cpython-312.pyc | Bin 1834 -> 0 bytes .../__pycache__/docstrings.cpython-312.pyc | Bin 13205 -> 0 bytes .../dynamic_params.cpython-312.pyc | Bin 8947 -> 0 bytes .../__pycache__/filters.cpython-312.pyc | Bin 21514 -> 0 bytes .../__pycache__/finder.cpython-312.pyc | Bin 6574 -> 0 bytes .../__pycache__/flow_analysis.cpython-312.pyc | Bin 5264 -> 0 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 7772 -> 0 bytes .../__pycache__/imports.cpython-312.pyc | Bin 22221 -> 0 bytes .../__pycache__/lazy_value.cpython-312.pyc | Bin 4158 -> 0 bytes .../__pycache__/names.cpython-312.pyc | Bin 34214 -> 0 bytes .../__pycache__/param.cpython-312.pyc | Bin 10901 -> 0 bytes .../__pycache__/parser_cache.cpython-312.pyc | Bin 523 -> 0 bytes .../__pycache__/recursion.cpython-312.pyc | Bin 6067 -> 0 bytes .../__pycache__/references.cpython-312.pyc | Bin 13938 -> 0 bytes .../__pycache__/signature.cpython-312.pyc | Bin 8341 -> 0 bytes .../__pycache__/star_args.cpython-312.pyc | Bin 9186 -> 0 bytes .../__pycache__/syntax_tree.cpython-312.pyc | Bin 39874 -> 0 bytes .../__pycache__/sys_path.cpython-312.pyc | Bin 11910 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 5010 -> 0 bytes .../site-packages/jedi/inference/analysis.py | 213 - .../site-packages/jedi/inference/arguments.py | 335 - .../jedi/inference/base_value.py | 558 -- .../site-packages/jedi/inference/cache.py | 126 - .../jedi/inference/compiled/__init__.py | 70 - .../__pycache__/__init__.cpython-312.pyc | Bin 3941 -> 0 bytes .../__pycache__/access.cpython-312.pyc | Bin 26833 -> 0 bytes .../getattr_static.cpython-312.pyc | Bin 4886 -> 0 bytes .../__pycache__/mixed.cpython-312.pyc | Bin 13738 -> 0 bytes .../__pycache__/value.cpython-312.pyc | Bin 32905 -> 0 bytes .../jedi/inference/compiled/access.py | 562 -- .../jedi/inference/compiled/getattr_static.py | 121 - .../jedi/inference/compiled/mixed.py | 309 - .../inference/compiled/subprocess/__init__.py | 512 - .../inference/compiled/subprocess/__main__.py | 40 - .../__pycache__/__init__.cpython-312.pyc | Bin 23959 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 2096 -> 0 bytes .../__pycache__/functions.cpython-312.pyc | Bin 10533 -> 0 bytes .../compiled/subprocess/functions.py | 257 - .../jedi/inference/compiled/value.py | 626 -- .../site-packages/jedi/inference/context.py | 499 - .../jedi/inference/docstring_utils.py | 21 - .../jedi/inference/docstrings.py | 286 - .../jedi/inference/dynamic_params.py | 224 - .../site-packages/jedi/inference/filters.py | 371 - .../site-packages/jedi/inference/finder.py | 146 - .../jedi/inference/flow_analysis.py | 125 - .../jedi/inference/gradual/__init__.py | 4 - .../__pycache__/__init__.cpython-312.pyc | Bin 343 -> 0 bytes .../__pycache__/annotation.cpython-312.pyc | Bin 18993 -> 0 bytes .../gradual/__pycache__/base.cpython-312.pyc | Bin 22698 -> 0 bytes .../__pycache__/conversion.cpython-312.pyc | Bin 8786 -> 0 bytes .../__pycache__/generics.cpython-312.pyc | Bin 7073 -> 0 bytes .../__pycache__/stub_value.cpython-312.pyc | Bin 5701 -> 0 bytes .../__pycache__/type_var.cpython-312.pyc | Bin 6775 -> 0 bytes .../__pycache__/typeshed.cpython-312.pyc | Bin 11648 -> 0 bytes .../__pycache__/typing.cpython-312.pyc | Bin 24379 -> 0 bytes .../gradual/__pycache__/utils.cpython-312.pyc | Bin 1410 -> 0 bytes .../jedi/inference/gradual/annotation.py | 474 - .../jedi/inference/gradual/base.py | 434 - .../jedi/inference/gradual/conversion.py | 209 - .../jedi/inference/gradual/generics.py | 101 - .../jedi/inference/gradual/stub_value.py | 102 - .../jedi/inference/gradual/type_var.py | 127 - .../jedi/inference/gradual/typeshed.py | 310 - .../jedi/inference/gradual/typing.py | 488 - .../jedi/inference/gradual/utils.py | 35 - .../site-packages/jedi/inference/helpers.py | 202 - .../site-packages/jedi/inference/imports.py | 592 -- .../jedi/inference/lazy_value.py | 61 - .../site-packages/jedi/inference/names.py | 677 -- .../site-packages/jedi/inference/param.py | 257 - .../jedi/inference/parser_cache.py | 6 - .../site-packages/jedi/inference/recursion.py | 153 - .../jedi/inference/references.py | 319 - .../site-packages/jedi/inference/signature.py | 152 - .../site-packages/jedi/inference/star_args.py | 220 - .../jedi/inference/syntax_tree.py | 903 -- .../site-packages/jedi/inference/sys_path.py | 272 - .../site-packages/jedi/inference/utils.py | 90 - .../jedi/inference/value/__init__.py | 9 - .../__pycache__/__init__.cpython-312.pyc | Bin 593 -> 0 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 2067 -> 0 bytes .../dynamic_arrays.cpython-312.pyc | Bin 10682 -> 0 bytes .../__pycache__/function.cpython-312.pyc | Bin 25988 -> 0 bytes .../__pycache__/instance.cpython-312.pyc | Bin 35312 -> 0 bytes .../__pycache__/iterable.cpython-312.pyc | Bin 36726 -> 0 bytes .../value/__pycache__/klass.cpython-312.pyc | Bin 18859 -> 0 bytes .../value/__pycache__/module.cpython-312.pyc | Bin 10847 -> 0 bytes .../__pycache__/namespace.cpython-312.pyc | Bin 4248 -> 0 bytes .../jedi/inference/value/decorator.py | 34 - .../jedi/inference/value/dynamic_arrays.py | 200 - .../jedi/inference/value/function.py | 461 - .../jedi/inference/value/instance.py | 610 -- .../jedi/inference/value/iterable.py | 647 -- .../jedi/inference/value/klass.py | 390 - .../jedi/inference/value/module.py | 230 - .../jedi/inference/value/namespace.py | 74 - .../site-packages/jedi/parser_utils.py | 345 - .../site-packages/jedi/plugins/__init__.py | 47 - .../__pycache__/__init__.cpython-312.pyc | Bin 2474 -> 0 bytes .../__pycache__/django.cpython-312.pyc | Bin 16678 -> 0 bytes .../plugins/__pycache__/flask.cpython-312.pyc | Bin 1120 -> 0 bytes .../__pycache__/pytest.cpython-312.pyc | Bin 13241 -> 0 bytes .../__pycache__/registry.cpython-312.pyc | Bin 526 -> 0 bytes .../__pycache__/stdlib.cpython-312.pyc | Bin 44014 -> 0 bytes .../site-packages/jedi/plugins/django.py | 296 - .../site-packages/jedi/plugins/flask.py | 21 - .../site-packages/jedi/plugins/pytest.py | 269 - .../site-packages/jedi/plugins/registry.py | 12 - .../site-packages/jedi/plugins/stdlib.py | 879 -- .../python3.12/site-packages/jedi/settings.py | 163 - .../jedi/third_party/django-stubs/LICENSE.txt | 8 - .../django-stubs/django-stubs/__init__.pyi | 12 - .../django-stubs/apps/__init__.pyi | 3 - .../django-stubs/django-stubs/apps/config.pyi | 23 - .../django-stubs/apps/registry.pyi | 40 - .../django-stubs/conf/__init__.pyi | 29 - .../django-stubs/conf/global_settings.pyi | 504 - .../django-stubs/conf/locale/__init__.pyi | 3 - .../django-stubs/conf/urls/__init__.pyi | 25 - .../django-stubs/conf/urls/i18n.pyi | 8 - .../django-stubs/conf/urls/static.pyi | 5 - .../django-stubs/contrib/__init__.pyi | 0 .../django-stubs/contrib/admin/__init__.pyi | 24 - .../django-stubs/contrib/admin/actions.pyi | 8 - .../django-stubs/contrib/admin/apps.pyi | 6 - .../django-stubs/contrib/admin/checks.pyi | 21 - .../django-stubs/contrib/admin/decorators.pyi | 5 - .../django-stubs/contrib/admin/filters.pyi | 110 - .../django-stubs/contrib/admin/forms.pyi | 7 - .../django-stubs/contrib/admin/helpers.pyi | 155 - .../django-stubs/contrib/admin/models.pyi | 39 - .../django-stubs/contrib/admin/options.pyi | 275 - .../django-stubs/contrib/admin/sites.pyi | 75 - .../contrib/admin/templatetags/__init__.pyi | 0 .../contrib/admin/templatetags/admin_list.pyi | 42 - .../admin/templatetags/admin_modify.pyi | 16 - .../admin/templatetags/admin_static.pyi | 5 - .../contrib/admin/templatetags/admin_urls.pyi | 17 - .../contrib/admin/templatetags/base.pyi | 17 - .../contrib/admin/templatetags/log.pyi | 16 - .../django-stubs/contrib/admin/tests.pyi | 23 - .../django-stubs/contrib/admin/utils.pyi | 68 - .../contrib/admin/views/__init__.pyi | 0 .../contrib/admin/views/autocomplete.pyi | 10 - .../contrib/admin/views/decorators.pyi | 7 - .../django-stubs/contrib/admin/views/main.pyi | 89 - .../django-stubs/contrib/admin/widgets.pyi | 102 - .../contrib/admindocs/__init__.pyi | 0 .../contrib/admindocs/middleware.pyi | 10 - .../django-stubs/contrib/admindocs/urls.pyi | 3 - .../django-stubs/contrib/admindocs/utils.pyi | 27 - .../django-stubs/contrib/admindocs/views.pyi | 21 - .../django-stubs/contrib/auth/__init__.pyi | 34 - .../django-stubs/contrib/auth/admin.pyi | 18 - .../django-stubs/contrib/auth/apps.pyi | 3 - .../django-stubs/contrib/auth/backends.pyi | 40 - .../django-stubs/contrib/auth/base_user.pyi | 44 - .../django-stubs/contrib/auth/checks.pyi | 8 - .../contrib/auth/context_processors.pyi | 20 - .../django-stubs/contrib/auth/decorators.pyi | 21 - .../django-stubs/contrib/auth/forms.pyi | 91 - .../contrib/auth/handlers/__init__.pyi | 0 .../contrib/auth/handlers/modwsgi.pyi | 6 - .../django-stubs/contrib/auth/hashers.pyi | 45 - .../contrib/auth/management/__init__.pyi | 15 - .../auth/management/commands/__init__.pyi | 0 .../management/commands/changepassword.pyi | 7 - .../management/commands/createsuperuser.pyi | 9 - .../django-stubs/contrib/auth/middleware.pyi | 20 - .../django-stubs/contrib/auth/mixins.pyi | 28 - .../django-stubs/contrib/auth/models.pyi | 117 - .../contrib/auth/password_validation.pyi | 46 - .../django-stubs/contrib/auth/signals.pyi | 5 - .../django-stubs/contrib/auth/tokens.pyi | 11 - .../django-stubs/contrib/auth/urls.pyi | 3 - .../django-stubs/contrib/auth/validators.pyi | 4 - .../django-stubs/contrib/auth/views.pyi | 72 - .../contrib/contenttypes/__init__.pyi | 0 .../contrib/contenttypes/admin.pyi | 14 - .../contrib/contenttypes/apps.pyi | 3 - .../contrib/contenttypes/checks.pyi | 6 - .../contrib/contenttypes/fields.pyi | 95 - .../contrib/contenttypes/forms.pyi | 41 - .../contenttypes/management/__init__.pyi | 33 - .../management/commands/__init__.pyi | 0 .../commands/remove_stale_contenttypes.pyi | 15 - .../contrib/contenttypes/models.pyi | 24 - .../contrib/contenttypes/views.pyi | 8 - .../contrib/flatpages/__init__.pyi | 0 .../django-stubs/contrib/flatpages/forms.pyi | 7 - .../contrib/flatpages/middleware.pyi | 6 - .../django-stubs/contrib/flatpages/models.pyi | 13 - .../contrib/flatpages/sitemaps.pyi | 3 - .../flatpages/templatetags/__init__.pyi | 0 .../flatpages/templatetags/flatpages.pyi | 16 - .../django-stubs/contrib/flatpages/urls.pyi | 3 - .../django-stubs/contrib/flatpages/views.pyi | 8 - .../django-stubs/contrib/gis/__init__.pyi | 0 .../django-stubs/contrib/gis/db/__init__.pyi | 0 .../contrib/gis/db/models/__init__.pyi | 13 - .../contrib/gis/db/models/fields.pyi | 91 - .../contrib/humanize/__init__.pyi | 0 .../humanize/templatetags/__init__.pyi | 0 .../humanize/templatetags/humanize.pyi | 14 - .../contrib/messages/__init__.pyi | 24 - .../django-stubs/contrib/messages/api.pyi | 26 - .../contrib/messages/constants.pyi | 11 - .../contrib/messages/context_processors.pyi | 6 - .../contrib/messages/middleware.pyi | 7 - .../contrib/messages/storage/__init__.pyi | 6 - .../contrib/messages/storage/base.pyi | 28 - .../contrib/messages/storage/cookie.pyi | 20 - .../contrib/messages/storage/fallback.pyi | 8 - .../contrib/messages/storage/session.pyi | 10 - .../django-stubs/contrib/messages/utils.pyi | 3 - .../django-stubs/contrib/messages/views.pyi | 9 - .../contrib/postgres/__init__.pyi | 0 .../contrib/postgres/aggregates/__init__.pyi | 24 - .../contrib/postgres/aggregates/general.pyi | 11 - .../contrib/postgres/aggregates/mixins.pyi | 1 - .../postgres/aggregates/statistics.pyi | 14 - .../contrib/postgres/constraints.pyi | 18 - .../contrib/postgres/fields/__init__.pyi | 20 - .../contrib/postgres/fields/array.pyi | 51 - .../contrib/postgres/fields/citext.pyi | 6 - .../contrib/postgres/fields/hstore.pyi | 17 - .../contrib/postgres/fields/jsonb.pyi | 32 - .../contrib/postgres/fields/mixins.pyi | 4 - .../contrib/postgres/fields/ranges.pyi | 48 - .../contrib/postgres/functions.pyi | 4 - .../django-stubs/contrib/postgres/indexes.pyi | 82 - .../django-stubs/contrib/postgres/lookups.pyi | 18 - .../contrib/postgres/operations.pyi | 27 - .../django-stubs/contrib/postgres/search.pyi | 63 - .../django-stubs/contrib/postgres/signals.pyi | 5 - .../contrib/postgres/validators.pyi | 17 - .../contrib/redirects/__init__.pyi | 0 .../contrib/redirects/middleware.pyi | 10 - .../django-stubs/contrib/redirects/models.pyi | 6 - .../contrib/sessions/__init__.pyi | 0 .../contrib/sessions/backends/__init__.pyi | 0 .../contrib/sessions/backends/base.pyi | 40 - .../contrib/sessions/backends/cache.pyi | 11 - .../contrib/sessions/backends/cached_db.pyi | 11 - .../contrib/sessions/backends/db.pyi | 13 - .../contrib/sessions/backends/file.pyi | 9 - .../sessions/backends/signed_cookies.pyi | 3 - .../contrib/sessions/base_session.pyi | 19 - .../contrib/sessions/exceptions.pyi | 4 - .../contrib/sessions/management/__init__.pyi | 0 .../sessions/management/commands/__init__.pyi | 0 .../management/commands/clearsessions.pyi | 3 - .../contrib/sessions/middleware.pyi | 11 - .../django-stubs/contrib/sessions/models.pyi | 4 - .../contrib/sessions/serializers.pyi | 10 - .../contrib/sitemaps/__init__.pyi | 50 - .../contrib/sitemaps/management/__init__.pyi | 0 .../sitemaps/management/commands/__init__.pyi | 0 .../management/commands/ping_google.pyi | 3 - .../django-stubs/contrib/sitemaps/views.pyi | 23 - .../django-stubs/contrib/sites/__init__.pyi | 0 .../django-stubs/contrib/sites/apps.pyi | 3 - .../django-stubs/contrib/sites/management.pyi | 13 - .../django-stubs/contrib/sites/managers.pyi | 6 - .../django-stubs/contrib/sites/middleware.pyi | 5 - .../django-stubs/contrib/sites/models.pyi | 21 - .../django-stubs/contrib/sites/requests.pyi | 10 - .../django-stubs/contrib/sites/shortcuts.pyi | 7 - .../contrib/staticfiles/__init__.pyi | 0 .../django-stubs/contrib/staticfiles/apps.pyi | 6 - .../contrib/staticfiles/checks.pyi | 7 - .../contrib/staticfiles/finders.pyi | 43 - .../contrib/staticfiles/handlers.pyi | 12 - .../staticfiles/management/__init__.pyi | 0 .../management/commands/__init__.pyi | 0 .../management/commands/collectstatic.pyi | 28 - .../management/commands/findstatic.pyi | 3 - .../management/commands/runserver.pyi | 3 - .../contrib/staticfiles/storage.pyi | 55 - .../staticfiles/templatetags/__init__.pyi | 0 .../staticfiles/templatetags/staticfiles.pyi | 9 - .../contrib/staticfiles/testing.pyi | 3 - .../django-stubs/contrib/staticfiles/urls.pyi | 7 - .../contrib/staticfiles/utils.pyi | 8 - .../contrib/staticfiles/views.pyi | 6 - .../contrib/syndication/__init__.pyi | 0 .../contrib/syndication/views.pyi | 27 - .../django-stubs/core/__init__.pyi | 0 .../django-stubs/core/cache/__init__.pyi | 24 - .../core/cache/backends/__init__.pyi | 0 .../django-stubs/core/cache/backends/base.pyi | 41 - .../django-stubs/core/cache/backends/db.pyi | 22 - .../core/cache/backends/dummy.pyi | 6 - .../core/cache/backends/filebased.pyi | 7 - .../core/cache/backends/locmem.pyi | 6 - .../core/cache/backends/memcached.pyi | 10 - .../django-stubs/core/cache/utils.pyi | 5 - .../django-stubs/core/checks/__init__.pyi | 17 - .../django-stubs/core/checks/caches.pyi | 9 - .../django-stubs/core/checks/database.pyi | 3 - .../django-stubs/core/checks/messages.pyi | 34 - .../django-stubs/core/checks/model_checks.pyi | 8 - .../django-stubs/core/checks/registry.pyi | 36 - .../core/checks/security/__init__.pyi | 0 .../core/checks/security/base.pyi | 33 - .../core/checks/security/csrf.pyi | 11 - .../core/checks/security/sessions.pyi | 20 - .../django-stubs/core/checks/templates.pyi | 11 - .../django-stubs/core/checks/translation.pyi | 7 - .../django-stubs/core/checks/urls.pyi | 13 - .../django-stubs/core/exceptions.pyi | 43 - .../django-stubs/core/files/__init__.pyi | 3 - .../django-stubs/core/files/base.pyi | 41 - .../django-stubs/core/files/images.pyi | 13 - .../django-stubs/core/files/locks.pyi | 15 - .../django-stubs/core/files/move.pyi | 3 - .../django-stubs/core/files/storage.pyi | 47 - .../django-stubs/core/files/temp.pyi | 5 - .../django-stubs/core/files/uploadedfile.pyi | 46 - .../django-stubs/core/files/uploadhandler.pyi | 86 - .../django-stubs/core/files/utils.pyi | 23 - .../django-stubs/core/handlers/__init__.pyi | 0 .../django-stubs/core/handlers/base.pyi | 13 - .../django-stubs/core/handlers/exception.pyi | 12 - .../django-stubs/core/handlers/wsgi.pyi | 35 - .../django-stubs/core/mail/__init__.pyi | 48 - .../core/mail/backends/__init__.pyi | 0 .../django-stubs/core/mail/backends/base.pyi | 16 - .../core/mail/backends/console.pyi | 3 - .../django-stubs/core/mail/backends/dummy.pyi | 3 - .../core/mail/backends/filebased.pyi | 3 - .../core/mail/backends/locmem.pyi | 3 - .../django-stubs/core/mail/backends/smtp.pyi | 18 - .../django-stubs/core/mail/message.pyi | 110 - .../django-stubs/core/mail/utils.pyi | 6 - .../django-stubs/core/management/__init__.pyi | 20 - .../django-stubs/core/management/base.pyi | 78 - .../django-stubs/core/management/color.pyi | 25 - .../core/management/commands/__init__.pyi | 0 .../core/management/commands/dumpdata.pyi | 4 - .../core/management/commands/loaddata.pyi | 19 - .../core/management/commands/makemessages.pyi | 38 - .../core/management/commands/runserver.pyi | 7 - .../core/management/commands/testserver.pyi | 3 - .../django-stubs/core/management/sql.pyi | 9 - .../core/management/templates.pyi | 17 - .../django-stubs/core/management/utils.pyi | 10 - .../django-stubs/core/paginator.pyi | 62 - .../core/serializers/__init__.pyi | 31 - .../django-stubs/core/serializers/base.pyi | 87 - .../django-stubs/core/serializers/json.pyi | 17 - .../django-stubs/core/serializers/python.pyi | 15 - .../django-stubs/core/servers/__init__.pyi | 0 .../django-stubs/core/servers/basehttp.pyi | 36 - .../django-stubs/core/signals.pyi | 6 - .../django-stubs/core/signing.pyi | 42 - .../django-stubs/core/validators.pyi | 121 - .../django-stubs/django-stubs/core/wsgi.pyi | 3 - .../django-stubs/django-stubs/db/__init__.pyi | 31 - .../django-stubs/db/backends/__init__.pyi | 0 .../db/backends/base/__init__.pyi | 0 .../django-stubs/db/backends/base/base.pyi | 102 - .../django-stubs/db/backends/base/client.pyi | 9 - .../db/backends/base/creation.pyi | 24 - .../db/backends/base/features.pyi | 100 - .../db/backends/base/introspection.pyi | 27 - .../db/backends/base/operations.pyi | 104 - .../django-stubs/db/backends/base/schema.pyi | 77 - .../db/backends/base/validation.pyi | 11 - .../db/backends/ddl_references.pyi | 66 - .../db/backends/dummy/__init__.pyi | 0 .../django-stubs/db/backends/dummy/base.pyi | 31 - .../db/backends/mysql/__init__.pyi | 0 .../django-stubs/db/backends/mysql/client.pyi | 11 - .../db/backends/postgresql/__init__.pyi | 0 .../db/backends/postgresql/base.pyi | 17 - .../db/backends/postgresql/client.pyi | 9 - .../db/backends/postgresql/creation.pyi | 3 - .../db/backends/postgresql/operations.pyi | 3 - .../django-stubs/db/backends/signals.pyi | 3 - .../db/backends/sqlite3/__init__.pyi | 0 .../django-stubs/db/backends/sqlite3/base.pyi | 14 - .../db/backends/sqlite3/creation.pyi | 3 - .../db/backends/sqlite3/features.pyi | 3 - .../db/backends/sqlite3/introspection.pyi | 13 - .../db/backends/sqlite3/operations.pyi | 3 - .../db/backends/sqlite3/schema.pyi | 3 - .../django-stubs/db/backends/utils.pyi | 47 - .../django-stubs/db/migrations/__init__.pyi | 6 - .../db/migrations/autodetector.pyi | 67 - .../django-stubs/db/migrations/exceptions.pyi | 20 - .../django-stubs/db/migrations/executor.pyi | 40 - .../django-stubs/db/migrations/graph.pyi | 54 - .../django-stubs/db/migrations/loader.pyi | 31 - .../django-stubs/db/migrations/migration.pyi | 28 - .../db/migrations/operations/__init__.pyi | 22 - .../db/migrations/operations/base.pyi | 17 - .../db/migrations/operations/fields.pyi | 32 - .../db/migrations/operations/models.pyi | 87 - .../db/migrations/operations/special.pyi | 43 - .../db/migrations/operations/utils.pyi | 5 - .../django-stubs/db/migrations/optimizer.pyi | 7 - .../django-stubs/db/migrations/questioner.pyi | 26 - .../django-stubs/db/migrations/recorder.pyi | 22 - .../django-stubs/db/migrations/serializer.pyi | 46 - .../django-stubs/db/migrations/state.pyi | 68 - .../db/migrations/topological_sort.pyi | 8 - .../django-stubs/db/migrations/utils.pyi | 10 - .../django-stubs/db/migrations/writer.pyi | 40 - .../django-stubs/db/models/__init__.pyi | 136 - .../django-stubs/db/models/aggregates.pyi | 17 - .../django-stubs/db/models/base.pyi | 60 - .../django-stubs/db/models/constraints.pyi | 27 - .../django-stubs/db/models/deletion.pyi | 30 - .../django-stubs/db/models/enums.pyi | 30 - .../django-stubs/db/models/expressions.pyi | 219 - .../db/models/fields/__init__.pyi | 409 - .../django-stubs/db/models/fields/files.pyi | 101 - .../django-stubs/db/models/fields/mixins.pyi | 12 - .../django-stubs/db/models/fields/proxy.pyi | 6 - .../django-stubs/db/models/fields/related.pyi | 243 - .../db/models/fields/related_descriptors.pyi | 70 - .../db/models/fields/related_lookups.pyi | 48 - .../db/models/fields/reverse_related.pyi | 110 - .../db/models/functions/__init__.pyi | 93 - .../db/models/functions/comparison.pyi | 12 - .../db/models/functions/datetime.pyi | 32 - .../django-stubs/db/models/functions/math.pyi | 26 - .../db/models/functions/mixins.pyi | 3 - .../django-stubs/db/models/functions/text.pyi | 65 - .../db/models/functions/window.pyi | 26 - .../django-stubs/db/models/indexes.pyi | 34 - .../django-stubs/db/models/lookups.pyi | 104 - .../django-stubs/db/models/manager.pyi | 45 - .../django-stubs/db/models/options.pyi | 123 - .../django-stubs/db/models/query.pyi | 213 - .../django-stubs/db/models/query_utils.pyi | 79 - .../django-stubs/db/models/signals.pyi | 34 - .../django-stubs/db/models/sql/__init__.pyi | 8 - .../django-stubs/db/models/sql/compiler.pyi | 109 - .../django-stubs/db/models/sql/constants.pyi | 14 - .../db/models/sql/datastructures.pyi | 49 - .../django-stubs/db/models/sql/query.pyi | 194 - .../django-stubs/db/models/sql/subqueries.pyi | 45 - .../django-stubs/db/models/sql/where.pyi | 46 - .../django-stubs/db/models/utils.pyi | 5 - .../django-stubs/db/transaction.pyi | 49 - .../django-stubs/django-stubs/db/utils.pyi | 35 - .../django-stubs/dispatch/__init__.pyi | 1 - .../django-stubs/dispatch/dispatcher.pyi | 23 - .../django-stubs/forms/__init__.pyi | 86 - .../django-stubs/forms/boundfield.pyi | 60 - .../django-stubs/forms/fields.pyi | 394 - .../django-stubs/django-stubs/forms/forms.pyi | 78 - .../django-stubs/forms/formsets.pyi | 89 - .../django-stubs/forms/models.pyi | 289 - .../django-stubs/forms/renderers.pyi | 26 - .../django-stubs/django-stubs/forms/utils.pyi | 33 - .../django-stubs/forms/widgets.pyi | 172 - .../django-stubs/http/__init__.pyi | 26 - .../django-stubs/django-stubs/http/cookie.pyi | 5 - .../django-stubs/http/multipartparser.pyi | 54 - .../django-stubs/http/request.pyi | 111 - .../django-stubs/http/response.pyi | 137 - .../django-stubs/middleware/__init__.pyi | 0 .../django-stubs/middleware/cache.pyi | 31 - .../django-stubs/middleware/clickjacking.pyi | 7 - .../django-stubs/middleware/common.pyi | 17 - .../django-stubs/middleware/csrf.pyi | 33 - .../django-stubs/middleware/gzip.pyi | 10 - .../django-stubs/middleware/http.pyi | 7 - .../django-stubs/middleware/locale.pyi | 10 - .../django-stubs/middleware/security.pyi | 17 - .../django-stubs/django-stubs/shortcuts.pyi | 54 - .../django-stubs/template/__init__.pyi | 16 - .../template/backends/__init__.pyi | 0 .../django-stubs/template/backends/base.pyi | 16 - .../django-stubs/template/backends/django.pyi | 16 - .../django-stubs/template/backends/dummy.pyi | 14 - .../django-stubs/template/backends/jinja2.pyi | 18 - .../django-stubs/template/backends/utils.pyi | 9 - .../django-stubs/template/base.pyi | 174 - .../django-stubs/template/context.pyi | 76 - .../template/context_processors.pyi | 13 - .../django-stubs/template/defaultfilters.pyi | 66 - .../django-stubs/template/defaulttags.pyi | 204 - .../django-stubs/template/engine.pyi | 53 - .../django-stubs/template/exceptions.pyi | 18 - .../django-stubs/template/library.pyi | 97 - .../django-stubs/template/loader.pyi | 14 - .../django-stubs/template/loader_tags.pyi | 68 - .../template/loaders/__init__.pyi | 0 .../template/loaders/app_directories.pyi | 3 - .../django-stubs/template/loaders/base.pyi | 12 - .../django-stubs/template/loaders/cached.pyi | 14 - .../template/loaders/filesystem.pyi | 12 - .../django-stubs/template/loaders/locmem.pyi | 11 - .../django-stubs/template/response.pyi | 68 - .../django-stubs/template/smartif.pyi | 43 - .../django-stubs/template/utils.pyi | 16 - .../django-stubs/templatetags/__init__.pyi | 0 .../django-stubs/templatetags/cache.pyi | 24 - .../django-stubs/templatetags/i18n.pyi | 83 - .../django-stubs/templatetags/l10n.pyi | 17 - .../django-stubs/templatetags/static.pyi | 33 - .../django-stubs/templatetags/tz.pyi | 33 - .../django-stubs/test/__init__.pyi | 20 - .../django-stubs/django-stubs/test/client.pyi | 132 - .../django-stubs/django-stubs/test/html.pyi | 38 - .../django-stubs/django-stubs/test/runner.pyi | 133 - .../django-stubs/test/selenium.pyi | 14 - .../django-stubs/test/signals.pyi | 21 - .../django-stubs/test/testcases.pyi | 229 - .../django-stubs/django-stubs/test/utils.pyi | 155 - .../django-stubs/urls/__init__.pyi | 36 - .../django-stubs/django-stubs/urls/base.pyi | 23 - .../django-stubs/django-stubs/urls/conf.pyi | 8 - .../django-stubs/urls/converters.pyi | 27 - .../django-stubs/urls/exceptions.pyi | 4 - .../django-stubs/urls/resolvers.pyi | 110 - .../django-stubs/django-stubs/urls/utils.pyi | 4 - .../django-stubs/utils/__init__.pyi | 0 .../django-stubs/django-stubs/utils/_os.pyi | 11 - .../django-stubs/utils/archive.pyi | 30 - .../django-stubs/utils/autoreload.pyi | 67 - .../django-stubs/utils/baseconv.pyi | 24 - .../django-stubs/django-stubs/utils/cache.pyi | 31 - .../django-stubs/utils/crypto.pyi | 15 - .../django-stubs/utils/datastructures.pyi | 75 - .../django-stubs/utils/dateformat.pyi | 63 - .../django-stubs/utils/dateparse.pyi | 14 - .../django-stubs/django-stubs/utils/dates.pyi | 8 - .../django-stubs/utils/datetime_safe.pyi | 10 - .../django-stubs/utils/deconstruct.pyi | 3 - .../django-stubs/utils/decorators.pyi | 20 - .../django-stubs/utils/deprecation.pyi | 35 - .../django-stubs/utils/duration.pyi | 5 - .../django-stubs/utils/encoding.pyi | 59 - .../django-stubs/utils/feedgenerator.pyi | 76 - .../django-stubs/utils/formats.pyi | 31 - .../django-stubs/utils/functional.pyi | 59 - .../django-stubs/utils/hashable.pyi | 3 - .../django-stubs/django-stubs/utils/html.pyi | 37 - .../django-stubs/django-stubs/utils/http.pyi | 37 - .../django-stubs/utils/inspect.pyi | 8 - .../django-stubs/django-stubs/utils/ipv6.pyi | 4 - .../django-stubs/utils/itercompat.pyi | 3 - .../django-stubs/django-stubs/utils/jslex.pyi | 26 - .../django-stubs/django-stubs/utils/log.pyi | 45 - .../django-stubs/utils/lorem_ipsum.pyi | 10 - .../django-stubs/utils/module_loading.pyi | 6 - .../django-stubs/utils/numberformat.pyi | 12 - .../django-stubs/utils/regex_helper.pyi | 16 - .../django-stubs/utils/safestring.pyi | 26 - .../django-stubs/django-stubs/utils/six.pyi | 106 - .../django-stubs/utils/termcolors.pyi | 18 - .../django-stubs/django-stubs/utils/text.pyi | 47 - .../django-stubs/utils/timesince.pyi | 10 - .../django-stubs/utils/timezone.pyi | 62 - .../django-stubs/utils/topological_sort.pyi | 6 - .../utils/translation/__init__.pyi | 72 - .../utils/translation/reloader.pyi | 7 - .../utils/translation/template.pyi | 14 - .../utils/translation/trans_null.pyi | 25 - .../utils/translation/trans_real.pyi | 42 - .../django-stubs/django-stubs/utils/tree.pyi | 21 - .../django-stubs/utils/version.pyi | 13 - .../django-stubs/utils/xmlutils.pyi | 11 - .../django-stubs/views/__init__.pyi | 1 - .../django-stubs/django-stubs/views/csrf.pyi | 7 - .../django-stubs/django-stubs/views/debug.pyi | 66 - .../views/decorators/__init__.pyi | 0 .../django-stubs/views/decorators/cache.pyi | 7 - .../views/decorators/clickjacking.pyi | 7 - .../django-stubs/views/decorators/csrf.pyi | 19 - .../django-stubs/views/decorators/debug.pyi | 4 - .../django-stubs/views/decorators/gzip.pyi | 5 - .../django-stubs/views/decorators/http.pyi | 12 - .../django-stubs/views/decorators/vary.pyi | 6 - .../django-stubs/views/defaults.pyi | 23 - .../django-stubs/views/generic/__init__.pyi | 15 - .../django-stubs/views/generic/base.pyi | 44 - .../django-stubs/views/generic/dates.pyi | 82 - .../django-stubs/views/generic/detail.pyi | 28 - .../django-stubs/views/generic/edit.pyi | 46 - .../django-stubs/views/generic/list.pyi | 37 - .../django-stubs/django-stubs/views/i18n.pyi | 31 - .../django-stubs/views/static.pyi | 12 - .../jedi/third_party/typeshed/LICENSE | 238 - .../typeshed/stdlib/2/BaseHTTPServer.pyi | 41 - .../typeshed/stdlib/2/CGIHTTPServer.pyi | 6 - .../typeshed/stdlib/2/ConfigParser.pyi | 97 - .../third_party/typeshed/stdlib/2/Cookie.pyi | 40 - .../typeshed/stdlib/2/HTMLParser.pyi | 28 - .../third_party/typeshed/stdlib/2/Queue.pyi | 29 - .../typeshed/stdlib/2/SimpleHTTPServer.pyi | 14 - .../typeshed/stdlib/2/SocketServer.pyi | 115 - .../typeshed/stdlib/2/StringIO.pyi | 28 - .../typeshed/stdlib/2/UserDict.pyi | 53 - .../typeshed/stdlib/2/UserList.pyi | 19 - .../typeshed/stdlib/2/UserString.pyi | 75 - .../typeshed/stdlib/2/__builtin__.pyi | 1195 --- .../third_party/typeshed/stdlib/2/_ast.pyi | 303 - .../typeshed/stdlib/2/_collections.pyi | 36 - .../typeshed/stdlib/2/_functools.pyi | 15 - .../typeshed/stdlib/2/_hotshot.pyi | 19 - .../third_party/typeshed/stdlib/2/_io.pyi | 184 - .../third_party/typeshed/stdlib/2/_json.pyi | 7 - .../third_party/typeshed/stdlib/2/_md5.pyi | 13 - .../third_party/typeshed/stdlib/2/_sha.pyi | 15 - .../third_party/typeshed/stdlib/2/_sha256.pyi | 23 - .../third_party/typeshed/stdlib/2/_sha512.pyi | 23 - .../third_party/typeshed/stdlib/2/_socket.pyi | 281 - .../third_party/typeshed/stdlib/2/_sre.pyi | 51 - .../third_party/typeshed/stdlib/2/_struct.pyi | 19 - .../typeshed/stdlib/2/_symtable.pyi | 37 - .../typeshed/stdlib/2/_threading_local.pyi | 11 - .../third_party/typeshed/stdlib/2/_winreg.pyi | 97 - .../third_party/typeshed/stdlib/2/abc.pyi | 31 - .../third_party/typeshed/stdlib/2/ast.pyi | 28 - .../third_party/typeshed/stdlib/2/atexit.pyi | 5 - .../typeshed/stdlib/2/builtins.pyi | 1195 --- .../third_party/typeshed/stdlib/2/cPickle.pyi | 26 - .../typeshed/stdlib/2/cStringIO.pyi | 48 - .../typeshed/stdlib/2/collections.pyi | 129 - .../typeshed/stdlib/2/commands.pyi | 10 - .../typeshed/stdlib/2/compileall.pyi | 16 - .../typeshed/stdlib/2/cookielib.pyi | 142 - .../typeshed/stdlib/2/copy_reg.pyi | 16 - .../typeshed/stdlib/2/dircache.pyi | 8 - .../typeshed/stdlib/2/distutils/__init__.pyi | 0 .../stdlib/2/distutils/archive_util.pyi | 12 - .../stdlib/2/distutils/bcppcompiler.pyi | 3 - .../typeshed/stdlib/2/distutils/ccompiler.pyi | 150 - .../typeshed/stdlib/2/distutils/cmd.pyi | 67 - .../stdlib/2/distutils/command/__init__.pyi | 0 .../stdlib/2/distutils/command/bdist.pyi | 0 .../stdlib/2/distutils/command/bdist_dumb.pyi | 0 .../stdlib/2/distutils/command/bdist_msi.pyi | 6 - .../2/distutils/command/bdist_packager.pyi | 0 .../stdlib/2/distutils/command/bdist_rpm.pyi | 0 .../2/distutils/command/bdist_wininst.pyi | 0 .../stdlib/2/distutils/command/build.pyi | 0 .../stdlib/2/distutils/command/build_clib.pyi | 0 .../stdlib/2/distutils/command/build_ext.pyi | 0 .../stdlib/2/distutils/command/build_py.pyi | 6 - .../2/distutils/command/build_scripts.pyi | 0 .../stdlib/2/distutils/command/check.pyi | 0 .../stdlib/2/distutils/command/clean.pyi | 0 .../stdlib/2/distutils/command/config.pyi | 87 - .../stdlib/2/distutils/command/install.pyi | 12 - .../2/distutils/command/install_data.pyi | 0 .../2/distutils/command/install_egg_info.pyi | 10 - .../2/distutils/command/install_headers.pyi | 0 .../2/distutils/command/install_lib.pyi | 0 .../2/distutils/command/install_scripts.pyi | 0 .../stdlib/2/distutils/command/register.pyi | 0 .../stdlib/2/distutils/command/sdist.pyi | 0 .../stdlib/2/distutils/command/upload.pyi | 8 - .../typeshed/stdlib/2/distutils/config.pyi | 17 - .../typeshed/stdlib/2/distutils/core.pyi | 48 - .../stdlib/2/distutils/cygwinccompiler.pyi | 4 - .../typeshed/stdlib/2/distutils/debug.pyi | 1 - .../typeshed/stdlib/2/distutils/dep_util.pyi | 5 - .../typeshed/stdlib/2/distutils/dir_util.pyi | 15 - .../typeshed/stdlib/2/distutils/dist.pyi | 9 - .../stdlib/2/distutils/emxccompiler.pyi | 3 - .../typeshed/stdlib/2/distutils/errors.pyi | 19 - .../typeshed/stdlib/2/distutils/extension.pyi | 21 - .../stdlib/2/distutils/fancy_getopt.pyi | 21 - .../typeshed/stdlib/2/distutils/file_util.pyi | 14 - .../typeshed/stdlib/2/distutils/filelist.pyi | 1 - .../typeshed/stdlib/2/distutils/log.pyi | 25 - .../stdlib/2/distutils/msvccompiler.pyi | 3 - .../typeshed/stdlib/2/distutils/spawn.pyi | 4 - .../typeshed/stdlib/2/distutils/sysconfig.pyi | 14 - .../typeshed/stdlib/2/distutils/text_file.pyi | 21 - .../stdlib/2/distutils/unixccompiler.pyi | 3 - .../typeshed/stdlib/2/distutils/util.pyi | 23 - .../typeshed/stdlib/2/distutils/version.pyi | 33 - .../typeshed/stdlib/2/dummy_thread.pyi | 21 - .../typeshed/stdlib/2/email/MIMEText.pyi | 4 - .../typeshed/stdlib/2/email/__init__.pyi | 6 - .../typeshed/stdlib/2/email/_parseaddr.pyi | 40 - .../typeshed/stdlib/2/email/base64mime.pyi | 11 - .../typeshed/stdlib/2/email/charset.pyi | 26 - .../typeshed/stdlib/2/email/encoders.pyi | 4 - .../typeshed/stdlib/2/email/feedparser.pyi | 17 - .../typeshed/stdlib/2/email/generator.pyi | 8 - .../typeshed/stdlib/2/email/header.pyi | 10 - .../typeshed/stdlib/2/email/iterators.pyi | 5 - .../typeshed/stdlib/2/email/message.pyi | 45 - .../typeshed/stdlib/2/email/mime/__init__.pyi | 0 .../stdlib/2/email/mime/application.pyi | 9 - .../typeshed/stdlib/2/email/mime/audio.pyi | 4 - .../typeshed/stdlib/2/email/mime/base.pyi | 4 - .../typeshed/stdlib/2/email/mime/image.pyi | 4 - .../typeshed/stdlib/2/email/mime/message.pyi | 4 - .../stdlib/2/email/mime/multipart.pyi | 4 - .../stdlib/2/email/mime/nonmultipart.pyi | 4 - .../typeshed/stdlib/2/email/mime/text.pyi | 4 - .../typeshed/stdlib/2/email/parser.pyi | 10 - .../typeshed/stdlib/2/email/quoprimime.pyi | 18 - .../typeshed/stdlib/2/email/utils.pyi | 21 - .../typeshed/stdlib/2/encodings/__init__.pyi | 7 - .../typeshed/stdlib/2/encodings/utf_8.pyi | 15 - .../typeshed/stdlib/2/exceptions.pyi | 50 - .../third_party/typeshed/stdlib/2/fcntl.pyi | 82 - .../third_party/typeshed/stdlib/2/fnmatch.pyi | 8 - .../typeshed/stdlib/2/functools.pyi | 30 - .../typeshed/stdlib/2/future_builtins.pyi | 10 - .../jedi/third_party/typeshed/stdlib/2/gc.pyi | 25 - .../third_party/typeshed/stdlib/2/getopt.pyi | 12 - .../third_party/typeshed/stdlib/2/getpass.pyi | 6 - .../third_party/typeshed/stdlib/2/gettext.pyi | 48 - .../third_party/typeshed/stdlib/2/glob.pyi | 7 - .../third_party/typeshed/stdlib/2/gzip.pyi | 38 - .../third_party/typeshed/stdlib/2/hashlib.pyi | 28 - .../third_party/typeshed/stdlib/2/heapq.pyi | 15 - .../typeshed/stdlib/2/htmlentitydefs.pyi | 5 - .../third_party/typeshed/stdlib/2/httplib.pyi | 218 - .../third_party/typeshed/stdlib/2/imp.pyi | 33 - .../typeshed/stdlib/2/importlib.pyi | 4 - .../third_party/typeshed/stdlib/2/inspect.pyi | 129 - .../jedi/third_party/typeshed/stdlib/2/io.pyi | 40 - .../typeshed/stdlib/2/itertools.pyi | 164 - .../third_party/typeshed/stdlib/2/json.pyi | 93 - .../typeshed/stdlib/2/markupbase.pyi | 8 - .../third_party/typeshed/stdlib/2/md5.pyi | 5 - .../typeshed/stdlib/2/mimetools.pyi | 27 - .../stdlib/2/multiprocessing/__init__.pyi | 50 - .../2/multiprocessing/dummy/__init__.pyi | 46 - .../2/multiprocessing/dummy/connection.pyi | 25 - .../stdlib/2/multiprocessing/pool.pyi | 52 - .../stdlib/2/multiprocessing/process.pyi | 37 - .../stdlib/2/multiprocessing/util.pyi | 29 - .../third_party/typeshed/stdlib/2/mutex.pyi | 12 - .../third_party/typeshed/stdlib/2/ntpath.pyi | 85 - .../typeshed/stdlib/2/nturl2path.pyi | 4 - .../typeshed/stdlib/2/os/__init__.pyi | 385 - .../third_party/typeshed/stdlib/2/os/path.pyi | 85 - .../typeshed/stdlib/2/os2emxpath.pyi | 85 - .../third_party/typeshed/stdlib/2/pipes.pyi | 13 - .../typeshed/stdlib/2/platform.pyi | 41 - .../third_party/typeshed/stdlib/2/popen2.pyi | 27 - .../third_party/typeshed/stdlib/2/posix.pyi | 201 - .../typeshed/stdlib/2/posixpath.pyi | 85 - .../third_party/typeshed/stdlib/2/random.pyi | 67 - .../jedi/third_party/typeshed/stdlib/2/re.pyi | 108 - .../third_party/typeshed/stdlib/2/repr.pyi | 34 - .../typeshed/stdlib/2/resource.pyi | 46 - .../third_party/typeshed/stdlib/2/rfc822.pyi | 75 - .../typeshed/stdlib/2/robotparser.pyi | 7 - .../third_party/typeshed/stdlib/2/runpy.pyi | 17 - .../third_party/typeshed/stdlib/2/sets.pyi | 60 - .../third_party/typeshed/stdlib/2/sha.pyi | 10 - .../third_party/typeshed/stdlib/2/shelve.pyi | 36 - .../third_party/typeshed/stdlib/2/shlex.pyi | 30 - .../third_party/typeshed/stdlib/2/signal.pyi | 68 - .../third_party/typeshed/stdlib/2/smtplib.pyi | 86 - .../third_party/typeshed/stdlib/2/spwd.pyi | 15 - .../typeshed/stdlib/2/sre_constants.pyi | 93 - .../typeshed/stdlib/2/sre_parse.pyi | 62 - .../third_party/typeshed/stdlib/2/stat.pyi | 58 - .../third_party/typeshed/stdlib/2/string.pyi | 68 - .../typeshed/stdlib/2/stringold.pyi | 44 - .../third_party/typeshed/stdlib/2/strop.pyi | 27 - .../typeshed/stdlib/2/subprocess.pyi | 115 - .../third_party/typeshed/stdlib/2/symbol.pyi | 89 - .../third_party/typeshed/stdlib/2/sys.pyi | 130 - .../typeshed/stdlib/2/tempfile.pyi | 102 - .../typeshed/stdlib/2/textwrap.pyi | 61 - .../third_party/typeshed/stdlib/2/thread.pyi | 27 - .../third_party/typeshed/stdlib/2/toaiff.pyi | 11 - .../typeshed/stdlib/2/tokenize.pyi | 133 - .../third_party/typeshed/stdlib/2/types.pyi | 195 - .../third_party/typeshed/stdlib/2/typing.pyi | 495 - .../typeshed/stdlib/2/unittest.pyi | 280 - .../third_party/typeshed/stdlib/2/urllib.pyi | 133 - .../third_party/typeshed/stdlib/2/urllib2.pyi | 186 - .../typeshed/stdlib/2/urlparse.pyi | 61 - .../third_party/typeshed/stdlib/2/user.pyi | 6 - .../third_party/typeshed/stdlib/2/whichdb.pyi | 3 - .../typeshed/stdlib/2/xmlrpclib.pyi | 248 - .../typeshed/stdlib/2and3/__future__.pyi | 25 - .../typeshed/stdlib/2and3/_bisect.pyi | 8 - .../typeshed/stdlib/2and3/_codecs.pyi | 82 - .../typeshed/stdlib/2and3/_csv.pyi | 51 - .../typeshed/stdlib/2and3/_curses.pyi | 490 - .../stdlib/2and3/_dummy_threading.pyi | 187 - .../typeshed/stdlib/2and3/_heapq.pyi | 14 - .../typeshed/stdlib/2and3/_msi.pyi | 49 - .../typeshed/stdlib/2and3/_random.pyi | 15 - .../stdlib/2and3/_typeshed/__init__.pyi | 183 - .../typeshed/stdlib/2and3/_typeshed/wsgi.pyi | 35 - .../typeshed/stdlib/2and3/_typeshed/xml.pyi | 10 - .../typeshed/stdlib/2and3/_warnings.pyi | 67 - .../typeshed/stdlib/2and3/_weakref.pyi | 34 - .../typeshed/stdlib/2and3/_weakrefset.pyi | 47 - .../typeshed/stdlib/2and3/aifc.pyi | 88 - .../typeshed/stdlib/2and3/antigravity.pyi | 4 - .../typeshed/stdlib/2and3/argparse.pyi | 487 - .../typeshed/stdlib/2and3/array.pyi | 77 - .../typeshed/stdlib/2and3/asynchat.pyi | 39 - .../typeshed/stdlib/2and3/asyncore.pyi | 119 - .../typeshed/stdlib/2and3/audioop.pyi | 42 - .../typeshed/stdlib/2and3/base64.pyi | 37 - .../third_party/typeshed/stdlib/2and3/bdb.pyi | 98 - .../typeshed/stdlib/2and3/binascii.pyi | 50 - .../typeshed/stdlib/2and3/binhex.pyi | 42 - .../typeshed/stdlib/2and3/bisect.pyi | 4 - .../third_party/typeshed/stdlib/2and3/bz2.pyi | 70 - .../typeshed/stdlib/2and3/cProfile.pyi | 28 - .../typeshed/stdlib/2and3/calendar.pyi | 123 - .../third_party/typeshed/stdlib/2and3/cgi.pyi | 162 - .../typeshed/stdlib/2and3/cgitb.pyi | 33 - .../typeshed/stdlib/2and3/chunk.pyi | 20 - .../typeshed/stdlib/2and3/cmath.pyi | 42 - .../third_party/typeshed/stdlib/2and3/cmd.pyi | 39 - .../typeshed/stdlib/2and3/code.pyi | 36 - .../typeshed/stdlib/2and3/codecs.pyi | 301 - .../typeshed/stdlib/2and3/codeop.pyi | 14 - .../typeshed/stdlib/2and3/colorsys.pyi | 13 - .../typeshed/stdlib/2and3/contextlib.pyi | 102 - .../typeshed/stdlib/2and3/copy.pyi | 14 - .../typeshed/stdlib/2and3/crypt.pyi | 22 - .../third_party/typeshed/stdlib/2and3/csv.pyi | 101 - .../typeshed/stdlib/2and3/ctypes/__init__.pyi | 309 - .../typeshed/stdlib/2and3/ctypes/util.pyi | 7 - .../typeshed/stdlib/2and3/ctypes/wintypes.pyi | 234 - .../typeshed/stdlib/2and3/curses/__init__.pyi | 15 - .../typeshed/stdlib/2and3/curses/ascii.pyi | 62 - .../typeshed/stdlib/2and3/curses/panel.pyi | 20 - .../typeshed/stdlib/2and3/curses/textpad.pyi | 11 - .../typeshed/stdlib/2and3/datetime.pyi | 373 - .../typeshed/stdlib/2and3/decimal.pyi | 339 - .../typeshed/stdlib/2and3/difflib.pyi | 153 - .../third_party/typeshed/stdlib/2and3/dis.pyi | 83 - .../typeshed/stdlib/2and3/doctest.pyi | 224 - .../typeshed/stdlib/2and3/dummy_threading.pyi | 2 - .../stdlib/2and3/ensurepip/__init__.pyi | 25 - .../typeshed/stdlib/2and3/errno.pyi | 137 - .../typeshed/stdlib/2and3/filecmp.pyi | 73 - .../typeshed/stdlib/2and3/fileinput.pyi | 78 - .../typeshed/stdlib/2and3/formatter.pyi | 103 - .../typeshed/stdlib/2and3/fractions.pyi | 159 - .../typeshed/stdlib/2and3/ftplib.pyi | 165 - .../typeshed/stdlib/2and3/genericpath.pyi | 27 - .../third_party/typeshed/stdlib/2and3/grp.pyi | 11 - .../typeshed/stdlib/2and3/hmac.pyi | 44 - .../typeshed/stdlib/2and3/imaplib.pyi | 172 - .../typeshed/stdlib/2and3/imghdr.pyi | 20 - .../typeshed/stdlib/2and3/keyword.pyi | 10 - .../stdlib/2and3/lib2to3/__init__.pyi | 0 .../stdlib/2and3/lib2to3/pgen2/__init__.pyi | 0 .../stdlib/2and3/lib2to3/pgen2/driver.pyi | 20 - .../stdlib/2and3/lib2to3/pgen2/grammar.pyi | 26 - .../stdlib/2and3/lib2to3/pgen2/literals.pyi | 7 - .../stdlib/2and3/lib2to3/pgen2/parse.pyi | 26 - .../stdlib/2and3/lib2to3/pgen2/pgen.pyi | 46 - .../stdlib/2and3/lib2to3/pgen2/token.pyi | 71 - .../stdlib/2and3/lib2to3/pgen2/tokenize.pyi | 23 - .../typeshed/stdlib/2and3/lib2to3/pygram.pyi | 113 - .../typeshed/stdlib/2and3/lib2to3/pytree.pyi | 97 - .../typeshed/stdlib/2and3/linecache.pyi | 13 - .../typeshed/stdlib/2and3/locale.pyi | 111 - .../stdlib/2and3/logging/__init__.pyi | 918 -- .../typeshed/stdlib/2and3/logging/config.pyi | 32 - .../stdlib/2and3/logging/handlers.pyi | 258 - .../typeshed/stdlib/2and3/macpath.pyi | 132 - .../typeshed/stdlib/2and3/mailbox.pyi | 207 - .../typeshed/stdlib/2and3/mailcap.pyi | 8 - .../typeshed/stdlib/2and3/marshal.pyi | 8 - .../typeshed/stdlib/2and3/math.pyi | 121 - .../typeshed/stdlib/2and3/mimetypes.pyi | 36 - .../typeshed/stdlib/2and3/mmap.pyi | 107 - .../typeshed/stdlib/2and3/modulefinder.pyi | 76 - .../typeshed/stdlib/2and3/msilib/__init__.pyi | 196 - .../typeshed/stdlib/2and3/msilib/schema.pyi | 97 - .../typeshed/stdlib/2and3/msilib/sequence.pyi | 14 - .../typeshed/stdlib/2and3/msilib/text.pyi | 9 - .../typeshed/stdlib/2and3/msvcrt.pyi | 24 - .../typeshed/stdlib/2and3/netrc.pyi | 15 - .../third_party/typeshed/stdlib/2and3/nis.pyi | 9 - .../typeshed/stdlib/2and3/numbers.pyi | 140 - .../typeshed/stdlib/2and3/opcode.pyi | 25 - .../typeshed/stdlib/2and3/operator.pyi | 206 - .../typeshed/stdlib/2and3/optparse.pyi | 232 - .../typeshed/stdlib/2and3/parser.pyi | 22 - .../third_party/typeshed/stdlib/2and3/pdb.pyi | 250 - .../typeshed/stdlib/2and3/pickle.pyi | 186 - .../typeshed/stdlib/2and3/pickletools.pyi | 179 - .../typeshed/stdlib/2and3/pkgutil.pyi | 38 - .../typeshed/stdlib/2and3/plistlib.pyi | 72 - .../typeshed/stdlib/2and3/poplib.pyi | 73 - .../typeshed/stdlib/2and3/pprint.pyi | 97 - .../typeshed/stdlib/2and3/profile.pyi | 25 - .../typeshed/stdlib/2and3/pstats.pyi | 52 - .../third_party/typeshed/stdlib/2and3/pty.pyi | 21 - .../third_party/typeshed/stdlib/2and3/pwd.pyi | 14 - .../typeshed/stdlib/2and3/py_compile.pyi | 52 - .../typeshed/stdlib/2and3/pyclbr.pyi | 37 - .../typeshed/stdlib/2and3/pydoc.pyi | 273 - .../stdlib/2and3/pydoc_data/__init__.pyi | 0 .../stdlib/2and3/pydoc_data/topics.pyi | 3 - .../stdlib/2and3/pyexpat/__init__.pyi | 79 - .../typeshed/stdlib/2and3/pyexpat/errors.pyi | 44 - .../typeshed/stdlib/2and3/pyexpat/model.pyi | 11 - .../typeshed/stdlib/2and3/quopri.pyi | 6 - .../typeshed/stdlib/2and3/readline.pyi | 39 - .../typeshed/stdlib/2and3/rlcompleter.pyi | 11 - .../typeshed/stdlib/2and3/sched.pyi | 39 - .../typeshed/stdlib/2and3/select.pyi | 152 - .../typeshed/stdlib/2and3/shutil.pyi | 166 - .../typeshed/stdlib/2and3/site.pyi | 15 - .../typeshed/stdlib/2and3/smtpd.pyi | 86 - .../typeshed/stdlib/2and3/sndhdr.pyi | 17 - .../typeshed/stdlib/2and3/socket.pyi | 803 -- .../stdlib/2and3/sqlite3/__init__.pyi | 1 - .../typeshed/stdlib/2and3/sqlite3/dbapi2.pyi | 300 - .../typeshed/stdlib/2and3/sre_compile.pyi | 31 - .../third_party/typeshed/stdlib/2and3/ssl.pyi | 429 - .../typeshed/stdlib/2and3/stringprep.pyi | 21 - .../typeshed/stdlib/2and3/struct.pyi | 38 - .../typeshed/stdlib/2and3/sunau.pyi | 86 - .../typeshed/stdlib/2and3/symtable.pyi | 45 - .../typeshed/stdlib/2and3/sysconfig.pyi | 17 - .../typeshed/stdlib/2and3/syslog.pyi | 43 - .../typeshed/stdlib/2and3/tabnanny.pyi | 14 - .../typeshed/stdlib/2and3/tarfile.pyi | 246 - .../typeshed/stdlib/2and3/telnetlib.pyi | 114 - .../typeshed/stdlib/2and3/termios.pyi | 246 - .../typeshed/stdlib/2and3/this.pyi | 4 - .../typeshed/stdlib/2and3/threading.pyi | 187 - .../typeshed/stdlib/2and3/time.pyi | 116 - .../typeshed/stdlib/2and3/timeit.pyi | 42 - .../typeshed/stdlib/2and3/token.pyi | 85 - .../typeshed/stdlib/2and3/trace.pyi | 43 - .../typeshed/stdlib/2and3/traceback.pyi | 140 - .../third_party/typeshed/stdlib/2and3/tty.pyi | 15 - .../typeshed/stdlib/2and3/turtle.pyi | 558 -- .../typeshed/stdlib/2and3/unicodedata.pyi | 42 - .../third_party/typeshed/stdlib/2and3/uu.pyi | 16 - .../typeshed/stdlib/2and3/uuid.pyi | 111 - .../typeshed/stdlib/2and3/warnings.pyi | 73 - .../typeshed/stdlib/2and3/wave.pyi | 73 - .../typeshed/stdlib/2and3/weakref.pyi | 119 - .../typeshed/stdlib/2and3/webbrowser.pyi | 105 - .../typeshed/stdlib/2and3/winsound.pyi | 27 - .../stdlib/2and3/wsgiref/__init__.pyi | 0 .../stdlib/2and3/wsgiref/handlers.pyi | 93 - .../typeshed/stdlib/2and3/wsgiref/headers.pyi | 31 - .../stdlib/2and3/wsgiref/simple_server.pyi | 41 - .../typeshed/stdlib/2and3/wsgiref/types.pyi | 3 - .../typeshed/stdlib/2and3/wsgiref/util.pyi | 23 - .../stdlib/2and3/wsgiref/validate.pyi | 52 - .../typeshed/stdlib/2and3/xdrlib.pyi | 55 - .../typeshed/stdlib/2and3/xml/__init__.pyi | 1 - .../stdlib/2and3/xml/dom/NodeFilter.pyi | 19 - .../stdlib/2and3/xml/dom/__init__.pyi | 68 - .../typeshed/stdlib/2and3/xml/dom/domreg.pyi | 10 - .../stdlib/2and3/xml/dom/expatbuilder.pyi | 3 - .../stdlib/2and3/xml/dom/minicompat.pyi | 3 - .../typeshed/stdlib/2and3/xml/dom/minidom.pyi | 6 - .../typeshed/stdlib/2and3/xml/dom/pulldom.pyi | 3 - .../stdlib/2and3/xml/dom/xmlbuilder.pyi | 3 - .../stdlib/2and3/xml/etree/ElementInclude.pyi | 25 - .../stdlib/2and3/xml/etree/ElementPath.pyi | 33 - .../stdlib/2and3/xml/etree/ElementTree.pyi | 376 - .../stdlib/2and3/xml/etree/__init__.pyi | 0 .../stdlib/2and3/xml/etree/cElementTree.pyi | 1 - .../stdlib/2and3/xml/parsers/__init__.pyi | 1 - .../2and3/xml/parsers/expat/__init__.pyi | 1 - .../stdlib/2and3/xml/parsers/expat/errors.pyi | 1 - .../stdlib/2and3/xml/parsers/expat/model.pyi | 1 - .../stdlib/2and3/xml/sax/__init__.pyi | 33 - .../typeshed/stdlib/2and3/xml/sax/handler.pyi | 46 - .../stdlib/2and3/xml/sax/saxutils.pyi | 68 - .../stdlib/2and3/xml/sax/xmlreader.pyi | 73 - .../typeshed/stdlib/2and3/zipfile.pyi | 220 - .../typeshed/stdlib/2and3/zipimport.pyi | 30 - .../typeshed/stdlib/2and3/zlib.pyi | 59 - .../typeshed/stdlib/3.7/_py_abc.pyi | 10 - .../typeshed/stdlib/3.7/contextvars.pyi | 42 - .../typeshed/stdlib/3.7/dataclasses.pyi | 95 - .../typeshed/stdlib/3.9/graphlib.pyi | 16 - .../typeshed/stdlib/3.9/zoneinfo/__init__.pyi | 32 - .../third_party/typeshed/stdlib/3/_ast.pyi | 376 - .../typeshed/stdlib/3/_bootlocale.pyi | 1 - .../typeshed/stdlib/3/_compat_pickle.pyi | 10 - .../typeshed/stdlib/3/_compression.pyi | 23 - .../typeshed/stdlib/3/_decimal.pyi | 1 - .../typeshed/stdlib/3/_dummy_thread.pyi | 21 - .../third_party/typeshed/stdlib/3/_imp.pyi | 17 - .../stdlib/3/_importlib_modulespec.pyi | 50 - .../third_party/typeshed/stdlib/3/_json.pyi | 38 - .../typeshed/stdlib/3/_markupbase.pyi | 8 - .../typeshed/stdlib/3/_operator.pyi | 60 - .../typeshed/stdlib/3/_osx_support.pyi | 33 - .../typeshed/stdlib/3/_posixsubprocess.pyi | 24 - .../typeshed/stdlib/3/_pydecimal.pyi | 3 - .../typeshed/stdlib/3/_sitebuiltins.pyi | 16 - .../third_party/typeshed/stdlib/3/_stat.pyi | 65 - .../third_party/typeshed/stdlib/3/_thread.pyi | 41 - .../typeshed/stdlib/3/_threading_local.pyi | 16 - .../typeshed/stdlib/3/_tkinter.pyi | 93 - .../typeshed/stdlib/3/_tracemalloc.pyi | 17 - .../third_party/typeshed/stdlib/3/_winapi.pyi | 134 - .../third_party/typeshed/stdlib/3/abc.pyi | 20 - .../third_party/typeshed/stdlib/3/ast.pyi | 207 - .../typeshed/stdlib/3/asyncio/__init__.pyi | 116 - .../typeshed/stdlib/3/asyncio/base_events.pyi | 354 - .../stdlib/3/asyncio/base_futures.pyi | 22 - .../stdlib/3/asyncio/base_subprocess.pyi | 72 - .../typeshed/stdlib/3/asyncio/base_tasks.pyi | 9 - .../typeshed/stdlib/3/asyncio/compat.pyi | 8 - .../typeshed/stdlib/3/asyncio/constants.pyi | 14 - .../typeshed/stdlib/3/asyncio/coroutines.pyi | 7 - .../typeshed/stdlib/3/asyncio/events.pyi | 502 - .../typeshed/stdlib/3/asyncio/exceptions.pyi | 15 - .../stdlib/3/asyncio/format_helpers.pyi | 20 - .../typeshed/stdlib/3/asyncio/futures.pyi | 65 - .../typeshed/stdlib/3/asyncio/locks.pyi | 68 - .../typeshed/stdlib/3/asyncio/log.pyi | 3 - .../stdlib/3/asyncio/proactor_events.pyi | 73 - .../typeshed/stdlib/3/asyncio/protocols.pyi | 27 - .../typeshed/stdlib/3/asyncio/queues.pyi | 36 - .../typeshed/stdlib/3/asyncio/runners.pyi | 10 - .../stdlib/3/asyncio/selector_events.pyi | 7 - .../typeshed/stdlib/3/asyncio/sslproto.pyi | 133 - .../typeshed/stdlib/3/asyncio/staggered.pyi | 12 - .../typeshed/stdlib/3/asyncio/streams.pyi | 104 - .../typeshed/stdlib/3/asyncio/subprocess.pyi | 60 - .../typeshed/stdlib/3/asyncio/tasks.pyi | 204 - .../typeshed/stdlib/3/asyncio/threads.pyi | 7 - .../typeshed/stdlib/3/asyncio/transports.pyi | 46 - .../typeshed/stdlib/3/asyncio/trsock.pyi | 86 - .../typeshed/stdlib/3/asyncio/unix_events.pyi | 57 - .../stdlib/3/asyncio/windows_events.pyi | 76 - .../stdlib/3/asyncio/windows_utils.pyi | 26 - .../third_party/typeshed/stdlib/3/atexit.pyi | 7 - .../typeshed/stdlib/3/builtins.pyi | 1387 --- .../stdlib/3/collections/__init__.pyi | 327 - .../typeshed/stdlib/3/collections/abc.pyi | 27 - .../typeshed/stdlib/3/compileall.pyi | 108 - .../typeshed/stdlib/3/concurrent/__init__.pyi | 0 .../stdlib/3/concurrent/futures/__init__.pyi | 20 - .../stdlib/3/concurrent/futures/_base.pyi | 133 - .../stdlib/3/concurrent/futures/process.pyi | 28 - .../stdlib/3/concurrent/futures/thread.pyi | 42 - .../typeshed/stdlib/3/configparser.pyi | 252 - .../third_party/typeshed/stdlib/3/copyreg.pyi | 16 - .../typeshed/stdlib/3/dbm/__init__.pyi | 24 - .../typeshed/stdlib/3/dbm/dumb.pyi | 25 - .../third_party/typeshed/stdlib/3/dbm/gnu.pyi | 35 - .../typeshed/stdlib/3/dbm/ndbm.pyi | 34 - .../typeshed/stdlib/3/distutils/__init__.pyi | 0 .../stdlib/3/distutils/archive_util.pyi | 12 - .../stdlib/3/distutils/bcppcompiler.pyi | 3 - .../typeshed/stdlib/3/distutils/ccompiler.pyi | 150 - .../typeshed/stdlib/3/distutils/cmd.pyi | 67 - .../stdlib/3/distutils/command/__init__.pyi | 0 .../stdlib/3/distutils/command/bdist.pyi | 0 .../stdlib/3/distutils/command/bdist_dumb.pyi | 0 .../stdlib/3/distutils/command/bdist_msi.pyi | 6 - .../3/distutils/command/bdist_packager.pyi | 0 .../stdlib/3/distutils/command/bdist_rpm.pyi | 0 .../3/distutils/command/bdist_wininst.pyi | 0 .../stdlib/3/distutils/command/build.pyi | 0 .../stdlib/3/distutils/command/build_clib.pyi | 0 .../stdlib/3/distutils/command/build_ext.pyi | 0 .../stdlib/3/distutils/command/build_py.pyi | 8 - .../3/distutils/command/build_scripts.pyi | 0 .../stdlib/3/distutils/command/check.pyi | 0 .../stdlib/3/distutils/command/clean.pyi | 0 .../stdlib/3/distutils/command/config.pyi | 87 - .../stdlib/3/distutils/command/install.pyi | 14 - .../3/distutils/command/install_data.pyi | 0 .../3/distutils/command/install_egg_info.pyi | 10 - .../3/distutils/command/install_headers.pyi | 0 .../3/distutils/command/install_lib.pyi | 0 .../3/distutils/command/install_scripts.pyi | 0 .../stdlib/3/distutils/command/register.pyi | 0 .../stdlib/3/distutils/command/sdist.pyi | 0 .../stdlib/3/distutils/command/upload.pyi | 8 - .../typeshed/stdlib/3/distutils/config.pyi | 17 - .../typeshed/stdlib/3/distutils/core.pyi | 48 - .../stdlib/3/distutils/cygwinccompiler.pyi | 4 - .../typeshed/stdlib/3/distutils/debug.pyi | 1 - .../typeshed/stdlib/3/distutils/dep_util.pyi | 5 - .../typeshed/stdlib/3/distutils/dir_util.pyi | 15 - .../typeshed/stdlib/3/distutils/dist.pyi | 58 - .../typeshed/stdlib/3/distutils/errors.pyi | 19 - .../typeshed/stdlib/3/distutils/extension.pyi | 22 - .../stdlib/3/distutils/fancy_getopt.pyi | 21 - .../typeshed/stdlib/3/distutils/file_util.pyi | 14 - .../typeshed/stdlib/3/distutils/filelist.pyi | 1 - .../typeshed/stdlib/3/distutils/log.pyi | 25 - .../stdlib/3/distutils/msvccompiler.pyi | 3 - .../typeshed/stdlib/3/distutils/spawn.pyi | 4 - .../typeshed/stdlib/3/distutils/sysconfig.pyi | 14 - .../typeshed/stdlib/3/distutils/text_file.pyi | 21 - .../stdlib/3/distutils/unixccompiler.pyi | 3 - .../typeshed/stdlib/3/distutils/util.pyi | 23 - .../typeshed/stdlib/3/distutils/version.pyi | 38 - .../typeshed/stdlib/3/email/__init__.pyi | 23 - .../typeshed/stdlib/3/email/charset.pyi | 28 - .../stdlib/3/email/contentmanager.pyi | 11 - .../typeshed/stdlib/3/email/encoders.pyi | 6 - .../typeshed/stdlib/3/email/errors.pyi | 17 - .../typeshed/stdlib/3/email/feedparser.pyi | 21 - .../typeshed/stdlib/3/email/generator.pyi | 18 - .../typeshed/stdlib/3/email/header.pyi | 26 - .../stdlib/3/email/headerregistry.pyi | 90 - .../typeshed/stdlib/3/email/iterators.pyi | 5 - .../typeshed/stdlib/3/email/message.pyi | 87 - .../typeshed/stdlib/3/email/mime/__init__.pyi | 0 .../stdlib/3/email/mime/application.pyi | 16 - .../typeshed/stdlib/3/email/mime/audio.pyi | 16 - .../typeshed/stdlib/3/email/mime/base.pyi | 8 - .../typeshed/stdlib/3/email/mime/image.pyi | 16 - .../typeshed/stdlib/3/email/mime/message.pyi | 7 - .../stdlib/3/email/mime/multipart.pyi | 17 - .../stdlib/3/email/mime/nonmultipart.pyi | 3 - .../typeshed/stdlib/3/email/mime/text.pyi | 8 - .../typeshed/stdlib/3/email/parser.pyi | 27 - .../typeshed/stdlib/3/email/policy.pyi | 54 - .../typeshed/stdlib/3/email/utils.pyi | 40 - .../typeshed/stdlib/3/encodings/__init__.pyi | 7 - .../typeshed/stdlib/3/encodings/utf_8.pyi | 15 - .../third_party/typeshed/stdlib/3/enum.pyi | 73 - .../typeshed/stdlib/3/faulthandler.pyi | 13 - .../third_party/typeshed/stdlib/3/fcntl.pyi | 99 - .../third_party/typeshed/stdlib/3/fnmatch.pyi | 6 - .../typeshed/stdlib/3/functools.pyi | 123 - .../jedi/third_party/typeshed/stdlib/3/gc.pyi | 40 - .../third_party/typeshed/stdlib/3/getopt.pyi | 10 - .../third_party/typeshed/stdlib/3/getpass.pyi | 6 - .../third_party/typeshed/stdlib/3/gettext.pyi | 80 - .../third_party/typeshed/stdlib/3/glob.pyi | 8 - .../third_party/typeshed/stdlib/3/gzip.pyi | 94 - .../third_party/typeshed/stdlib/3/hashlib.pyi | 123 - .../third_party/typeshed/stdlib/3/heapq.pyi | 14 - .../typeshed/stdlib/3/html/__init__.pyi | 4 - .../typeshed/stdlib/3/html/entities.pyi | 6 - .../typeshed/stdlib/3/html/parser.pyi | 20 - .../typeshed/stdlib/3/http/__init__.pyi | 74 - .../typeshed/stdlib/3/http/client.pyi | 211 - .../typeshed/stdlib/3/http/cookiejar.pyi | 129 - .../typeshed/stdlib/3/http/cookies.pyi | 31 - .../typeshed/stdlib/3/http/server.pyi | 72 - .../third_party/typeshed/stdlib/3/imp.pyi | 64 - .../typeshed/stdlib/3/importlib/__init__.pyi | 15 - .../typeshed/stdlib/3/importlib/abc.pyi | 97 - .../typeshed/stdlib/3/importlib/machinery.pyi | 98 - .../typeshed/stdlib/3/importlib/metadata.pyi | 87 - .../typeshed/stdlib/3/importlib/resources.pyi | 22 - .../typeshed/stdlib/3/importlib/util.pyi | 40 - .../third_party/typeshed/stdlib/3/inspect.pyi | 309 - .../jedi/third_party/typeshed/stdlib/3/io.pyi | 186 - .../typeshed/stdlib/3/ipaddress.pyi | 152 - .../typeshed/stdlib/3/itertools.pyi | 109 - .../typeshed/stdlib/3/json/__init__.pyi | 57 - .../typeshed/stdlib/3/json/decoder.pyi | 29 - .../typeshed/stdlib/3/json/encoder.pyi | 27 - .../typeshed/stdlib/3/json/tool.pyi | 1 - .../third_party/typeshed/stdlib/3/lzma.pyi | 164 - .../typeshed/stdlib/3/macurl2path.pyi | 7 - .../stdlib/3/multiprocessing/__init__.pyi | 87 - .../stdlib/3/multiprocessing/connection.pyi | 62 - .../stdlib/3/multiprocessing/context.pyi | 151 - .../3/multiprocessing/dummy/__init__.pyi | 52 - .../3/multiprocessing/dummy/connection.pyi | 39 - .../stdlib/3/multiprocessing/managers.pyi | 137 - .../stdlib/3/multiprocessing/pool.pyi | 84 - .../stdlib/3/multiprocessing/process.pyi | 39 - .../stdlib/3/multiprocessing/queues.pyi | 35 - .../3/multiprocessing/shared_memory.pyi | 33 - .../stdlib/3/multiprocessing/sharedctypes.pyi | 43 - .../stdlib/3/multiprocessing/spawn.pyi | 21 - .../stdlib/3/multiprocessing/synchronize.pyi | 47 - .../third_party/typeshed/stdlib/3/nntplib.pyi | 113 - .../third_party/typeshed/stdlib/3/ntpath.pyi | 144 - .../typeshed/stdlib/3/nturl2path.pyi | 2 - .../typeshed/stdlib/3/os/__init__.pyi | 831 -- .../third_party/typeshed/stdlib/3/os/path.pyi | 144 - .../third_party/typeshed/stdlib/3/pathlib.pyi | 178 - .../third_party/typeshed/stdlib/3/pipes.pyi | 15 - .../typeshed/stdlib/3/platform.pyi | 66 - .../third_party/typeshed/stdlib/3/posix.pyi | 165 - .../typeshed/stdlib/3/posixpath.pyi | 144 - .../third_party/typeshed/stdlib/3/queue.pyi | 52 - .../third_party/typeshed/stdlib/3/random.pyi | 87 - .../jedi/third_party/typeshed/stdlib/3/re.pyi | 123 - .../third_party/typeshed/stdlib/3/reprlib.pyi | 36 - .../typeshed/stdlib/3/resource.pyi | 55 - .../third_party/typeshed/stdlib/3/runpy.pyi | 22 - .../third_party/typeshed/stdlib/3/secrets.pyi | 12 - .../typeshed/stdlib/3/selectors.pyi | 69 - .../third_party/typeshed/stdlib/3/shelve.pyi | 34 - .../third_party/typeshed/stdlib/3/shlex.pyi | 45 - .../third_party/typeshed/stdlib/3/signal.pyi | 194 - .../third_party/typeshed/stdlib/3/smtplib.pyi | 159 - .../typeshed/stdlib/3/socketserver.pyi | 133 - .../third_party/typeshed/stdlib/3/spwd.pyi | 15 - .../typeshed/stdlib/3/sre_constants.pyi | 111 - .../typeshed/stdlib/3/sre_parse.pyi | 101 - .../third_party/typeshed/stdlib/3/stat.pyi | 91 - .../typeshed/stdlib/3/statistics.pyi | 72 - .../third_party/typeshed/stdlib/3/string.pyi | 30 - .../typeshed/stdlib/3/subprocess.pyi | 1054 -- .../third_party/typeshed/stdlib/3/symbol.pyi | 90 - .../third_party/typeshed/stdlib/3/sys.pyi | 235 - .../typeshed/stdlib/3/tempfile.pyi | 304 - .../typeshed/stdlib/3/textwrap.pyi | 100 - .../typeshed/stdlib/3/tkinter/__init__.pyi | 3276 ------- .../stdlib/3/tkinter/commondialog.pyi | 8 - .../typeshed/stdlib/3/tkinter/constants.pyi | 80 - .../typeshed/stdlib/3/tkinter/dialog.pyi | 10 - .../typeshed/stdlib/3/tkinter/filedialog.pyi | 67 - .../typeshed/stdlib/3/tkinter/font.pyi | 96 - .../typeshed/stdlib/3/tkinter/messagebox.pyi | 31 - .../typeshed/stdlib/3/tkinter/ttk.pyi | 1232 --- .../typeshed/stdlib/3/tokenize.pyi | 116 - .../typeshed/stdlib/3/tracemalloc.pyi | 86 - .../third_party/typeshed/stdlib/3/types.pyi | 334 - .../third_party/typeshed/stdlib/3/typing.pyi | 687 -- .../typeshed/stdlib/3/unittest/__init__.pyi | 11 - .../typeshed/stdlib/3/unittest/async_case.pyi | 10 - .../typeshed/stdlib/3/unittest/case.pyi | 285 - .../typeshed/stdlib/3/unittest/loader.pyi | 50 - .../typeshed/stdlib/3/unittest/main.pyi | 49 - .../typeshed/stdlib/3/unittest/mock.pyi | 441 - .../typeshed/stdlib/3/unittest/result.pyi | 41 - .../typeshed/stdlib/3/unittest/runner.pyi | 35 - .../typeshed/stdlib/3/unittest/signals.pyi | 12 - .../typeshed/stdlib/3/unittest/suite.pyi | 20 - .../typeshed/stdlib/3/unittest/util.pyi | 21 - .../typeshed/stdlib/3/urllib/__init__.pyi | 0 .../typeshed/stdlib/3/urllib/error.pyi | 13 - .../typeshed/stdlib/3/urllib/parse.pyi | 152 - .../typeshed/stdlib/3/urllib/request.pyi | 341 - .../typeshed/stdlib/3/urllib/response.pyi | 51 - .../typeshed/stdlib/3/urllib/robotparser.pyi | 19 - .../typeshed/stdlib/3/venv/__init__.pyi | 85 - .../third_party/typeshed/stdlib/3/winreg.pyi | 100 - .../typeshed/stdlib/3/xmlrpc/__init__.pyi | 0 .../typeshed/stdlib/3/xmlrpc/client.pyi | 308 - .../typeshed/stdlib/3/xmlrpc/server.pyi | 160 - .../typeshed/stdlib/3/xxlimited.pyi | 13 - .../third_party/typeshed/stdlib/3/zipapp.pyi | 24 - .../third_party/2/OpenSSL/__init__.pyi | 0 .../typeshed/third_party/2/OpenSSL/crypto.pyi | 191 - .../third_party/2/concurrent/__init__.pyi | 0 .../2/concurrent/futures/__init__.pyi | 13 - .../2/concurrent/futures/_base.pyi | 92 - .../2/concurrent/futures/process.pyi | 8 - .../2/concurrent/futures/thread.pyi | 16 - .../typeshed/third_party/2/enum.pyi | 73 - .../third_party/2/fb303/FacebookService.pyi | 298 - .../typeshed/third_party/2/fb303/__init__.pyi | 0 .../typeshed/third_party/2/ipaddress.pyi | 148 - .../typeshed/third_party/2/kazoo/__init__.pyi | 0 .../typeshed/third_party/2/kazoo/client.pyi | 109 - .../third_party/2/kazoo/exceptions.pyi | 58 - .../third_party/2/kazoo/recipe/__init__.pyi | 0 .../third_party/2/kazoo/recipe/watchers.pyi | 21 - .../typeshed/third_party/2/pathlib2.pyi | 103 - .../typeshed/third_party/2/pymssql.pyi | 44 - .../third_party/2/routes/__init__.pyi | 14 - .../typeshed/third_party/2/routes/mapper.pyi | 77 - .../typeshed/third_party/2/routes/util.pyi | 20 - .../third_party/2/scribe/__init__.pyi | 0 .../typeshed/third_party/2/scribe/scribe.pyi | 40 - .../typeshed/third_party/2/scribe/ttypes.pyi | 18 - .../typeshed/third_party/2/six/__init__.pyi | 130 - .../2/six/moves/BaseHTTPServer.pyi | 1 - .../third_party/2/six/moves/CGIHTTPServer.pyi | 1 - .../2/six/moves/SimpleHTTPServer.pyi | 1 - .../third_party/2/six/moves/__init__.pyi | 78 - .../third_party/2/six/moves/_dummy_thread.pyi | 1 - .../third_party/2/six/moves/_thread.pyi | 1 - .../third_party/2/six/moves/cPickle.pyi | 1 - .../2/six/moves/collections_abc.pyi | 1 - .../third_party/2/six/moves/configparser.pyi | 1 - .../2/six/moves/email_mime_base.pyi | 1 - .../2/six/moves/email_mime_multipart.pyi | 1 - .../2/six/moves/email_mime_nonmultipart.pyi | 1 - .../2/six/moves/email_mime_text.pyi | 1 - .../third_party/2/six/moves/html_entities.pyi | 1 - .../third_party/2/six/moves/html_parser.pyi | 1 - .../third_party/2/six/moves/http_client.pyi | 1 - .../2/six/moves/http_cookiejar.pyi | 1 - .../third_party/2/six/moves/http_cookies.pyi | 1 - .../third_party/2/six/moves/queue.pyi | 1 - .../third_party/2/six/moves/reprlib.pyi | 1 - .../third_party/2/six/moves/socketserver.pyi | 1 - .../2/six/moves/urllib/__init__.pyi | 5 - .../third_party/2/six/moves/urllib/error.pyi | 2 - .../third_party/2/six/moves/urllib/parse.pyi | 29 - .../2/six/moves/urllib/request.pyi | 39 - .../2/six/moves/urllib/response.pyi | 1 - .../2/six/moves/urllib/robotparser.pyi | 1 - .../third_party/2/six/moves/urllib_error.pyi | 1 - .../third_party/2/six/moves/urllib_parse.pyi | 1 - .../2/six/moves/urllib_request.pyi | 1 - .../2/six/moves/urllib_response.pyi | 1 - .../2/six/moves/urllib_robotparser.pyi | 1 - .../third_party/2/six/moves/xmlrpc_client.pyi | 1 - .../third_party/2/tornado/__init__.pyi | 0 .../third_party/2/tornado/concurrent.pyi | 43 - .../typeshed/third_party/2/tornado/gen.pyi | 110 - .../third_party/2/tornado/httpclient.pyi | 127 - .../third_party/2/tornado/httpserver.pyi | 57 - .../third_party/2/tornado/httputil.pyi | 99 - .../typeshed/third_party/2/tornado/ioloop.pyi | 85 - .../typeshed/third_party/2/tornado/locks.pyi | 45 - .../third_party/2/tornado/netutil.pyi | 46 - .../third_party/2/tornado/process.pyi | 24 - .../third_party/2/tornado/tcpserver.pyi | 17 - .../third_party/2/tornado/testing.pyi | 63 - .../typeshed/third_party/2/tornado/util.pyi | 46 - .../typeshed/third_party/2/tornado/web.pyi | 266 - .../2and3/atomicwrites/__init__.pyi | 16 - .../third_party/2and3/attr/__init__.pyi | 257 - .../third_party/2and3/attr/_version_info.pyi | 9 - .../third_party/2and3/attr/converters.pyi | 11 - .../third_party/2and3/attr/exceptions.pyi | 15 - .../third_party/2and3/attr/filters.pyi | 6 - .../third_party/2and3/attr/validators.pyi | 54 - .../third_party/2and3/backports/__init__.pyi | 4 - .../2and3/backports/ssl_match_hostname.pyi | 3 - .../third_party/2and3/backports_abc.pyi | 15 - .../third_party/2and3/bleach/__init__.pyi | 27 - .../third_party/2and3/bleach/callbacks.pyi | 6 - .../third_party/2and3/bleach/linkifier.pyi | 31 - .../third_party/2and3/bleach/sanitizer.pyi | 34 - .../third_party/2and3/bleach/utils.pyi | 8 - .../third_party/2and3/boto/__init__.pyi | 109 - .../typeshed/third_party/2and3/boto/auth.pyi | 109 - .../third_party/2and3/boto/auth_handler.pyi | 10 - .../third_party/2and3/boto/compat.pyi | 20 - .../third_party/2and3/boto/connection.pyi | 174 - .../third_party/2and3/boto/ec2/__init__.pyi | 10 - .../third_party/2and3/boto/elb/__init__.pyi | 59 - .../third_party/2and3/boto/exception.pyi | 147 - .../third_party/2and3/boto/kms/__init__.pyi | 6 - .../third_party/2and3/boto/kms/exceptions.pyi | 17 - .../third_party/2and3/boto/kms/layer1.pyi | 82 - .../third_party/2and3/boto/plugin.pyi | 9 - .../third_party/2and3/boto/regioninfo.pyi | 22 - .../third_party/2and3/boto/s3/__init__.pyi | 18 - .../third_party/2and3/boto/s3/acl.pyi | 48 - .../third_party/2and3/boto/s3/bucket.pyi | 187 - .../2and3/boto/s3/bucketlistresultset.pyi | 80 - .../2and3/boto/s3/bucketlogging.pyi | 11 - .../third_party/2and3/boto/s3/connection.pyi | 128 - .../third_party/2and3/boto/s3/cors.pyi | 35 - .../2and3/boto/s3/deletemarker.pyi | 12 - .../third_party/2and3/boto/s3/key.pyi | 233 - .../third_party/2and3/boto/s3/keyfile.pyi | 29 - .../third_party/2and3/boto/s3/lifecycle.pyi | 65 - .../third_party/2and3/boto/s3/multidelete.pyi | 35 - .../third_party/2and3/boto/s3/multipart.pyi | 70 - .../third_party/2and3/boto/s3/prefix.pyi | 10 - .../third_party/2and3/boto/s3/tagging.pyi | 22 - .../third_party/2and3/boto/s3/user.pyi | 10 - .../third_party/2and3/boto/s3/website.pyi | 82 - .../typeshed/third_party/2and3/boto/utils.pyi | 175 - .../third_party/2and3/cachetools/__init__.pyi | 6 - .../third_party/2and3/cachetools/abc.pyi | 7 - .../third_party/2and3/cachetools/cache.pyi | 20 - .../2and3/cachetools/decorators.pyi | 16 - .../third_party/2and3/cachetools/func.pyi | 11 - .../third_party/2and3/cachetools/lfu.pyi | 14 - .../third_party/2and3/cachetools/lru.pyi | 13 - .../third_party/2and3/cachetools/rr.pyi | 21 - .../third_party/2and3/cachetools/ttl.pyi | 23 - .../typeshed/third_party/2and3/certifi.pyi | 1 - .../2and3/characteristic/__init__.pyi | 35 - .../third_party/2and3/chardet/__init__.pyi | 26 - .../third_party/2and3/chardet/enums.pyi | 39 - .../2and3/chardet/langbulgarianmodel.pyi | 9 - .../2and3/chardet/langcyrillicmodel.pyi | 17 - .../2and3/chardet/langgreekmodel.pyi | 9 - .../2and3/chardet/langhebrewmodel.pyi | 7 - .../2and3/chardet/langhungarianmodel.pyi | 9 - .../2and3/chardet/langthaimodel.pyi | 7 - .../2and3/chardet/langturkishmodel.pyi | 7 - .../2and3/chardet/universaldetector.pyi | 29 - .../third_party/2and3/chardet/version.pyi | 4 - .../third_party/2and3/click/__init__.pyi | 84 - .../third_party/2and3/click/_termui_impl.pyi | 14 - .../typeshed/third_party/2and3/click/core.pyi | 285 - .../third_party/2and3/click/decorators.pyi | 293 - .../third_party/2and3/click/exceptions.pyi | 60 - .../third_party/2and3/click/formatting.pyi | 34 - .../third_party/2and3/click/globals.pyi | 8 - .../third_party/2and3/click/parser.pyi | 65 - .../third_party/2and3/click/termui.pyi | 103 - .../third_party/2and3/click/testing.pyi | 67 - .../third_party/2and3/click/types.pyi | 125 - .../third_party/2and3/click/utils.pyi | 43 - .../typeshed/third_party/2and3/croniter.pyi | 43 - .../2and3/cryptography/__init__.pyi | 0 .../2and3/cryptography/exceptions.pyi | 7 - .../third_party/2and3/cryptography/fernet.pyi | 25 - .../2and3/cryptography/hazmat/__init__.pyi | 3 - .../cryptography/hazmat/backends/__init__.pyi | 6 - .../hazmat/backends/interfaces.pyi | 196 - .../cryptography/hazmat/bindings/__init__.pyi | 0 .../hazmat/bindings/openssl/__init__.pyi | 0 .../hazmat/bindings/openssl/binding.pyi | 6 - .../hazmat/primitives/__init__.pyi | 3 - .../hazmat/primitives/asymmetric/__init__.pyi | 3 - .../hazmat/primitives/asymmetric/dh.pyi | 79 - .../hazmat/primitives/asymmetric/dsa.pyi | 79 - .../hazmat/primitives/asymmetric/ec.pyi | 196 - .../hazmat/primitives/asymmetric/ed25519.pyi | 25 - .../hazmat/primitives/asymmetric/ed448.pyi | 25 - .../hazmat/primitives/asymmetric/padding.pyi | 27 - .../hazmat/primitives/asymmetric/rsa.pyi | 83 - .../hazmat/primitives/asymmetric/utils.pyi | 12 - .../hazmat/primitives/asymmetric/x25519.pyi | 23 - .../hazmat/primitives/asymmetric/x448.pyi | 23 - .../hazmat/primitives/ciphers/__init__.pyi | 44 - .../hazmat/primitives/ciphers/aead.pyi | 22 - .../hazmat/primitives/ciphers/algorithms.pyi | 76 - .../hazmat/primitives/ciphers/modes.pyi | 94 - .../cryptography/hazmat/primitives/cmac.pyi | 11 - .../hazmat/primitives/constant_time.pyi | 1 - .../cryptography/hazmat/primitives/hashes.pyi | 44 - .../cryptography/hazmat/primitives/hmac.pyi | 11 - .../hazmat/primitives/kdf/__init__.pyi | 7 - .../hazmat/primitives/kdf/concatkdf.pyi | 24 - .../hazmat/primitives/kdf/hkdf.pyi | 22 - .../hazmat/primitives/kdf/kbkdf.pyi | 30 - .../hazmat/primitives/kdf/pbkdf2.pyi | 12 - .../hazmat/primitives/kdf/scrypt.pyi | 9 - .../hazmat/primitives/kdf/x963kdf.pyi | 12 - .../hazmat/primitives/keywrap.pyi | 10 - .../hazmat/primitives/padding.pyi | 17 - .../hazmat/primitives/poly1305.pyi | 9 - .../primitives/serialization/__init__.pyi | 63 - .../primitives/serialization/pkcs12.pyi | 18 - .../hazmat/primitives/twofactor/__init__.pyi | 1 - .../hazmat/primitives/twofactor/hotp.pyi | 12 - .../hazmat/primitives/twofactor/totp.pyi | 18 - .../2and3/cryptography/x509/__init__.pyi | 420 - .../2and3/cryptography/x509/extensions.pyi | 22 - .../2and3/cryptography/x509/oid.pyi | 106 - .../typeshed/third_party/2and3/dateparser.pyi | 14 - .../2and3/datetimerange/__init__.pyi | 47 - .../third_party/2and3/dateutil/__init__.pyi | 0 .../third_party/2and3/dateutil/_common.pyi | 12 - .../third_party/2and3/dateutil/easter.pyi | 8 - .../third_party/2and3/dateutil/parser.pyi | 51 - .../2and3/dateutil/relativedelta.pyi | 97 - .../third_party/2and3/dateutil/rrule.pyi | 105 - .../2and3/dateutil/tz/__init__.pyi | 15 - .../third_party/2and3/dateutil/tz/_common.pyi | 24 - .../third_party/2and3/dateutil/tz/tz.pyi | 101 - .../third_party/2and3/dateutil/utils.pyi | 6 - .../typeshed/third_party/2and3/decorator.pyi | 81 - .../third_party/2and3/deprecated/__init__.pyi | 1 - .../third_party/2and3/deprecated/classic.pyi | 21 - .../third_party/2and3/deprecated/sphinx.pyi | 31 - .../third_party/2and3/emoji/__init__.pyi | 13 - .../typeshed/third_party/2and3/emoji/core.pyi | 9 - .../third_party/2and3/emoji/unicode_codes.pyi | 6 - .../typeshed/third_party/2and3/first.pyi | 12 - .../third_party/2and3/flask/__init__.pyi | 41 - .../typeshed/third_party/2and3/flask/app.pyi | 195 - .../third_party/2and3/flask/blueprints.pyi | 80 - .../typeshed/third_party/2and3/flask/cli.pyi | 68 - .../third_party/2and3/flask/config.pyi | 18 - .../typeshed/third_party/2and3/flask/ctx.pyi | 40 - .../third_party/2and3/flask/debughelpers.pyi | 14 - .../third_party/2and3/flask/globals.pyi | 16 - .../third_party/2and3/flask/helpers.pyi | 55 - .../third_party/2and3/flask/json/__init__.pyi | 19 - .../third_party/2and3/flask/json/tag.pyi | 67 - .../third_party/2and3/flask/logging.pyi | 8 - .../third_party/2and3/flask/sessions.pyi | 57 - .../third_party/2and3/flask/signals.pyi | 29 - .../third_party/2and3/flask/templating.pyi | 16 - .../third_party/2and3/flask/testing.pyi | 56 - .../third_party/2and3/flask/views.pyi | 17 - .../third_party/2and3/flask/wrappers.pyi | 32 - .../third_party/2and3/geoip2/__init__.pyi | 0 .../third_party/2and3/geoip2/database.pyi | 27 - .../third_party/2and3/geoip2/errors.pyi | 14 - .../third_party/2and3/geoip2/mixins.pyi | 3 - .../third_party/2and3/geoip2/models.pyi | 62 - .../third_party/2and3/geoip2/records.pyi | 83 - .../typeshed/third_party/2and3/gflags.pyi | 312 - .../third_party/2and3/google/__init__.pyi | 0 .../2and3/google/protobuf/__init__.pyi | 1 - .../2and3/google/protobuf/any_pb2.pyi | 47 - .../2and3/google/protobuf/api_pb2.pyi | 114 - .../google/protobuf/compiler/__init__.pyi | 0 .../google/protobuf/compiler/plugin_pb2.pyi | 136 - .../2and3/google/protobuf/descriptor.pyi | 330 - .../2and3/google/protobuf/descriptor_pb2.pyi | 734 -- .../2and3/google/protobuf/descriptor_pool.pyi | 18 - .../2and3/google/protobuf/duration_pb2.pyi | 46 - .../2and3/google/protobuf/empty_pb2.pyi | 22 - .../2and3/google/protobuf/field_mask_pb2.pyi | 50 - .../google/protobuf/internal/__init__.pyi | 0 .../google/protobuf/internal/containers.pyi | 90 - .../google/protobuf/internal/decoder.pyi | 30 - .../google/protobuf/internal/encoder.pyi | 34 - .../protobuf/internal/enum_type_wrapper.pyi | 18 - .../protobuf/internal/extension_dict.pyi | 36 - .../protobuf/internal/message_listener.pyi | 5 - .../protobuf/internal/python_message.pyi | 1 - .../protobuf/internal/well_known_types.pyi | 94 - .../google/protobuf/internal/wire_format.pyi | 50 - .../2and3/google/protobuf/json_format.pyi | 26 - .../2and3/google/protobuf/message.pyi | 56 - .../2and3/google/protobuf/message_factory.pyi | 14 - .../2and3/google/protobuf/reflection.pyi | 6 - .../2and3/google/protobuf/service.pyi | 39 - .../google/protobuf/source_context_pb2.pyi | 41 - .../2and3/google/protobuf/struct_pb2.pyi | 126 - .../2and3/google/protobuf/symbol_database.pyi | 16 - .../2and3/google/protobuf/timestamp_pb2.pyi | 46 - .../2and3/google/protobuf/type_pb2.pyi | 237 - .../2and3/google/protobuf/util/__init__.pyi | 0 .../2and3/google/protobuf/wrappers_pb2.pyi | 129 - .../third_party/2and3/itsdangerous.pyi | 184 - .../third_party/2and3/jinja2/__init__.pyi | 45 - .../third_party/2and3/jinja2/_compat.pyi | 36 - .../third_party/2and3/jinja2/_stringdefs.pyi | 40 - .../third_party/2and3/jinja2/bccache.pyi | 44 - .../third_party/2and3/jinja2/compiler.pyi | 177 - .../third_party/2and3/jinja2/constants.pyi | 1 - .../third_party/2and3/jinja2/debug.pyi | 37 - .../third_party/2and3/jinja2/defaults.pyi | 22 - .../third_party/2and3/jinja2/environment.pyi | 224 - .../third_party/2and3/jinja2/exceptions.pyi | 31 - .../typeshed/third_party/2and3/jinja2/ext.pyi | 66 - .../third_party/2and3/jinja2/filters.pyi | 56 - .../third_party/2and3/jinja2/lexer.pyi | 117 - .../third_party/2and3/jinja2/loaders.pyi | 80 - .../third_party/2and3/jinja2/meta.pyi | 12 - .../third_party/2and3/jinja2/nodes.pyi | 255 - .../third_party/2and3/jinja2/optimizer.pyi | 30 - .../third_party/2and3/jinja2/parser.pyi | 68 - .../third_party/2and3/jinja2/runtime.pyi | 132 - .../third_party/2and3/jinja2/sandbox.pyi | 35 - .../third_party/2and3/jinja2/tests.pyi | 24 - .../third_party/2and3/jinja2/utils.pyi | 87 - .../third_party/2and3/jinja2/visitor.pyi | 8 - .../third_party/2and3/markdown/__init__.pyi | 2 - .../third_party/2and3/markdown/__meta__.pyi | 3 - .../2and3/markdown/blockparser.pyi | 18 - .../2and3/markdown/blockprocessors.pyi | 59 - .../third_party/2and3/markdown/core.pyi | 63 - .../2and3/markdown/extensions/__init__.pyi | 13 - .../2and3/markdown/extensions/abbr.pyi | 16 - .../2and3/markdown/extensions/admonition.pyi | 15 - .../2and3/markdown/extensions/attr_list.pyi | 20 - .../2and3/markdown/extensions/codehilite.pyi | 42 - .../2and3/markdown/extensions/def_list.pyi | 13 - .../2and3/markdown/extensions/extra.pyi | 10 - .../2and3/markdown/extensions/fenced_code.pyi | 16 - .../2and3/markdown/extensions/footnotes.pyi | 57 - .../markdown/extensions/legacy_attrs.pyi | 13 - .../2and3/markdown/extensions/legacy_em.pyi | 13 - .../2and3/markdown/extensions/md_in_html.pyi | 9 - .../2and3/markdown/extensions/meta.pyi | 18 - .../2and3/markdown/extensions/nl2br.pyi | 9 - .../2and3/markdown/extensions/sane_lists.pyi | 14 - .../2and3/markdown/extensions/smarty.pyi | 39 - .../2and3/markdown/extensions/tables.pyi | 19 - .../2and3/markdown/extensions/toc.pyi | 44 - .../2and3/markdown/extensions/wikilinks.pyi | 16 - .../2and3/markdown/inlinepatterns.pyi | 103 - .../third_party/2and3/markdown/pep562.pyi | 9 - .../2and3/markdown/postprocessors.pyi | 17 - .../2and3/markdown/preprocessors.pyi | 23 - .../2and3/markdown/serializers.pyi | 4 - .../2and3/markdown/treeprocessors.pyi | 19 - .../third_party/2and3/markdown/util.pyi | 56 - .../third_party/2and3/markupsafe/__init__.pyi | 55 - .../third_party/2and3/markupsafe/_compat.pyi | 21 - .../2and3/markupsafe/_constants.pyi | 3 - .../third_party/2and3/markupsafe/_native.pyi | 8 - .../2and3/markupsafe/_speedups.pyi | 8 - .../third_party/2and3/maxminddb/__init__.pyi | 6 - .../third_party/2and3/maxminddb/compat.pyi | 6 - .../third_party/2and3/maxminddb/const.pyi | 6 - .../third_party/2and3/maxminddb/decoder.pyi | 5 - .../third_party/2and3/maxminddb/errors.pyi | 1 - .../third_party/2and3/maxminddb/extension.pyi | 33 - .../third_party/2and3/maxminddb/reader.pyi | 34 - .../typeshed/third_party/2and3/mock.pyi | 441 - .../third_party/2and3/mypy_extensions.pyi | 46 - .../third_party/2and3/nmap/__init__.pyi | 1 - .../typeshed/third_party/2and3/nmap/nmap.pyi | 122 - .../third_party/2and3/paramiko/__init__.pyi | 41 - .../third_party/2and3/paramiko/_version.pyi | 3 - .../third_party/2and3/paramiko/_winapi.pyi | 97 - .../third_party/2and3/paramiko/agent.pyi | 67 - .../2and3/paramiko/auth_handler.pyi | 49 - .../third_party/2and3/paramiko/ber.pyi | 17 - .../2and3/paramiko/buffered_pipe.pyi | 16 - .../third_party/2and3/paramiko/channel.pyi | 99 - .../third_party/2and3/paramiko/client.pyi | 74 - .../third_party/2and3/paramiko/common.pyi | 139 - .../third_party/2and3/paramiko/compress.pyi | 11 - .../third_party/2and3/paramiko/config.pyi | 31 - .../third_party/2and3/paramiko/dsskey.pyi | 34 - .../third_party/2and3/paramiko/ecdsakey.pyi | 53 - .../third_party/2and3/paramiko/ed25519key.pyi | 22 - .../third_party/2and3/paramiko/file.pyi | 38 - .../third_party/2and3/paramiko/hostkeys.pyi | 47 - .../2and3/paramiko/kex_curve25519.pyi | 25 - .../2and3/paramiko/kex_ecdh_nist.pyi | 37 - .../third_party/2and3/paramiko/kex_gex.pyi | 39 - .../third_party/2and3/paramiko/kex_group1.pyi | 29 - .../2and3/paramiko/kex_group14.pyi | 20 - .../2and3/paramiko/kex_group16.pyi | 16 - .../third_party/2and3/paramiko/kex_gss.pyi | 66 - .../third_party/2and3/paramiko/message.pyi | 42 - .../third_party/2and3/paramiko/packet.pyi | 60 - .../third_party/2and3/paramiko/pipe.pyi | 35 - .../third_party/2and3/paramiko/pkey.pyi | 44 - .../third_party/2and3/paramiko/primes.pyi | 8 - .../third_party/2and3/paramiko/proxy.pyi | 16 - .../third_party/2and3/paramiko/py3compat.pyi | 41 - .../third_party/2and3/paramiko/rsakey.pyi | 33 - .../third_party/2and3/paramiko/server.pyi | 51 - .../third_party/2and3/paramiko/sftp.pyi | 61 - .../third_party/2and3/paramiko/sftp_attr.pyi | 22 - .../2and3/paramiko/sftp_client.pyi | 67 - .../third_party/2and3/paramiko/sftp_file.pyi | 29 - .../2and3/paramiko/sftp_handle.pyi | 13 - .../2and3/paramiko/sftp_server.pyi | 28 - .../third_party/2and3/paramiko/sftp_si.pyi | 23 - .../2and3/paramiko/ssh_exception.pyi | 41 - .../third_party/2and3/paramiko/ssh_gss.pyi | 54 - .../third_party/2and3/paramiko/transport.pyi | 194 - .../third_party/2and3/paramiko/util.pyi | 52 - .../2and3/paramiko/win_pageant.pyi | 16 - .../typeshed/third_party/2and3/polib.pyi | 156 - .../third_party/2and3/pyVmomi/__init__.pyi | 0 .../2and3/pyVmomi/vim/__init__.pyi | 69 - .../third_party/2and3/pyVmomi/vim/event.pyi | 16 - .../third_party/2and3/pyVmomi/vim/fault.pyi | 7 - .../third_party/2and3/pyVmomi/vim/option.pyi | 9 - .../third_party/2and3/pyVmomi/vim/view.pyi | 15 - .../2and3/pyVmomi/vmodl/__init__.pyi | 5 - .../third_party/2and3/pyVmomi/vmodl/fault.pyi | 5 - .../third_party/2and3/pyVmomi/vmodl/query.pyi | 38 - .../typeshed/third_party/2and3/pycurl.pyi | 644 -- .../third_party/2and3/pymysql/__init__.pyi | 63 - .../third_party/2and3/pymysql/charset.pyi | 16 - .../third_party/2and3/pymysql/connections.pyi | 172 - .../2and3/pymysql/constants/CLIENT.pyi | 18 - .../2and3/pymysql/constants/COMMAND.pyi | 22 - .../2and3/pymysql/constants/ER.pyi | 471 - .../2and3/pymysql/constants/FIELD_TYPE.pyi | 29 - .../2and3/pymysql/constants/FLAG.pyi | 17 - .../2and3/pymysql/constants/SERVER_STATUS.pyi | 10 - .../2and3/pymysql/constants/__init__.pyi | 0 .../third_party/2and3/pymysql/converters.pyi | 47 - .../third_party/2and3/pymysql/cursors.pyi | 52 - .../third_party/2and3/pymysql/err.pyi | 20 - .../third_party/2and3/pymysql/times.pyi | 10 - .../third_party/2and3/pymysql/util.pyi | 3 - .../third_party/2and3/pynamodb/__init__.pyi | 1 - .../third_party/2and3/pynamodb/attributes.pyi | 118 - .../2and3/pynamodb/connection/__init__.pyi | 2 - .../2and3/pynamodb/connection/base.pyi | 158 - .../2and3/pynamodb/connection/table.pyi | 108 - .../2and3/pynamodb/connection/util.pyi | 3 - .../third_party/2and3/pynamodb/constants.pyi | 166 - .../third_party/2and3/pynamodb/exceptions.pyi | 23 - .../third_party/2and3/pynamodb/indexes.pyi | 39 - .../third_party/2and3/pynamodb/models.pyi | 159 - .../third_party/2and3/pynamodb/settings.pyi | 8 - .../third_party/2and3/pynamodb/throttle.pyi | 19 - .../third_party/2and3/pynamodb/types.pyi | 5 - .../third_party/2and3/pyre_extensions.pyi | 7 - .../third_party/2and3/pytz/__init__.pyi | 43 - .../third_party/2and3/redis/__init__.pyi | 21 - .../third_party/2and3/redis/client.pyi | 633 -- .../third_party/2and3/redis/connection.pyi | 177 - .../third_party/2and3/redis/exceptions.pyi | 17 - .../third_party/2and3/redis/utils.pyi | 8 - .../third_party/2and3/requests/__init__.pyi | 36 - .../third_party/2and3/requests/adapters.pyi | 73 - .../third_party/2and3/requests/api.pyi | 28 - .../third_party/2and3/requests/auth.pyi | 39 - .../third_party/2and3/requests/compat.pyi | 3 - .../third_party/2and3/requests/cookies.pyi | 64 - .../third_party/2and3/requests/exceptions.pyi | 31 - .../third_party/2and3/requests/hooks.pyi | 6 - .../third_party/2and3/requests/models.pyi | 129 - .../2and3/requests/packages/__init__.pyi | 4 - .../requests/packages/urllib3/__init__.pyi | 26 - .../packages/urllib3/_collections.pyi | 52 - .../requests/packages/urllib3/connection.pyi | 65 - .../packages/urllib3/connectionpool.pyi | 121 - .../packages/urllib3/contrib/__init__.pyi | 0 .../requests/packages/urllib3/exceptions.pyi | 50 - .../requests/packages/urllib3/fields.pyi | 13 - .../requests/packages/urllib3/filepost.pyi | 12 - .../packages/urllib3/packages/__init__.pyi | 0 .../packages/ssl_match_hostname/__init__.pyi | 4 - .../ssl_match_hostname/_implementation.pyi | 3 - .../requests/packages/urllib3/poolmanager.pyi | 28 - .../requests/packages/urllib3/request.pyi | 11 - .../requests/packages/urllib3/response.pyi | 66 - .../packages/urllib3/util/__init__.pyi | 20 - .../packages/urllib3/util/connection.pyi | 8 - .../packages/urllib3/util/request.pyi | 11 - .../packages/urllib3/util/response.pyi | 1 - .../requests/packages/urllib3/util/retry.pyi | 43 - .../requests/packages/urllib3/util/ssl_.pyi | 30 - .../packages/urllib3/util/timeout.pyi | 21 - .../requests/packages/urllib3/util/url.pyi | 23 - .../third_party/2and3/requests/sessions.pyi | 101 - .../2and3/requests/status_codes.pyi | 3 - .../third_party/2and3/requests/structures.pyi | 20 - .../third_party/2and3/requests/utils.pyi | 54 - .../third_party/2and3/retry/__init__.pyi | 1 - .../typeshed/third_party/2and3/retry/api.pyi | 28 - .../third_party/2and3/simplejson/__init__.pyi | 12 - .../third_party/2and3/simplejson/decoder.pyi | 6 - .../third_party/2and3/simplejson/encoder.pyi | 9 - .../third_party/2and3/simplejson/scanner.pyi | 11 - .../third_party/2and3/singledispatch.pyi | 15 - .../third_party/2and3/slugify/__init__.pyi | 2 - .../third_party/2and3/slugify/slugify.pyi | 19 - .../third_party/2and3/slugify/special.pyi | 8 - .../typeshed/third_party/2and3/tabulate.pyi | 43 - .../typeshed/third_party/2and3/termcolor.pyi | 8 - .../typeshed/third_party/2and3/toml.pyi | 19 - .../third_party/2and3/typing_extensions.pyi | 114 - .../third_party/2and3/tzlocal/__init__.pyi | 4 - .../typeshed/third_party/2and3/ujson.pyi | 35 - .../third_party/2and3/werkzeug/__init__.pyi | 151 - .../third_party/2and3/werkzeug/_compat.pyi | 53 - .../third_party/2and3/werkzeug/_internal.pyi | 26 - .../third_party/2and3/werkzeug/_reloader.pyi | 29 - .../2and3/werkzeug/contrib/__init__.pyi | 0 .../2and3/werkzeug/contrib/atom.pyi | 50 - .../2and3/werkzeug/contrib/cache.pyi | 92 - .../2and3/werkzeug/contrib/fixers.pyi | 35 - .../2and3/werkzeug/contrib/iterio.pyi | 39 - .../2and3/werkzeug/contrib/jsrouting.pyi | 10 - .../2and3/werkzeug/contrib/limiter.pyi | 7 - .../2and3/werkzeug/contrib/lint.pyi | 1 - .../2and3/werkzeug/contrib/profiler.pyi | 9 - .../2and3/werkzeug/contrib/securecookie.pyi | 39 - .../2and3/werkzeug/contrib/sessions.pyi | 77 - .../2and3/werkzeug/contrib/testtools.pyi | 8 - .../2and3/werkzeug/contrib/wrappers.pyi | 27 - .../2and3/werkzeug/datastructures.pyi | 458 - .../2and3/werkzeug/debug/__init__.pyi | 51 - .../2and3/werkzeug/debug/console.pyi | 44 - .../third_party/2and3/werkzeug/debug/repr.pyi | 33 - .../2and3/werkzeug/debug/tbtools.pyi | 63 - .../third_party/2and3/werkzeug/exceptions.pyi | 183 - .../third_party/2and3/werkzeug/filesystem.pyi | 7 - .../third_party/2and3/werkzeug/formparser.pyi | 102 - .../third_party/2and3/werkzeug/http.pyi | 137 - .../third_party/2and3/werkzeug/local.pyi | 100 - .../2and3/werkzeug/middleware/__init__.pyi | 0 .../2and3/werkzeug/middleware/dispatcher.pyi | 8 - .../2and3/werkzeug/middleware/http_proxy.pyi | 14 - .../2and3/werkzeug/middleware/lint.pyi | 62 - .../2and3/werkzeug/middleware/profiler.pyi | 14 - .../2and3/werkzeug/middleware/proxy_fix.pyi | 23 - .../2and3/werkzeug/middleware/shared_data.pyi | 29 - .../2and3/werkzeug/posixemulation.pyi | 8 - .../third_party/2and3/werkzeug/routing.pyi | 230 - .../third_party/2and3/werkzeug/script.pyi | 24 - .../third_party/2and3/werkzeug/security.pyi | 12 - .../third_party/2and3/werkzeug/serving.pyi | 140 - .../third_party/2and3/werkzeug/test.pyi | 175 - .../third_party/2and3/werkzeug/testapp.pyi | 10 - .../third_party/2and3/werkzeug/urls.pyi | 94 - .../third_party/2and3/werkzeug/useragents.pyi | 18 - .../third_party/2and3/werkzeug/utils.pyi | 58 - .../third_party/2and3/werkzeug/wrappers.pyi | 289 - .../third_party/2and3/werkzeug/wsgi.pyi | 74 - .../third_party/2and3/yaml/__init__.pyi | 275 - .../third_party/2and3/yaml/composer.pyi | 17 - .../third_party/2and3/yaml/constructor.pyi | 86 - .../typeshed/third_party/2and3/yaml/cyaml.pyi | 63 - .../third_party/2and3/yaml/dumper.pyi | 61 - .../third_party/2and3/yaml/emitter.pyi | 109 - .../typeshed/third_party/2and3/yaml/error.pyi | 21 - .../third_party/2and3/yaml/events.pyi | 62 - .../third_party/2and3/yaml/loader.pyi | 18 - .../typeshed/third_party/2and3/yaml/nodes.pyi | 31 - .../third_party/2and3/yaml/parser.pyi | 45 - .../third_party/2and3/yaml/reader.pyi | 35 - .../third_party/2and3/yaml/representer.pyi | 60 - .../third_party/2and3/yaml/resolver.pyi | 25 - .../third_party/2and3/yaml/scanner.pyi | 97 - .../third_party/2and3/yaml/serializer.pyi | 24 - .../third_party/2and3/yaml/tokens.pyi | 93 - .../third_party/3/aiofiles/__init__.pyi | 1 - .../typeshed/third_party/3/aiofiles/base.pyi | 35 - .../typeshed/third_party/3/aiofiles/os.pyi | 26 - .../3/aiofiles/threadpool/__init__.pyi | 91 - .../3/aiofiles/threadpool/binary.pyi | 41 - .../3/aiofiles/threadpool/text.pyi | 38 - .../typeshed/third_party/3/contextvars.pyi | 38 - .../typeshed/third_party/3/dataclasses.pyi | 95 - .../third_party/3/docutils/__init__.pyi | 3 - .../third_party/3/docutils/examples.pyi | 5 - .../typeshed/third_party/3/docutils/nodes.pyi | 6 - .../3/docutils/parsers/__init__.pyi | 3 - .../3/docutils/parsers/rst/__init__.pyi | 3 - .../3/docutils/parsers/rst/nodes.pyi | 3 - .../3/docutils/parsers/rst/roles.pyi | 12 - .../3/docutils/parsers/rst/states.pyi | 6 - .../third_party/3/filelock/__init__.pyi | 54 - .../third_party/3/freezegun/__init__.pyi | 1 - .../typeshed/third_party/3/freezegun/api.pyi | 56 - .../typeshed/third_party/3/frozendict.pyi | 27 - .../typeshed/third_party/3/jwt/__init__.pyi | 49 - .../typeshed/third_party/3/jwt/algorithms.pyi | 101 - .../third_party/3/jwt/contrib/__init__.pyi | 0 .../3/jwt/contrib/algorithms/__init__.pyi | 0 .../3/jwt/contrib/algorithms/py_ecdsa.pyi | 10 - .../3/jwt/contrib/algorithms/pycrypto.pyi | 10 - .../typeshed/third_party/3/orjson.pyi | 24 - .../third_party/3/pkg_resources/__init__.pyi | 271 - .../3/pkg_resources/py31compat.pyi | 5 - .../third_party/3/pyrfc3339/__init__.pyi | 2 - .../third_party/3/pyrfc3339/generator.pyi | 3 - .../third_party/3/pyrfc3339/parser.pyi | 3 - .../third_party/3/pyrfc3339/utils.pyi | 11 - .../typeshed/third_party/3/six/__init__.pyi | 125 - .../3/six/moves/BaseHTTPServer.pyi | 1 - .../third_party/3/six/moves/CGIHTTPServer.pyi | 1 - .../3/six/moves/SimpleHTTPServer.pyi | 1 - .../third_party/3/six/moves/__init__.pyi | 65 - .../third_party/3/six/moves/_dummy_thread.pyi | 1 - .../third_party/3/six/moves/_thread.pyi | 1 - .../third_party/3/six/moves/builtins.pyi | 1 - .../third_party/3/six/moves/cPickle.pyi | 1 - .../3/six/moves/collections_abc.pyi | 1 - .../third_party/3/six/moves/configparser.pyi | 1 - .../3/six/moves/email_mime_base.pyi | 1 - .../3/six/moves/email_mime_multipart.pyi | 1 - .../3/six/moves/email_mime_nonmultipart.pyi | 1 - .../3/six/moves/email_mime_text.pyi | 1 - .../third_party/3/six/moves/html_entities.pyi | 1 - .../third_party/3/six/moves/html_parser.pyi | 1 - .../third_party/3/six/moves/http_client.pyi | 1 - .../3/six/moves/http_cookiejar.pyi | 1 - .../third_party/3/six/moves/http_cookies.pyi | 1 - .../third_party/3/six/moves/queue.pyi | 1 - .../third_party/3/six/moves/reprlib.pyi | 1 - .../third_party/3/six/moves/socketserver.pyi | 1 - .../third_party/3/six/moves/tkinter.pyi | 1 - .../3/six/moves/tkinter_commondialog.pyi | 1 - .../3/six/moves/tkinter_constants.pyi | 1 - .../3/six/moves/tkinter_dialog.pyi | 1 - .../3/six/moves/tkinter_filedialog.pyi | 1 - .../3/six/moves/tkinter_tkfiledialog.pyi | 1 - .../third_party/3/six/moves/tkinter_ttk.pyi | 1 - .../3/six/moves/urllib/__init__.pyi | 5 - .../third_party/3/six/moves/urllib/error.pyi | 1 - .../third_party/3/six/moves/urllib/parse.pyi | 30 - .../3/six/moves/urllib/request.pyi | 41 - .../3/six/moves/urllib/response.pyi | 8 - .../3/six/moves/urllib/robotparser.pyi | 1 - .../third_party/3/six/moves/urllib_error.pyi | 1 - .../third_party/3/six/moves/urllib_parse.pyi | 1 - .../3/six/moves/urllib_request.pyi | 1 - .../3/six/moves/urllib_response.pyi | 1 - .../3/six/moves/urllib_robotparser.pyi | 1 - .../third_party/3/typed_ast/__init__.pyi | 0 .../third_party/3/typed_ast/ast27.pyi | 335 - .../typeshed/third_party/3/typed_ast/ast3.pyi | 384 - .../third_party/3/typed_ast/conversions.pyi | 3 - .../third_party/3/waitress/__init__.pyi | 7 - .../third_party/3/waitress/adjustments.pyi | 61 - .../third_party/3/waitress/buffers.pyi | 57 - .../third_party/3/waitress/channel.pyi | 49 - .../third_party/3/waitress/compat.pyi | 39 - .../third_party/3/waitress/parser.pyi | 43 - .../third_party/3/waitress/proxy_headers.pyi | 32 - .../third_party/3/waitress/receiver.pyi | 32 - .../third_party/3/waitress/rfc7230.pyi | 16 - .../third_party/3/waitress/runner.pyi | 11 - .../third_party/3/waitress/server.pyi | 103 - .../typeshed/third_party/3/waitress/task.pyi | 69 - .../third_party/3/waitress/trigger.pyi | 31 - .../third_party/3/waitress/utilities.pyi | 76 - .../third_party/3/waitress/wasyncore.pyi | 94 - .../python3.12/site-packages/jedi/utils.py | 134 - .../site-packages/markdown_it/__init__.py | 5 - .../__pycache__/__init__.cpython-312.pyc | Bin 314 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 511 -> 0 bytes .../__pycache__/_punycode.cpython-312.pyc | Bin 2603 -> 0 bytes .../__pycache__/main.cpython-312.pyc | Bin 16993 -> 0 bytes .../__pycache__/parser_block.cpython-312.pyc | Bin 4048 -> 0 bytes .../__pycache__/parser_core.cpython-312.pyc | Bin 1811 -> 0 bytes .../__pycache__/parser_inline.cpython-312.pyc | Bin 5301 -> 0 bytes .../__pycache__/renderer.cpython-312.pyc | Bin 11818 -> 0 bytes .../__pycache__/ruler.cpython-312.pyc | Bin 12209 -> 0 bytes .../__pycache__/token.cpython-312.pyc | Bin 7806 -> 0 bytes .../__pycache__/tree.cpython-312.pyc | Bin 15823 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 8339 -> 0 bytes .../site-packages/markdown_it/_compat.py | 11 - .../site-packages/markdown_it/_punycode.py | 67 - .../site-packages/markdown_it/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 183 -> 0 bytes .../cli/__pycache__/parse.cpython-312.pyc | Bin 4510 -> 0 bytes .../site-packages/markdown_it/cli/parse.py | 109 - .../markdown_it/common/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 186 -> 0 bytes .../__pycache__/entities.cpython-312.pyc | Bin 546 -> 0 bytes .../__pycache__/html_blocks.cpython-312.pyc | Bin 770 -> 0 bytes .../__pycache__/html_re.cpython-312.pyc | Bin 1332 -> 0 bytes .../__pycache__/normalize_url.cpython-312.pyc | Bin 3317 -> 0 bytes .../common/__pycache__/utils.cpython-312.pyc | Bin 10066 -> 0 bytes .../markdown_it/common/entities.py | 4 - .../markdown_it/common/html_blocks.py | 68 - .../markdown_it/common/html_re.py | 40 - .../markdown_it/common/normalize_url.py | 81 - .../site-packages/markdown_it/common/utils.py | 318 - .../markdown_it/helpers/__init__.py | 6 - .../__pycache__/__init__.cpython-312.pyc | Bin 452 -> 0 bytes .../parse_link_destination.cpython-312.pyc | Bin 2175 -> 0 bytes .../parse_link_label.cpython-312.pyc | Bin 1419 -> 0 bytes .../parse_link_title.cpython-312.pyc | Bin 1937 -> 0 bytes .../helpers/parse_link_destination.py | 86 - .../markdown_it/helpers/parse_link_label.py | 43 - .../markdown_it/helpers/parse_link_title.py | 60 - .../site-packages/markdown_it/main.py | 355 - .../site-packages/markdown_it/parser_block.py | 111 - .../site-packages/markdown_it/parser_core.py | 45 - .../markdown_it/parser_inline.py | 147 - .../site-packages/markdown_it/port.yaml | 48 - .../markdown_it/presets/__init__.py | 28 - .../__pycache__/__init__.cpython-312.pyc | Bin 1602 -> 0 bytes .../__pycache__/commonmark.cpython-312.pyc | Bin 1147 -> 0 bytes .../__pycache__/default.cpython-312.pyc | Bin 663 -> 0 bytes .../presets/__pycache__/zero.cpython-312.pyc | Bin 924 -> 0 bytes .../markdown_it/presets/commonmark.py | 74 - .../markdown_it/presets/default.py | 35 - .../site-packages/markdown_it/presets/zero.py | 43 - .../site-packages/markdown_it/py.typed | 1 - .../site-packages/markdown_it/renderer.py | 336 - .../site-packages/markdown_it/ruler.py | 276 - .../markdown_it/rules_block/__init__.py | 27 - .../__pycache__/__init__.cpython-312.pyc | Bin 673 -> 0 bytes .../__pycache__/blockquote.cpython-312.pyc | Bin 6908 -> 0 bytes .../__pycache__/code.cpython-312.pyc | Bin 1372 -> 0 bytes .../__pycache__/fence.cpython-312.pyc | Bin 2518 -> 0 bytes .../__pycache__/heading.cpython-312.pyc | Bin 2617 -> 0 bytes .../__pycache__/hr.cpython-312.pyc | Bin 1747 -> 0 bytes .../__pycache__/html_block.cpython-312.pyc | Bin 3606 -> 0 bytes .../__pycache__/lheading.cpython-312.pyc | Bin 2928 -> 0 bytes .../__pycache__/list.cpython-312.pyc | Bin 8029 -> 0 bytes .../__pycache__/paragraph.cpython-312.pyc | Bin 2168 -> 0 bytes .../__pycache__/reference.cpython-312.pyc | Bin 5689 -> 0 bytes .../__pycache__/state_block.cpython-312.pyc | Bin 9193 -> 0 bytes .../__pycache__/table.cpython-312.pyc | Bin 7212 -> 0 bytes .../markdown_it/rules_block/blockquote.py | 299 - .../markdown_it/rules_block/code.py | 35 - .../markdown_it/rules_block/fence.py | 101 - .../markdown_it/rules_block/heading.py | 68 - .../markdown_it/rules_block/hr.py | 55 - .../markdown_it/rules_block/html_block.py | 90 - .../markdown_it/rules_block/lheading.py | 86 - .../markdown_it/rules_block/list.py | 345 - .../markdown_it/rules_block/paragraph.py | 65 - .../markdown_it/rules_block/reference.py | 215 - .../markdown_it/rules_block/state_block.py | 261 - .../markdown_it/rules_block/table.py | 236 - .../markdown_it/rules_core/__init__.py | 19 - .../__pycache__/__init__.cpython-312.pyc | Bin 537 -> 0 bytes .../__pycache__/block.cpython-312.pyc | Bin 969 -> 0 bytes .../__pycache__/inline.cpython-312.pyc | Bin 815 -> 0 bytes .../__pycache__/linkify.cpython-312.pyc | Bin 5309 -> 0 bytes .../__pycache__/normalize.cpython-312.pyc | Bin 797 -> 0 bytes .../__pycache__/replacements.cpython-312.pyc | Bin 4925 -> 0 bytes .../__pycache__/smartquotes.cpython-312.pyc | Bin 6173 -> 0 bytes .../__pycache__/state_core.cpython-312.pyc | Bin 1079 -> 0 bytes .../__pycache__/text_join.cpython-312.pyc | Bin 1459 -> 0 bytes .../markdown_it/rules_core/block.py | 13 - .../markdown_it/rules_core/inline.py | 10 - .../markdown_it/rules_core/linkify.py | 149 - .../markdown_it/rules_core/normalize.py | 18 - .../markdown_it/rules_core/replacements.py | 126 - .../markdown_it/rules_core/smartquotes.py | 202 - .../markdown_it/rules_core/state_core.py | 25 - .../markdown_it/rules_core/text_join.py | 34 - .../markdown_it/rules_inline/__init__.py | 31 - .../__pycache__/__init__.cpython-312.pyc | Bin 804 -> 0 bytes .../__pycache__/autolink.cpython-312.pyc | Bin 2764 -> 0 bytes .../__pycache__/backticks.cpython-312.pyc | Bin 2552 -> 0 bytes .../__pycache__/balance_pairs.cpython-312.pyc | Bin 3240 -> 0 bytes .../__pycache__/emphasis.cpython-312.pyc | Bin 3860 -> 0 bytes .../__pycache__/entity.cpython-312.pyc | Bin 2453 -> 0 bytes .../__pycache__/escape.cpython-312.pyc | Bin 1910 -> 0 bytes .../fragments_join.cpython-312.pyc | Bin 1935 -> 0 bytes .../__pycache__/html_inline.cpython-312.pyc | Bin 1976 -> 0 bytes .../__pycache__/image.cpython-312.pyc | Bin 4179 -> 0 bytes .../__pycache__/link.cpython-312.pyc | Bin 4051 -> 0 bytes .../__pycache__/linkify.cpython-312.pyc | Bin 2721 -> 0 bytes .../__pycache__/newline.cpython-312.pyc | Bin 1765 -> 0 bytes .../__pycache__/state_inline.cpython-312.pyc | Bin 5961 -> 0 bytes .../__pycache__/strikethrough.cpython-312.pyc | Bin 4200 -> 0 bytes .../__pycache__/text.cpython-312.pyc | Bin 1002 -> 0 bytes .../markdown_it/rules_inline/autolink.py | 77 - .../markdown_it/rules_inline/backticks.py | 72 - .../markdown_it/rules_inline/balance_pairs.py | 137 - .../markdown_it/rules_inline/emphasis.py | 102 - .../markdown_it/rules_inline/entity.py | 53 - .../markdown_it/rules_inline/escape.py | 92 - .../rules_inline/fragments_join.py | 43 - .../markdown_it/rules_inline/html_inline.py | 43 - .../markdown_it/rules_inline/image.py | 148 - .../markdown_it/rules_inline/link.py | 151 - .../markdown_it/rules_inline/linkify.py | 61 - .../markdown_it/rules_inline/newline.py | 43 - .../markdown_it/rules_inline/state_inline.py | 166 - .../markdown_it/rules_inline/strikethrough.py | 127 - .../markdown_it/rules_inline/text.py | 53 - .../site-packages/markdown_it/token.py | 180 - .../site-packages/markdown_it/tree.py | 345 - .../site-packages/markdown_it/utils.py | 176 - .../markdown_it_py-3.0.0.dist-info/INSTALLER | 1 - .../markdown_it_py-3.0.0.dist-info/LICENSE | 21 - .../LICENSE.markdown-it | 22 - .../markdown_it_py-3.0.0.dist-info/METADATA | 205 - .../markdown_it_py-3.0.0.dist-info/RECORD | 142 - .../markdown_it_py-3.0.0.dist-info/WHEEL | 4 - .../entry_points.txt | 3 - .../INSTALLER | 1 - .../matplotlib_inline-0.1.7.dist-info/LICENSE | 29 - .../METADATA | 97 - .../matplotlib_inline-0.1.7.dist-info/RECORD | 13 - .../matplotlib_inline-0.1.7.dist-info/WHEEL | 5 - .../entry_points.txt | 2 - .../top_level.txt | 1 - .../matplotlib_inline/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 273 -> 0 bytes .../backend_inline.cpython-312.pyc | Bin 12371 -> 0 bytes .../__pycache__/config.cpython-312.pyc | Bin 4559 -> 0 bytes .../matplotlib_inline/backend_inline.py | 311 - .../site-packages/matplotlib_inline/config.py | 100 - .../mdurl-0.1.2.dist-info/INSTALLER | 1 - .../mdurl-0.1.2.dist-info/LICENSE | 46 - .../mdurl-0.1.2.dist-info/METADATA | 32 - .../mdurl-0.1.2.dist-info/RECORD | 18 - .../site-packages/mdurl-0.1.2.dist-info/WHEEL | 4 - .../site-packages/mdurl/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 635 -> 0 bytes .../mdurl/__pycache__/_decode.cpython-312.pyc | Bin 3822 -> 0 bytes .../mdurl/__pycache__/_encode.cpython-312.pyc | Bin 2872 -> 0 bytes .../mdurl/__pycache__/_format.cpython-312.pyc | Bin 1203 -> 0 bytes .../mdurl/__pycache__/_parse.cpython-312.pyc | Bin 7250 -> 0 bytes .../mdurl/__pycache__/_url.cpython-312.pyc | Bin 658 -> 0 bytes .../python3.12/site-packages/mdurl/_decode.py | 104 - .../python3.12/site-packages/mdurl/_encode.py | 85 - .../python3.12/site-packages/mdurl/_format.py | 27 - .../python3.12/site-packages/mdurl/_parse.py | 304 - .../python3.12/site-packages/mdurl/_url.py | 14 - .../python3.12/site-packages/mdurl/py.typed | 1 - .../parso-0.8.4.dist-info/AUTHORS.txt | 58 - .../parso-0.8.4.dist-info/INSTALLER | 1 - .../parso-0.8.4.dist-info/LICENSE.txt | 86 - .../parso-0.8.4.dist-info/METADATA | 287 - .../parso-0.8.4.dist-info/RECORD | 58 - .../site-packages/parso-0.8.4.dist-info/WHEEL | 6 - .../parso-0.8.4.dist-info/top_level.txt | 1 - .../site-packages/parso/__init__.py | 58 - .../__pycache__/__init__.cpython-312.pyc | Bin 1995 -> 0 bytes .../_compatibility.cpython-312.pyc | Bin 301 -> 0 bytes .../parso/__pycache__/cache.cpython-312.pyc | Bin 9926 -> 0 bytes .../parso/__pycache__/file_io.cpython-312.pyc | Bin 2292 -> 0 bytes .../parso/__pycache__/grammar.cpython-312.pyc | Bin 12677 -> 0 bytes .../__pycache__/normalizer.cpython-312.pyc | Bin 10485 -> 0 bytes .../parso/__pycache__/parser.cpython-312.pyc | Bin 10059 -> 0 bytes .../parso/__pycache__/tree.cpython-312.pyc | Bin 21361 -> 0 bytes .../parso/__pycache__/utils.cpython-312.pyc | Bin 7614 -> 0 bytes .../site-packages/parso/_compatibility.py | 3 - .../python3.12/site-packages/parso/cache.py | 275 - .../python3.12/site-packages/parso/file_io.py | 38 - .../python3.12/site-packages/parso/grammar.py | 264 - .../site-packages/parso/normalizer.py | 198 - .../python3.12/site-packages/parso/parser.py | 210 - .../site-packages/parso/pgen2/__init__.py | 10 - .../__pycache__/__init__.cpython-312.pyc | Bin 246 -> 0 bytes .../__pycache__/generator.cpython-312.pyc | Bin 15407 -> 0 bytes .../grammar_parser.cpython-312.pyc | Bin 8290 -> 0 bytes .../site-packages/parso/pgen2/generator.py | 382 - .../parso/pgen2/grammar_parser.py | 160 - .../python3.12/site-packages/parso/py.typed | 0 .../site-packages/parso/python/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 180 -> 0 bytes .../python/__pycache__/diff.cpython-312.pyc | Bin 35711 -> 0 bytes .../python/__pycache__/errors.cpython-312.pyc | Bin 62059 -> 0 bytes .../python/__pycache__/parser.cpython-312.pyc | Bin 9437 -> 0 bytes .../python/__pycache__/pep8.cpython-312.pyc | Bin 34586 -> 0 bytes .../python/__pycache__/prefix.cpython-312.pyc | Bin 4327 -> 0 bytes .../python/__pycache__/token.cpython-312.pyc | Bin 1692 -> 0 bytes .../__pycache__/tokenize.cpython-312.pyc | Bin 24157 -> 0 bytes .../python/__pycache__/tree.cpython-312.pyc | Bin 54259 -> 0 bytes .../site-packages/parso/python/diff.py | 886 -- .../site-packages/parso/python/errors.py | 1326 --- .../site-packages/parso/python/grammar310.txt | 169 - .../site-packages/parso/python/grammar311.txt | 169 - .../site-packages/parso/python/grammar312.txt | 169 - .../site-packages/parso/python/grammar313.txt | 169 - .../site-packages/parso/python/grammar36.txt | 158 - .../site-packages/parso/python/grammar37.txt | 156 - .../site-packages/parso/python/grammar38.txt | 171 - .../site-packages/parso/python/grammar39.txt | 169 - .../site-packages/parso/python/parser.py | 206 - .../site-packages/parso/python/pep8.py | 767 -- .../site-packages/parso/python/prefix.py | 106 - .../site-packages/parso/python/token.py | 31 - .../site-packages/parso/python/tokenize.py | 687 -- .../site-packages/parso/python/tree.py | 1245 --- .../python3.12/site-packages/parso/tree.py | 488 - .../python3.12/site-packages/parso/utils.py | 194 - .../pexpect-4.9.0.dist-info/INSTALLER | 1 - .../pexpect-4.9.0.dist-info/LICENSE | 20 - .../pexpect-4.9.0.dist-info/METADATA | 52 - .../pexpect-4.9.0.dist-info/RECORD | 43 - .../pexpect-4.9.0.dist-info/WHEEL | 6 - .../pexpect-4.9.0.dist-info/top_level.txt | 1 - .../python3.12/site-packages/pexpect/ANSI.py | 351 - .../python3.12/site-packages/pexpect/FSM.py | 334 - .../site-packages/pexpect/__init__.py | 91 - .../pexpect/__pycache__/ANSI.cpython-312.pyc | Bin 18960 -> 0 bytes .../pexpect/__pycache__/FSM.cpython-312.pyc | Bin 15631 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 4273 -> 0 bytes .../__pycache__/_async.cpython-312.pyc | Bin 937 -> 0 bytes .../_async_pre_await.cpython-312.pyc | Bin 6510 -> 0 bytes .../_async_w_await.cpython-312.pyc | Bin 6608 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2203 -> 0 bytes .../__pycache__/expect.cpython-312.pyc | Bin 16123 -> 0 bytes .../__pycache__/fdpexpect.cpython-312.pyc | Bin 7447 -> 0 bytes .../__pycache__/popen_spawn.cpython-312.pyc | Bin 8433 -> 0 bytes .../__pycache__/pty_spawn.cpython-312.pyc | Bin 42365 -> 0 bytes .../pexpect/__pycache__/pxssh.cpython-312.pyc | Bin 21600 -> 0 bytes .../__pycache__/replwrap.cpython-312.pyc | Bin 7020 -> 0 bytes .../pexpect/__pycache__/run.cpython-312.pyc | Bin 7157 -> 0 bytes .../__pycache__/screen.cpython-312.pyc | Bin 19957 -> 0 bytes .../socket_pexpect.cpython-312.pyc | Bin 6811 -> 0 bytes .../__pycache__/spawnbase.cpython-312.pyc | Bin 23615 -> 0 bytes .../pexpect/__pycache__/utils.cpython-312.pyc | Bin 5995 -> 0 bytes .../site-packages/pexpect/_async.py | 28 - .../site-packages/pexpect/_async_pre_await.py | 111 - .../site-packages/pexpect/_async_w_await.py | 118 - .../site-packages/pexpect/bashrc.sh | 18 - .../site-packages/pexpect/exceptions.py | 35 - .../site-packages/pexpect/expect.py | 371 - .../site-packages/pexpect/fdpexpect.py | 152 - .../site-packages/pexpect/popen_spawn.py | 188 - .../site-packages/pexpect/pty_spawn.py | 860 -- .../python3.12/site-packages/pexpect/pxssh.py | 540 -- .../site-packages/pexpect/replwrap.py | 136 - .../python3.12/site-packages/pexpect/run.py | 157 - .../site-packages/pexpect/screen.py | 431 - .../site-packages/pexpect/socket_pexpect.py | 145 - .../site-packages/pexpect/spawnbase.py | 536 - .../python3.12/site-packages/pexpect/utils.py | 187 - .../python3.12/site-packages/pip/__init__.py | 13 - .../python3.12/site-packages/pip/__main__.py | 24 - .../site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-312.pyc | Bin 680 -> 0 bytes .../pip/__pycache__/__main__.cpython-312.pyc | Bin 836 -> 0 bytes .../__pip-runner__.cpython-312.pyc | Bin 2199 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 782 -> 0 bytes .../__pycache__/build_env.cpython-312.pyc | Bin 14289 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 12660 -> 0 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 17661 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 33279 -> 0 bytes .../__pycache__/main.cpython-312.pyc | Bin 665 -> 0 bytes .../__pycache__/pyproject.cpython-312.pyc | Bin 4966 -> 0 bytes .../self_outdated_check.cpython-312.pyc | Bin 10547 -> 0 bytes .../__pycache__/wheel_builder.cpython-312.pyc | Bin 13644 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 311 - .../site-packages/pip/_internal/cache.py | 290 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-312.pyc | Bin 273 -> 0 bytes .../autocompletion.cpython-312.pyc | Bin 8460 -> 0 bytes .../__pycache__/base_command.cpython-312.pyc | Bin 10450 -> 0 bytes .../__pycache__/cmdoptions.cpython-312.pyc | Bin 30369 -> 0 bytes .../command_context.cpython-312.pyc | Bin 1776 -> 0 bytes .../cli/__pycache__/main.cpython-312.pyc | Bin 2293 -> 0 bytes .../__pycache__/main_parser.cpython-312.pyc | Bin 4900 -> 0 bytes .../cli/__pycache__/parser.cpython-312.pyc | Bin 15017 -> 0 bytes .../__pycache__/progress_bars.cpython-312.pyc | Bin 2615 -> 0 bytes .../__pycache__/req_command.cpython-312.pyc | Bin 18847 -> 0 bytes .../cli/__pycache__/spinners.cpython-312.pyc | Bin 7835 -> 0 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 370 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 172 - .../pip/_internal/cli/base_command.py | 236 - .../pip/_internal/cli/cmdoptions.py | 1074 -- .../pip/_internal/cli/command_context.py | 27 - .../site-packages/pip/_internal/cli/main.py | 79 - .../pip/_internal/cli/main_parser.py | 134 - .../site-packages/pip/_internal/cli/parser.py | 294 - .../pip/_internal/cli/progress_bars.py | 68 - .../pip/_internal/cli/req_command.py | 505 - .../pip/_internal/cli/spinners.py | 159 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 132 - .../__pycache__/__init__.cpython-312.pyc | Bin 3997 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 9706 -> 0 bytes .../__pycache__/check.cpython-312.pyc | Bin 2085 -> 0 bytes .../__pycache__/completion.cpython-312.pyc | Bin 5187 -> 0 bytes .../__pycache__/configuration.cpython-312.pyc | Bin 13207 -> 0 bytes .../__pycache__/debug.cpython-312.pyc | Bin 10156 -> 0 bytes .../__pycache__/download.cpython-312.pyc | Bin 7584 -> 0 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 4411 -> 0 bytes .../commands/__pycache__/hash.cpython-312.pyc | Bin 2978 -> 0 bytes .../commands/__pycache__/help.cpython-312.pyc | Bin 1668 -> 0 bytes .../__pycache__/index.cpython-312.pyc | Bin 6715 -> 0 bytes .../__pycache__/inspect.cpython-312.pyc | Bin 3970 -> 0 bytes .../__pycache__/install.cpython-312.pyc | Bin 28908 -> 0 bytes .../commands/__pycache__/list.cpython-312.pyc | Bin 15651 -> 0 bytes .../__pycache__/search.cpython-312.pyc | Bin 7616 -> 0 bytes .../commands/__pycache__/show.cpython-312.pyc | Bin 9723 -> 0 bytes .../__pycache__/uninstall.cpython-312.pyc | Bin 4721 -> 0 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 8951 -> 0 bytes .../pip/_internal/commands/cache.py | 225 - .../pip/_internal/commands/check.py | 54 - .../pip/_internal/commands/completion.py | 130 - .../pip/_internal/commands/configuration.py | 280 - .../pip/_internal/commands/debug.py | 201 - .../pip/_internal/commands/download.py | 147 - .../pip/_internal/commands/freeze.py | 109 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 139 - .../pip/_internal/commands/inspect.py | 92 - .../pip/_internal/commands/install.py | 774 -- .../pip/_internal/commands/list.py | 370 - .../pip/_internal/commands/search.py | 174 - .../pip/_internal/commands/show.py | 189 - .../pip/_internal/commands/uninstall.py | 113 - .../pip/_internal/commands/wheel.py | 183 - .../pip/_internal/configuration.py | 383 - .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-312.pyc | Bin 936 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 2857 -> 0 bytes .../__pycache__/installed.cpython-312.pyc | Bin 1695 -> 0 bytes .../__pycache__/sdist.cpython-312.pyc | Bin 8483 -> 0 bytes .../__pycache__/wheel.cpython-312.pyc | Bin 2243 -> 0 bytes .../pip/_internal/distributions/base.py | 51 - .../pip/_internal/distributions/installed.py | 29 - .../pip/_internal/distributions/sdist.py | 156 - .../pip/_internal/distributions/wheel.py | 40 - .../site-packages/pip/_internal/exceptions.py | 728 -- .../pip/_internal/index/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 227 -> 0 bytes .../__pycache__/collector.cpython-312.pyc | Bin 21881 -> 0 bytes .../package_finder.cpython-312.pyc | Bin 40730 -> 0 bytes .../index/__pycache__/sources.cpython-312.pyc | Bin 12599 -> 0 bytes .../pip/_internal/index/collector.py | 507 - .../pip/_internal/index/package_finder.py | 1027 -- .../pip/_internal/index/sources.py | 285 - .../pip/_internal/locations/__init__.py | 467 - .../__pycache__/__init__.cpython-312.pyc | Bin 16771 -> 0 bytes .../__pycache__/_distutils.cpython-312.pyc | Bin 6851 -> 0 bytes .../__pycache__/_sysconfig.cpython-312.pyc | Bin 8006 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 3776 -> 0 bytes .../pip/_internal/locations/_distutils.py | 172 - .../pip/_internal/locations/_sysconfig.py | 213 - .../pip/_internal/locations/base.py | 81 - .../site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 128 - .../__pycache__/__init__.cpython-312.pyc | Bin 5877 -> 0 bytes .../__pycache__/_json.cpython-312.pyc | Bin 2870 -> 0 bytes .../metadata/__pycache__/base.cpython-312.pyc | Bin 35707 -> 0 bytes .../__pycache__/pkg_resources.cpython-312.pyc | Bin 15785 -> 0 bytes .../pip/_internal/metadata/_json.py | 84 - .../pip/_internal/metadata/base.py | 702 -- .../_internal/metadata/importlib/__init__.py | 6 - .../__pycache__/__init__.cpython-312.pyc | Bin 353 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 3328 -> 0 bytes .../__pycache__/_dists.cpython-312.pyc | Bin 13420 -> 0 bytes .../__pycache__/_envs.cpython-312.pyc | Bin 11175 -> 0 bytes .../_internal/metadata/importlib/_compat.py | 55 - .../_internal/metadata/importlib/_dists.py | 227 - .../pip/_internal/metadata/importlib/_envs.py | 189 - .../pip/_internal/metadata/pkg_resources.py | 278 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 261 -> 0 bytes .../__pycache__/candidate.cpython-312.pyc | Bin 1900 -> 0 bytes .../__pycache__/direct_url.cpython-312.pyc | Bin 11194 -> 0 bytes .../format_control.cpython-312.pyc | Bin 4222 -> 0 bytes .../models/__pycache__/index.cpython-312.pyc | Bin 1689 -> 0 bytes .../installation_report.cpython-312.pyc | Bin 2267 -> 0 bytes .../models/__pycache__/link.cpython-312.pyc | Bin 25997 -> 0 bytes .../models/__pycache__/scheme.cpython-312.pyc | Bin 1164 -> 0 bytes .../__pycache__/search_scope.cpython-312.pyc | Bin 5083 -> 0 bytes .../selection_prefs.cpython-312.pyc | Bin 1846 -> 0 bytes .../__pycache__/target_python.cpython-312.pyc | Bin 4949 -> 0 bytes .../models/__pycache__/wheel.cpython-312.pyc | Bin 5775 -> 0 bytes .../pip/_internal/models/candidate.py | 30 - .../pip/_internal/models/direct_url.py | 235 - .../pip/_internal/models/format_control.py | 78 - .../pip/_internal/models/index.py | 28 - .../_internal/models/installation_report.py | 56 - .../pip/_internal/models/link.py | 579 -- .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 132 - .../pip/_internal/models/selection_prefs.py | 51 - .../pip/_internal/models/target_python.py | 122 - .../pip/_internal/models/wheel.py | 92 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 249 -> 0 bytes .../network/__pycache__/auth.cpython-312.pyc | Bin 21991 -> 0 bytes .../network/__pycache__/cache.cpython-312.pyc | Bin 6513 -> 0 bytes .../__pycache__/download.cpython-312.pyc | Bin 8548 -> 0 bytes .../__pycache__/lazy_wheel.cpython-312.pyc | Bin 11658 -> 0 bytes .../__pycache__/session.cpython-312.pyc | Bin 18769 -> 0 bytes .../network/__pycache__/utils.cpython-312.pyc | Bin 2248 -> 0 bytes .../__pycache__/xmlrpc.cpython-312.pyc | Bin 2944 -> 0 bytes .../pip/_internal/network/auth.py | 561 -- .../pip/_internal/network/cache.py | 106 - .../pip/_internal/network/download.py | 186 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 520 - .../pip/_internal/network/utils.py | 96 - .../pip/_internal/network/xmlrpc.py | 62 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 192 -> 0 bytes .../__pycache__/check.cpython-312.pyc | Bin 7574 -> 0 bytes .../__pycache__/freeze.cpython-312.pyc | Bin 10112 -> 0 bytes .../__pycache__/prepare.cpython-312.pyc | Bin 25742 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 198 -> 0 bytes .../__pycache__/build_tracker.cpython-312.pyc | Bin 7818 -> 0 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 1875 -> 0 bytes .../metadata_editable.cpython-312.pyc | Bin 1909 -> 0 bytes .../metadata_legacy.cpython-312.pyc | Bin 3060 -> 0 bytes .../build/__pycache__/wheel.cpython-312.pyc | Bin 1679 -> 0 bytes .../wheel_editable.cpython-312.pyc | Bin 2020 -> 0 bytes .../__pycache__/wheel_legacy.cpython-312.pyc | Bin 3924 -> 0 bytes .../operations/build/build_tracker.py | 139 - .../_internal/operations/build/metadata.py | 39 - .../operations/build/metadata_editable.py | 41 - .../operations/build/metadata_legacy.py | 74 - .../pip/_internal/operations/build/wheel.py | 37 - .../operations/build/wheel_editable.py | 46 - .../operations/build/wheel_legacy.py | 102 - .../pip/_internal/operations/check.py | 187 - .../pip/_internal/operations/freeze.py | 255 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-312.pyc | Bin 261 -> 0 bytes .../editable_legacy.cpython-312.pyc | Bin 1812 -> 0 bytes .../install/__pycache__/wheel.cpython-312.pyc | Bin 33854 -> 0 bytes .../operations/install/editable_legacy.py | 46 - .../pip/_internal/operations/install/wheel.py | 734 -- .../pip/_internal/operations/prepare.py | 730 -- .../site-packages/pip/_internal/pyproject.py | 179 - .../pip/_internal/req/__init__.py | 92 - .../req/__pycache__/__init__.cpython-312.pyc | Bin 3738 -> 0 bytes .../__pycache__/constructors.cpython-312.pyc | Bin 21577 -> 0 bytes .../req/__pycache__/req_file.cpython-312.pyc | Bin 21456 -> 0 bytes .../__pycache__/req_install.cpython-312.pyc | Bin 38409 -> 0 bytes .../req/__pycache__/req_set.cpython-312.pyc | Bin 7213 -> 0 bytes .../__pycache__/req_uninstall.cpython-312.pyc | Bin 32972 -> 0 bytes .../pip/_internal/req/constructors.py | 576 -- .../pip/_internal/req/req_file.py | 554 -- .../pip/_internal/req/req_install.py | 923 -- .../pip/_internal/req/req_set.py | 119 - .../pip/_internal/req/req_uninstall.py | 649 -- .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 192 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 1180 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 199 -> 0 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 22434 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 598 -- .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 203 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 8332 -> 0 bytes .../__pycache__/candidates.cpython-312.pyc | Bin 30393 -> 0 bytes .../__pycache__/factory.cpython-312.pyc | Bin 32109 -> 0 bytes .../found_candidates.cpython-312.pyc | Bin 6203 -> 0 bytes .../__pycache__/provider.cpython-312.pyc | Bin 10373 -> 0 bytes .../__pycache__/reporter.cpython-312.pyc | Bin 4930 -> 0 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 11424 -> 0 bytes .../__pycache__/resolver.cpython-312.pyc | Bin 12346 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 141 - .../resolution/resolvelib/candidates.py | 597 -- .../resolution/resolvelib/factory.py | 812 -- .../resolution/resolvelib/found_candidates.py | 155 - .../resolution/resolvelib/provider.py | 255 - .../resolution/resolvelib/reporter.py | 80 - .../resolution/resolvelib/requirements.py | 166 - .../resolution/resolvelib/resolver.py | 317 - .../pip/_internal/self_outdated_check.py | 248 - .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 187 -> 0 bytes .../__pycache__/_jaraco_text.cpython-312.pyc | Bin 4528 -> 0 bytes .../utils/__pycache__/_log.cpython-312.pyc | Bin 1858 -> 0 bytes .../utils/__pycache__/appdirs.cpython-312.pyc | Bin 2402 -> 0 bytes .../utils/__pycache__/compat.cpython-312.pyc | Bin 2205 -> 0 bytes .../compatibility_tags.cpython-312.pyc | Bin 5553 -> 0 bytes .../__pycache__/datetime.cpython-312.pyc | Bin 676 -> 0 bytes .../__pycache__/deprecation.cpython-312.pyc | Bin 4178 -> 0 bytes .../direct_url_helpers.cpython-312.pyc | Bin 3555 -> 0 bytes .../__pycache__/egg_link.cpython-312.pyc | Bin 3218 -> 0 bytes .../__pycache__/encoding.cpython-312.pyc | Bin 2150 -> 0 bytes .../__pycache__/entrypoints.cpython-312.pyc | Bin 3985 -> 0 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 7450 -> 0 bytes .../__pycache__/filetypes.cpython-312.pyc | Bin 1156 -> 0 bytes .../utils/__pycache__/glibc.cpython-312.pyc | Bin 2334 -> 0 bytes .../utils/__pycache__/hashes.cpython-312.pyc | Bin 7546 -> 0 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 13549 -> 0 bytes .../utils/__pycache__/misc.cpython-312.pyc | Bin 34113 -> 0 bytes .../utils/__pycache__/models.cpython-312.pyc | Bin 2704 -> 0 bytes .../__pycache__/packaging.cpython-312.pyc | Bin 2575 -> 0 bytes .../setuptools_build.cpython-312.pyc | Bin 4542 -> 0 bytes .../__pycache__/subprocess.cpython-312.pyc | Bin 8710 -> 0 bytes .../__pycache__/temp_dir.cpython-312.pyc | Bin 12054 -> 0 bytes .../__pycache__/unpacking.cpython-312.pyc | Bin 11100 -> 0 bytes .../utils/__pycache__/urls.cpython-312.pyc | Bin 2397 -> 0 bytes .../__pycache__/virtualenv.cpython-312.pyc | Bin 4472 -> 0 bytes .../utils/__pycache__/wheel.cpython-312.pyc | Bin 5918 -> 0 bytes .../pip/_internal/utils/_jaraco_text.py | 109 - .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 52 - .../pip/_internal/utils/compat.py | 63 - .../pip/_internal/utils/compatibility_tags.py | 165 - .../pip/_internal/utils/datetime.py | 11 - .../pip/_internal/utils/deprecation.py | 120 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/egg_link.py | 80 - .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 84 - .../pip/_internal/utils/filesystem.py | 153 - .../pip/_internal/utils/filetypes.py | 27 - .../pip/_internal/utils/glibc.py | 88 - .../pip/_internal/utils/hashes.py | 151 - .../pip/_internal/utils/logging.py | 348 - .../site-packages/pip/_internal/utils/misc.py | 783 -- .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 57 - .../pip/_internal/utils/setuptools_build.py | 146 - .../pip/_internal/utils/subprocess.py | 260 - .../pip/_internal/utils/temp_dir.py | 296 - .../pip/_internal/utils/unpacking.py | 257 - .../site-packages/pip/_internal/utils/urls.py | 62 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 134 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-312.pyc | Bin 526 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-312.pyc | Bin 5018 -> 0 bytes .../vcs/__pycache__/git.cpython-312.pyc | Bin 18987 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-312.pyc | Bin 7607 -> 0 bytes .../__pycache__/subversion.cpython-312.pyc | Bin 12479 -> 0 bytes .../versioncontrol.cpython-312.pyc | Bin 29005 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 112 - .../site-packages/pip/_internal/vcs/git.py | 526 - .../pip/_internal/vcs/mercurial.py | 163 - .../pip/_internal/vcs/subversion.py | 324 - .../pip/_internal/vcs/versioncontrol.py | 705 -- .../pip/_internal/wheel_builder.py | 354 - .../site-packages/pip/_vendor/__init__.py | 121 - .../__pycache__/__init__.cpython-312.pyc | Bin 4688 -> 0 bytes .../_vendor/__pycache__/six.cpython-312.pyc | Bin 41265 -> 0 bytes .../typing_extensions.cpython-312.pyc | Bin 122045 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 28 - .../__pycache__/__init__.cpython-312.pyc | Bin 898 -> 0 bytes .../__pycache__/_cmd.cpython-312.pyc | Bin 2642 -> 0 bytes .../__pycache__/adapter.cpython-312.pyc | Bin 6460 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 3805 -> 0 bytes .../__pycache__/controller.cpython-312.pyc | Bin 16163 -> 0 bytes .../__pycache__/filewrapper.cpython-312.pyc | Bin 4343 -> 0 bytes .../__pycache__/heuristics.cpython-312.pyc | Bin 6690 -> 0 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 6401 -> 0 bytes .../__pycache__/wrapper.cpython-312.pyc | Bin 1670 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 70 - .../pip/_vendor/cachecontrol/adapter.py | 161 - .../pip/_vendor/cachecontrol/cache.py | 74 - .../_vendor/cachecontrol/caches/__init__.py | 8 - .../__pycache__/__init__.cpython-312.pyc | Bin 431 -> 0 bytes .../__pycache__/file_cache.cpython-312.pyc | Bin 7706 -> 0 bytes .../__pycache__/redis_cache.cpython-312.pyc | Bin 2734 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 181 - .../cachecontrol/caches/redis_cache.py | 48 - .../pip/_vendor/cachecontrol/controller.py | 494 - .../pip/_vendor/cachecontrol/filewrapper.py | 119 - .../pip/_vendor/cachecontrol/heuristics.py | 154 - .../pip/_vendor/cachecontrol/serialize.py | 206 - .../pip/_vendor/cachecontrol/wrapper.py | 43 - .../pip/_vendor/certifi/__init__.py | 4 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-312.pyc | Bin 314 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 641 -> 0 bytes .../certifi/__pycache__/core.cpython-312.pyc | Bin 3323 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4635 --------- .../site-packages/pip/_vendor/certifi/core.py | 119 - .../pip/_vendor/chardet/__init__.py | 115 - .../__pycache__/__init__.cpython-312.pyc | Bin 4564 -> 0 bytes .../__pycache__/big5freq.cpython-312.pyc | Bin 27195 -> 0 bytes .../__pycache__/big5prober.cpython-312.pyc | Bin 1383 -> 0 bytes .../chardistribution.cpython-312.pyc | Bin 9634 -> 0 bytes .../charsetgroupprober.cpython-312.pyc | Bin 4118 -> 0 bytes .../__pycache__/charsetprober.cpython-312.pyc | Bin 5014 -> 0 bytes .../codingstatemachine.cpython-312.pyc | Bin 3874 -> 0 bytes .../codingstatemachinedict.cpython-312.pyc | Bin 785 -> 0 bytes .../__pycache__/cp949prober.cpython-312.pyc | Bin 1392 -> 0 bytes .../chardet/__pycache__/enums.cpython-312.pyc | Bin 2992 -> 0 bytes .../__pycache__/escprober.cpython-312.pyc | Bin 4562 -> 0 bytes .../chardet/__pycache__/escsm.cpython-312.pyc | Bin 15306 -> 0 bytes .../__pycache__/eucjpprober.cpython-312.pyc | Bin 4379 -> 0 bytes .../__pycache__/euckrfreq.cpython-312.pyc | Bin 12078 -> 0 bytes .../__pycache__/euckrprober.cpython-312.pyc | Bin 1386 -> 0 bytes .../__pycache__/euctwfreq.cpython-312.pyc | Bin 27200 -> 0 bytes .../__pycache__/euctwprober.cpython-312.pyc | Bin 1386 -> 0 bytes .../__pycache__/gb2312freq.cpython-312.pyc | Bin 19122 -> 0 bytes .../__pycache__/gb2312prober.cpython-312.pyc | Bin 1399 -> 0 bytes .../__pycache__/hebrewprober.cpython-312.pyc | Bin 5818 -> 0 bytes .../__pycache__/jisfreq.cpython-312.pyc | Bin 22151 -> 0 bytes .../__pycache__/johabfreq.cpython-312.pyc | Bin 82999 -> 0 bytes .../__pycache__/johabprober.cpython-312.pyc | Bin 1390 -> 0 bytes .../__pycache__/jpcntx.cpython-312.pyc | Bin 39545 -> 0 bytes .../langbulgarianmodel.cpython-312.pyc | Bin 83118 -> 0 bytes .../langgreekmodel.cpython-312.pyc | Bin 76984 -> 0 bytes .../langhebrewmodel.cpython-312.pyc | Bin 77495 -> 0 bytes .../langhungarianmodel.cpython-312.pyc | Bin 83072 -> 0 bytes .../langrussianmodel.cpython-312.pyc | Bin 105247 -> 0 bytes .../__pycache__/langthaimodel.cpython-312.pyc | Bin 77673 -> 0 bytes .../langturkishmodel.cpython-312.pyc | Bin 77512 -> 0 bytes .../__pycache__/latin1prober.cpython-312.pyc | Bin 6998 -> 0 bytes .../macromanprober.cpython-312.pyc | Bin 7178 -> 0 bytes .../mbcharsetprober.cpython-312.pyc | Bin 3899 -> 0 bytes .../mbcsgroupprober.cpython-312.pyc | Bin 1584 -> 0 bytes .../__pycache__/mbcssm.cpython-312.pyc | Bin 38641 -> 0 bytes .../__pycache__/resultdict.cpython-312.pyc | Bin 628 -> 0 bytes .../sbcharsetprober.cpython-312.pyc | Bin 6383 -> 0 bytes .../sbcsgroupprober.cpython-312.pyc | Bin 2353 -> 0 bytes .../__pycache__/sjisprober.cpython-312.pyc | Bin 4491 -> 0 bytes .../universaldetector.cpython-312.pyc | Bin 12265 -> 0 bytes .../__pycache__/utf1632prober.cpython-312.pyc | Bin 9975 -> 0 bytes .../__pycache__/utf8prober.cpython-312.pyc | Bin 3171 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 484 -> 0 bytes .../pip/_vendor/chardet/big5freq.py | 386 - .../pip/_vendor/chardet/big5prober.py | 47 - .../pip/_vendor/chardet/chardistribution.py | 261 - .../pip/_vendor/chardet/charsetgroupprober.py | 106 - .../pip/_vendor/chardet/charsetprober.py | 147 - .../pip/_vendor/chardet/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-312.pyc | Bin 191 -> 0 bytes .../__pycache__/chardetect.cpython-312.pyc | Bin 4008 -> 0 bytes .../pip/_vendor/chardet/cli/chardetect.py | 112 - .../pip/_vendor/chardet/codingstatemachine.py | 90 - .../_vendor/chardet/codingstatemachinedict.py | 19 - .../pip/_vendor/chardet/cp949prober.py | 49 - .../pip/_vendor/chardet/enums.py | 85 - .../pip/_vendor/chardet/escprober.py | 102 - .../pip/_vendor/chardet/escsm.py | 261 - .../pip/_vendor/chardet/eucjpprober.py | 102 - .../pip/_vendor/chardet/euckrfreq.py | 196 - .../pip/_vendor/chardet/euckrprober.py | 47 - .../pip/_vendor/chardet/euctwfreq.py | 388 - .../pip/_vendor/chardet/euctwprober.py | 47 - .../pip/_vendor/chardet/gb2312freq.py | 284 - .../pip/_vendor/chardet/gb2312prober.py | 47 - .../pip/_vendor/chardet/hebrewprober.py | 316 - .../pip/_vendor/chardet/jisfreq.py | 325 - .../pip/_vendor/chardet/johabfreq.py | 2382 ----- .../pip/_vendor/chardet/johabprober.py | 47 - .../pip/_vendor/chardet/jpcntx.py | 238 - .../pip/_vendor/chardet/langbulgarianmodel.py | 4649 --------- .../pip/_vendor/chardet/langgreekmodel.py | 4397 --------- .../pip/_vendor/chardet/langhebrewmodel.py | 4380 --------- .../pip/_vendor/chardet/langhungarianmodel.py | 4649 --------- .../pip/_vendor/chardet/langrussianmodel.py | 5725 ----------- .../pip/_vendor/chardet/langthaimodel.py | 4380 --------- .../pip/_vendor/chardet/langturkishmodel.py | 4380 --------- .../pip/_vendor/chardet/latin1prober.py | 147 - .../pip/_vendor/chardet/macromanprober.py | 162 - .../pip/_vendor/chardet/mbcharsetprober.py | 95 - .../pip/_vendor/chardet/mbcsgroupprober.py | 57 - .../pip/_vendor/chardet/mbcssm.py | 661 -- .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 196 -> 0 bytes .../__pycache__/languages.cpython-312.pyc | Bin 9751 -> 0 bytes .../pip/_vendor/chardet/metadata/languages.py | 352 - .../pip/_vendor/chardet/resultdict.py | 16 - .../pip/_vendor/chardet/sbcharsetprober.py | 162 - .../pip/_vendor/chardet/sbcsgroupprober.py | 88 - .../pip/_vendor/chardet/sjisprober.py | 105 - .../pip/_vendor/chardet/universaldetector.py | 362 - .../pip/_vendor/chardet/utf1632prober.py | 225 - .../pip/_vendor/chardet/utf8prober.py | 82 - .../pip/_vendor/chardet/version.py | 9 - .../pip/_vendor/colorama/__init__.py | 7 - .../__pycache__/__init__.cpython-312.pyc | Bin 488 -> 0 bytes .../colorama/__pycache__/ansi.cpython-312.pyc | Bin 3946 -> 0 bytes .../__pycache__/ansitowin32.cpython-312.pyc | Bin 16417 -> 0 bytes .../__pycache__/initialise.cpython-312.pyc | Bin 3546 -> 0 bytes .../__pycache__/win32.cpython-312.pyc | Bin 8122 -> 0 bytes .../__pycache__/winterm.cpython-312.pyc | Bin 9084 -> 0 bytes .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 277 - .../pip/_vendor/colorama/initialise.py | 121 - .../pip/_vendor/colorama/tests/__init__.py | 1 - .../__pycache__/__init__.cpython-312.pyc | Bin 194 -> 0 bytes .../__pycache__/ansi_test.cpython-312.pyc | Bin 5463 -> 0 bytes .../ansitowin32_test.cpython-312.pyc | Bin 18099 -> 0 bytes .../initialise_test.cpython-312.pyc | Bin 11744 -> 0 bytes .../__pycache__/isatty_test.cpython-312.pyc | Bin 4900 -> 0 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 2484 -> 0 bytes .../__pycache__/winterm_test.cpython-312.pyc | Bin 6608 -> 0 bytes .../pip/_vendor/colorama/tests/ansi_test.py | 76 - .../colorama/tests/ansitowin32_test.py | 294 - .../_vendor/colorama/tests/initialise_test.py | 189 - .../pip/_vendor/colorama/tests/isatty_test.py | 57 - .../pip/_vendor/colorama/tests/utils.py | 49 - .../_vendor/colorama/tests/winterm_test.py | 131 - .../pip/_vendor/colorama/win32.py | 180 - .../pip/_vendor/colorama/winterm.py | 195 - .../pip/_vendor/distlib/__init__.py | 33 - .../__pycache__/__init__.cpython-312.pyc | Bin 1265 -> 0 bytes .../__pycache__/compat.cpython-312.pyc | Bin 45601 -> 0 bytes .../__pycache__/database.cpython-312.pyc | Bin 66023 -> 0 bytes .../distlib/__pycache__/index.cpython-312.pyc | Bin 24362 -> 0 bytes .../__pycache__/locators.cpython-312.pyc | Bin 60154 -> 0 bytes .../__pycache__/manifest.cpython-312.pyc | Bin 15121 -> 0 bytes .../__pycache__/markers.cpython-312.pyc | Bin 7678 -> 0 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 41795 -> 0 bytes .../__pycache__/resources.cpython-312.pyc | Bin 17321 -> 0 bytes .../__pycache__/scripts.cpython-312.pyc | Bin 19576 -> 0 bytes .../distlib/__pycache__/util.cpython-312.pyc | Bin 88252 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 30362 -> 0 bytes .../distlib/__pycache__/wheel.cpython-312.pyc | Bin 51857 -> 0 bytes .../pip/_vendor/distlib/compat.py | 1138 --- .../pip/_vendor/distlib/database.py | 1359 --- .../pip/_vendor/distlib/index.py | 508 - .../pip/_vendor/distlib/locators.py | 1303 --- .../pip/_vendor/distlib/manifest.py | 384 - .../pip/_vendor/distlib/markers.py | 167 - .../pip/_vendor/distlib/metadata.py | 1068 -- .../pip/_vendor/distlib/resources.py | 358 - .../pip/_vendor/distlib/scripts.py | 452 - .../site-packages/pip/_vendor/distlib/util.py | 2025 ---- .../pip/_vendor/distlib/version.py | 751 -- .../pip/_vendor/distlib/wheel.py | 1099 --- .../pip/_vendor/distro/__init__.py | 54 - .../pip/_vendor/distro/__main__.py | 4 - .../__pycache__/__init__.cpython-312.pyc | Bin 956 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 288 -> 0 bytes .../distro/__pycache__/distro.cpython-312.pyc | Bin 53750 -> 0 bytes .../pip/_vendor/distro/distro.py | 1399 --- .../pip/_vendor/idna/__init__.py | 44 - .../idna/__pycache__/__init__.cpython-312.pyc | Bin 877 -> 0 bytes .../idna/__pycache__/codec.cpython-312.pyc | Bin 4629 -> 0 bytes .../idna/__pycache__/compat.cpython-312.pyc | Bin 883 -> 0 bytes .../idna/__pycache__/core.cpython-312.pyc | Bin 16278 -> 0 bytes .../idna/__pycache__/idnadata.cpython-312.pyc | Bin 38378 -> 0 bytes .../__pycache__/intranges.cpython-312.pyc | Bin 2634 -> 0 bytes .../__pycache__/package_data.cpython-312.pyc | Bin 212 -> 0 bytes .../__pycache__/uts46data.cpython-312.pyc | Bin 158866 -> 0 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 - .../site-packages/pip/_vendor/idna/compat.py | 13 - .../site-packages/pip/_vendor/idna/core.py | 400 - .../pip/_vendor/idna/idnadata.py | 2151 ----- .../pip/_vendor/idna/intranges.py | 54 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8600 ----------------- .../pip/_vendor/msgpack/__init__.py | 57 - .../__pycache__/__init__.cpython-312.pyc | Bin 1827 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 2021 -> 0 bytes .../msgpack/__pycache__/ext.cpython-312.pyc | Bin 8664 -> 0 bytes .../__pycache__/fallback.cpython-312.pyc | Bin 43572 -> 0 bytes .../pip/_vendor/msgpack/exceptions.py | 48 - .../site-packages/pip/_vendor/msgpack/ext.py | 193 - .../pip/_vendor/msgpack/fallback.py | 1010 -- .../pip/_vendor/packaging/__about__.py | 26 - .../pip/_vendor/packaging/__init__.py | 25 - .../__pycache__/__about__.cpython-312.pyc | Bin 626 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 462 -> 0 bytes .../__pycache__/_manylinux.cpython-312.pyc | Bin 12072 -> 0 bytes .../__pycache__/_musllinux.cpython-312.pyc | Bin 6906 -> 0 bytes .../__pycache__/_structures.cpython-312.pyc | Bin 3237 -> 0 bytes .../__pycache__/markers.cpython-312.pyc | Bin 14054 -> 0 bytes .../__pycache__/requirements.cpython-312.pyc | Bin 6942 -> 0 bytes .../__pycache__/specifiers.cpython-312.pyc | Bin 31243 -> 0 bytes .../__pycache__/tags.cpython-312.pyc | Bin 18952 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 5864 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 19935 -> 0 bytes .../pip/_vendor/packaging/_manylinux.py | 301 - .../pip/_vendor/packaging/_musllinux.py | 136 - .../pip/_vendor/packaging/_structures.py | 61 - .../pip/_vendor/packaging/markers.py | 304 - .../pip/_vendor/packaging/requirements.py | 146 - .../pip/_vendor/packaging/specifiers.py | 802 -- .../pip/_vendor/packaging/tags.py | 487 - .../pip/_vendor/packaging/utils.py | 136 - .../pip/_vendor/packaging/version.py | 504 - .../pip/_vendor/pkg_resources/__init__.py | 3361 ------- .../__pycache__/__init__.cpython-312.pyc | Bin 146470 -> 0 bytes .../pip/_vendor/platformdirs/__init__.py | 566 -- .../pip/_vendor/platformdirs/__main__.py | 53 - .../__pycache__/__init__.cpython-312.pyc | Bin 18025 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 1942 -> 0 bytes .../__pycache__/android.cpython-312.pyc | Bin 9440 -> 0 bytes .../__pycache__/api.cpython-312.pyc | Bin 9668 -> 0 bytes .../__pycache__/macos.cpython-312.pyc | Bin 5633 -> 0 bytes .../__pycache__/unix.cpython-312.pyc | Bin 12437 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 307 -> 0 bytes .../__pycache__/windows.cpython-312.pyc | Bin 12995 -> 0 bytes .../pip/_vendor/platformdirs/android.py | 210 - .../pip/_vendor/platformdirs/api.py | 223 - .../pip/_vendor/platformdirs/macos.py | 91 - .../pip/_vendor/platformdirs/unix.py | 223 - .../pip/_vendor/platformdirs/version.py | 4 - .../pip/_vendor/platformdirs/windows.py | 255 - .../pip/_vendor/pygments/__init__.py | 82 - .../pip/_vendor/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-312.pyc | Bin 3485 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 731 -> 0 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 26602 -> 0 bytes .../__pycache__/console.cpython-312.pyc | Bin 2623 -> 0 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3229 -> 0 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 4566 -> 0 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38326 -> 0 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1565 -> 0 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 3393 -> 0 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4078 -> 0 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 4753 -> 0 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 11043 -> 0 bytes .../__pycache__/style.cpython-312.pyc | Bin 6671 -> 0 bytes .../__pycache__/token.cpython-312.pyc | Bin 8139 -> 0 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 32985 -> 0 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 13978 -> 0 bytes .../pip/_vendor/pygments/cmdline.py | 668 -- .../pip/_vendor/pygments/console.py | 70 - .../pip/_vendor/pygments/filter.py | 71 - .../pip/_vendor/pygments/filters/__init__.py | 940 -- .../__pycache__/__init__.cpython-312.pyc | Bin 37933 -> 0 bytes .../pip/_vendor/pygments/formatter.py | 124 - .../_vendor/pygments/formatters/__init__.py | 158 - .../__pycache__/__init__.cpython-312.pyc | Bin 6923 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 4212 -> 0 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 4191 -> 0 bytes .../__pycache__/groff.cpython-312.pyc | Bin 7261 -> 0 bytes .../__pycache__/html.cpython-312.pyc | Bin 40569 -> 0 bytes .../__pycache__/img.cpython-312.pyc | Bin 27040 -> 0 bytes .../__pycache__/irc.cpython-312.pyc | Bin 6062 -> 0 bytes .../__pycache__/latex.cpython-312.pyc | Bin 19951 -> 0 bytes .../__pycache__/other.cpython-312.pyc | Bin 6881 -> 0 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 2927 -> 0 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 6123 -> 0 bytes .../__pycache__/svg.cpython-312.pyc | Bin 9063 -> 0 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 5826 -> 0 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 15154 -> 0 bytes .../_vendor/pygments/formatters/_mapping.py | 23 - .../pip/_vendor/pygments/formatters/bbcode.py | 108 - .../pip/_vendor/pygments/formatters/groff.py | 170 - .../pip/_vendor/pygments/formatters/html.py | 989 -- .../pip/_vendor/pygments/formatters/img.py | 645 -- .../pip/_vendor/pygments/formatters/irc.py | 154 - .../pip/_vendor/pygments/formatters/latex.py | 521 - .../pip/_vendor/pygments/formatters/other.py | 161 - .../pygments/formatters/pangomarkup.py | 83 - .../pip/_vendor/pygments/formatters/rtf.py | 146 - .../pip/_vendor/pygments/formatters/svg.py | 188 - .../_vendor/pygments/formatters/terminal.py | 127 - .../pygments/formatters/terminal256.py | 338 - .../pip/_vendor/pygments/lexer.py | 943 -- .../pip/_vendor/pygments/lexers/__init__.py | 362 - .../__pycache__/__init__.cpython-312.pyc | Bin 14649 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 64401 -> 0 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 42636 -> 0 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 559 -- .../pip/_vendor/pygments/lexers/python.py | 1198 --- .../pip/_vendor/pygments/modeline.py | 43 - .../pip/_vendor/pygments/plugin.py | 88 - .../pip/_vendor/pygments/regexopt.py | 91 - .../pip/_vendor/pygments/scanner.py | 104 - .../pip/_vendor/pygments/sphinxext.py | 217 - .../pip/_vendor/pygments/style.py | 197 - .../pip/_vendor/pygments/styles/__init__.py | 103 - .../__pycache__/__init__.cpython-312.pyc | Bin 4445 -> 0 bytes .../pip/_vendor/pygments/token.py | 213 - .../pip/_vendor/pygments/unistring.py | 153 - .../pip/_vendor/pygments/util.py | 330 - .../pip/_vendor/pyparsing/__init__.py | 322 - .../__pycache__/__init__.cpython-312.pyc | Bin 7908 -> 0 bytes .../__pycache__/actions.cpython-312.pyc | Bin 8392 -> 0 bytes .../__pycache__/common.cpython-312.pyc | Bin 13411 -> 0 bytes .../__pycache__/core.cpython-312.pyc | Bin 267705 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 12991 -> 0 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 48498 -> 0 bytes .../__pycache__/results.cpython-312.pyc | Bin 34107 -> 0 bytes .../__pycache__/testing.cpython-312.pyc | Bin 17185 -> 0 bytes .../__pycache__/unicode.cpython-312.pyc | Bin 13181 -> 0 bytes .../__pycache__/util.cpython-312.pyc | Bin 14901 -> 0 bytes .../pip/_vendor/pyparsing/actions.py | 217 - .../pip/_vendor/pyparsing/common.py | 432 - .../pip/_vendor/pyparsing/core.py | 6115 ------------ .../pip/_vendor/pyparsing/diagram/__init__.py | 656 -- .../__pycache__/__init__.cpython-312.pyc | Bin 26810 -> 0 bytes .../pip/_vendor/pyparsing/exceptions.py | 299 - .../pip/_vendor/pyparsing/helpers.py | 1100 --- .../pip/_vendor/pyparsing/results.py | 796 -- .../pip/_vendor/pyparsing/testing.py | 331 - .../pip/_vendor/pyparsing/unicode.py | 361 - .../pip/_vendor/pyparsing/util.py | 284 - .../pip/_vendor/pyproject_hooks/__init__.py | 23 - .../__pycache__/__init__.cpython-312.pyc | Bin 610 -> 0 bytes .../__pycache__/_compat.cpython-312.pyc | Bin 371 -> 0 bytes .../__pycache__/_impl.cpython-312.pyc | Bin 14722 -> 0 bytes .../pip/_vendor/pyproject_hooks/_compat.py | 8 - .../pip/_vendor/pyproject_hooks/_impl.py | 330 - .../pyproject_hooks/_in_process/__init__.py | 18 - .../__pycache__/__init__.cpython-312.pyc | Bin 1077 -> 0 bytes .../__pycache__/_in_process.cpython-312.pyc | Bin 14394 -> 0 bytes .../_in_process/_in_process.py | 353 - .../pip/_vendor/requests/__init__.py | 182 - .../__pycache__/__init__.cpython-312.pyc | Bin 5450 -> 0 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 581 -> 0 bytes .../_internal_utils.cpython-312.pyc | Bin 2021 -> 0 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 21277 -> 0 bytes .../requests/__pycache__/api.cpython-312.pyc | Bin 7201 -> 0 bytes .../requests/__pycache__/auth.cpython-312.pyc | Bin 13920 -> 0 bytes .../__pycache__/certs.cpython-312.pyc | Bin 919 -> 0 bytes .../__pycache__/compat.cpython-312.pyc | Bin 1504 -> 0 bytes .../__pycache__/cookies.cpython-312.pyc | Bin 25243 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 7044 -> 0 bytes .../requests/__pycache__/help.cpython-312.pyc | Bin 4309 -> 0 bytes .../__pycache__/hooks.cpython-312.pyc | Bin 1049 -> 0 bytes .../__pycache__/models.cpython-312.pyc | Bin 35445 -> 0 bytes .../__pycache__/packages.cpython-312.pyc | Bin 769 -> 0 bytes .../__pycache__/sessions.cpython-312.pyc | Bin 27754 -> 0 bytes .../__pycache__/status_codes.cpython-312.pyc | Bin 5956 -> 0 bytes .../__pycache__/structures.cpython-312.pyc | Bin 5614 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 36266 -> 0 bytes .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 50 - .../pip/_vendor/requests/adapters.py | 538 -- .../site-packages/pip/_vendor/requests/api.py | 157 - .../pip/_vendor/requests/auth.py | 315 - .../pip/_vendor/requests/certs.py | 24 - .../pip/_vendor/requests/compat.py | 67 - .../pip/_vendor/requests/cookies.py | 561 -- .../pip/_vendor/requests/exceptions.py | 141 - .../pip/_vendor/requests/help.py | 131 - .../pip/_vendor/requests/hooks.py | 33 - .../pip/_vendor/requests/models.py | 1034 -- .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 833 -- .../pip/_vendor/requests/status_codes.py | 128 - .../pip/_vendor/requests/structures.py | 99 - .../pip/_vendor/requests/utils.py | 1094 --- .../pip/_vendor/resolvelib/__init__.py | 26 - .../__pycache__/__init__.cpython-312.pyc | Bin 631 -> 0 bytes .../__pycache__/providers.cpython-312.pyc | Bin 6848 -> 0 bytes .../__pycache__/reporters.cpython-312.pyc | Bin 2651 -> 0 bytes .../__pycache__/resolvers.cpython-312.pyc | Bin 25894 -> 0 bytes .../__pycache__/structs.cpython-312.pyc | Bin 10503 -> 0 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 197 -> 0 bytes .../collections_abc.cpython-312.pyc | Bin 417 -> 0 bytes .../resolvelib/compat/collections_abc.py | 6 - .../pip/_vendor/resolvelib/providers.py | 133 - .../pip/_vendor/resolvelib/reporters.py | 43 - .../pip/_vendor/resolvelib/resolvers.py | 547 -- .../pip/_vendor/resolvelib/structs.py | 170 - .../pip/_vendor/rich/__init__.py | 177 - .../pip/_vendor/rich/__main__.py | 274 - .../rich/__pycache__/__init__.cpython-312.pyc | Bin 7012 -> 0 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 10301 -> 0 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7818 -> 0 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205973 -> 0 bytes .../_emoji_replace.cpython-312.pyc | Bin 1726 -> 0 bytes .../_export_format.cpython-312.pyc | Bin 2318 -> 0 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 534 -> 0 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 852 -> 0 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 12074 -> 0 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4144 -> 0 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1882 -> 0 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3617 -> 0 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5157 -> 0 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 723 -> 0 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6576 -> 0 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13176 -> 0 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 962 -> 0 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 862 -> 0 bytes .../_win32_console.cpython-312.pyc | Bin 28973 -> 0 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 2487 -> 0 bytes .../_windows_renderer.cpython-312.pyc | Bin 3570 -> 0 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 2357 -> 0 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1605 -> 0 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12319 -> 0 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9103 -> 0 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 4269 -> 0 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11855 -> 0 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5615 -> 0 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26567 -> 0 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1698 -> 0 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8584 -> 0 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 113790 -> 0 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2255 -> 0 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9223 -> 0 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10926 -> 0 bytes .../default_styles.cpython-312.pyc | Bin 10370 -> 0 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 1484 -> 0 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4206 -> 0 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1842 -> 0 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3574 -> 0 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3079 -> 0 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9895 -> 0 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 6032 -> 0 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5206 -> 0 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 20217 -> 0 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 19140 -> 0 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4891 -> 0 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 13551 -> 0 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9295 -> 0 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6373 -> 0 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 7131 -> 0 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1817 -> 0 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5311 -> 0 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12094 -> 0 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40053 -> 0 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 75075 -> 0 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10386 -> 0 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 14778 -> 0 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1789 -> 0 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 564 -> 0 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6623 -> 0 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 6565 -> 0 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3827 -> 0 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2481 -> 0 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28158 -> 0 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 6061 -> 0 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 6065 -> 0 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33511 -> 0 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2136 -> 0 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 39609 -> 0 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43581 -> 0 bytes .../terminal_theme.cpython-312.pyc | Bin 3345 -> 0 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 58960 -> 0 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6337 -> 0 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 311 -> 0 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 31545 -> 0 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 11436 -> 0 bytes .../pip/_vendor/rich/_cell_widths.py | 451 - .../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 | 270 - .../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 | 160 - .../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 | 662 -- .../pip/_vendor/rich/_windows.py | 72 - .../pip/_vendor/rich/_windows_renderer.py | 56 - .../site-packages/pip/_vendor/rich/_wrap.py | 56 - .../site-packages/pip/_vendor/rich/abc.py | 33 - .../site-packages/pip/_vendor/rich/align.py | 311 - .../site-packages/pip/_vendor/rich/ansi.py | 240 - .../site-packages/pip/_vendor/rich/bar.py | 94 - .../site-packages/pip/_vendor/rich/box.py | 517 - .../site-packages/pip/_vendor/rich/cells.py | 154 - .../site-packages/pip/_vendor/rich/color.py | 622 -- .../pip/_vendor/rich/color_triplet.py | 38 - .../site-packages/pip/_vendor/rich/columns.py | 187 - .../site-packages/pip/_vendor/rich/console.py | 2633 ----- .../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 | 190 - .../pip/_vendor/rich/diagnose.py | 37 - .../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 | 89 - .../pip/_vendor/rich/highlighter.py | 232 - .../site-packages/pip/_vendor/rich/json.py | 140 - .../site-packages/pip/_vendor/rich/jupyter.py | 101 - .../site-packages/pip/_vendor/rich/layout.py | 443 - .../site-packages/pip/_vendor/rich/live.py | 375 - .../pip/_vendor/rich/live_render.py | 113 - .../site-packages/pip/_vendor/rich/logging.py | 289 - .../site-packages/pip/_vendor/rich/markup.py | 246 - .../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 | 308 - .../site-packages/pip/_vendor/rich/pretty.py | 994 -- .../pip/_vendor/rich/progress.py | 1702 ---- .../pip/_vendor/rich/progress_bar.py | 224 - .../site-packages/pip/_vendor/rich/prompt.py | 376 - .../pip/_vendor/rich/protocol.py | 42 - .../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 | 739 -- .../site-packages/pip/_vendor/rich/spinner.py | 137 - .../site-packages/pip/_vendor/rich/status.py | 132 - .../site-packages/pip/_vendor/rich/style.py | 796 -- .../site-packages/pip/_vendor/rich/styled.py | 42 - .../site-packages/pip/_vendor/rich/syntax.py | 948 -- .../site-packages/pip/_vendor/rich/table.py | 1002 -- .../pip/_vendor/rich/terminal_theme.py | 153 - .../site-packages/pip/_vendor/rich/text.py | 1307 --- .../site-packages/pip/_vendor/rich/theme.py | 115 - .../site-packages/pip/_vendor/rich/themes.py | 5 - .../pip/_vendor/rich/traceback.py | 756 -- .../site-packages/pip/_vendor/rich/tree.py | 251 - .../site-packages/pip/_vendor/six.py | 998 -- .../pip/_vendor/tenacity/__init__.py | 608 -- .../__pycache__/__init__.cpython-312.pyc | Bin 27083 -> 0 bytes .../__pycache__/_asyncio.cpython-312.pyc | Bin 4803 -> 0 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 2312 -> 0 bytes .../__pycache__/after.cpython-312.pyc | Bin 1621 -> 0 bytes .../__pycache__/before.cpython-312.pyc | Bin 1461 -> 0 bytes .../__pycache__/before_sleep.cpython-312.pyc | Bin 2299 -> 0 bytes .../tenacity/__pycache__/nap.cpython-312.pyc | Bin 1409 -> 0 bytes .../__pycache__/retry.cpython-312.pyc | Bin 14278 -> 0 bytes .../tenacity/__pycache__/stop.cpython-312.pyc | Bin 5565 -> 0 bytes .../__pycache__/tornadoweb.cpython-312.pyc | Bin 2583 -> 0 bytes .../tenacity/__pycache__/wait.cpython-312.pyc | Bin 12410 -> 0 bytes .../pip/_vendor/tenacity/_asyncio.py | 94 - .../pip/_vendor/tenacity/_utils.py | 76 - .../pip/_vendor/tenacity/after.py | 51 - .../pip/_vendor/tenacity/before.py | 46 - .../pip/_vendor/tenacity/before_sleep.py | 71 - .../site-packages/pip/_vendor/tenacity/nap.py | 43 - .../pip/_vendor/tenacity/retry.py | 272 - .../pip/_vendor/tenacity/stop.py | 103 - .../pip/_vendor/tenacity/tornadoweb.py | 59 - .../pip/_vendor/tenacity/wait.py | 228 - .../pip/_vendor/tomli/__init__.py | 11 - .../__pycache__/__init__.cpython-312.pyc | Bin 381 -> 0 bytes .../tomli/__pycache__/_parser.cpython-312.pyc | Bin 26924 -> 0 bytes .../tomli/__pycache__/_re.cpython-312.pyc | Bin 3905 -> 0 bytes .../tomli/__pycache__/_types.cpython-312.pyc | Bin 363 -> 0 bytes .../pip/_vendor/tomli/_parser.py | 691 -- .../site-packages/pip/_vendor/tomli/_re.py | 107 - .../site-packages/pip/_vendor/tomli/_types.py | 10 - .../pip/_vendor/typing_extensions.py | 3072 ------ .../pip/_vendor/urllib3/__init__.py | 102 - .../__pycache__/__init__.cpython-312.pyc | Bin 3402 -> 0 bytes .../__pycache__/_collections.cpython-312.pyc | Bin 15928 -> 0 bytes .../__pycache__/_version.cpython-312.pyc | Bin 215 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 20404 -> 0 bytes .../connectionpool.cpython-312.pyc | Bin 36276 -> 0 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 13490 -> 0 bytes .../__pycache__/fields.cpython-312.pyc | Bin 10410 -> 0 bytes .../__pycache__/filepost.cpython-312.pyc | Bin 4015 -> 0 bytes .../__pycache__/poolmanager.cpython-312.pyc | Bin 20299 -> 0 bytes .../__pycache__/request.cpython-312.pyc | Bin 7291 -> 0 bytes .../__pycache__/response.cpython-312.pyc | Bin 33965 -> 0 bytes .../pip/_vendor/urllib3/_collections.py | 337 - .../pip/_vendor/urllib3/_version.py | 2 - .../pip/_vendor/urllib3/connection.py | 572 -- .../pip/_vendor/urllib3/connectionpool.py | 1132 --- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 195 -> 0 bytes .../_appengine_environ.cpython-312.pyc | Bin 1845 -> 0 bytes .../__pycache__/appengine.cpython-312.pyc | Bin 11561 -> 0 bytes .../__pycache__/ntlmpool.cpython-312.pyc | Bin 5716 -> 0 bytes .../__pycache__/pyopenssl.cpython-312.pyc | Bin 24447 -> 0 bytes .../securetransport.cpython-312.pyc | Bin 35553 -> 0 bytes .../contrib/__pycache__/socks.cpython-312.pyc | Bin 7508 -> 0 bytes .../urllib3/contrib/_appengine_environ.py | 36 - .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 212 -> 0 bytes .../__pycache__/bindings.cpython-312.pyc | Bin 17424 -> 0 bytes .../__pycache__/low_level.cpython-312.pyc | Bin 14798 -> 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 | 921 -- .../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-312.pyc | Bin 196 -> 0 bytes .../packages/__pycache__/six.cpython-312.pyc | Bin 41316 -> 0 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 206 -> 0 bytes .../__pycache__/makefile.cpython-312.pyc | Bin 1822 -> 0 bytes .../weakref_finalize.cpython-312.pyc | Bin 7328 -> 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 | 537 - .../pip/_vendor/urllib3/request.py | 191 - .../pip/_vendor/urllib3/response.py | 879 -- .../pip/_vendor/urllib3/util/__init__.py | 49 - .../util/__pycache__/__init__.cpython-312.pyc | Bin 1143 -> 0 bytes .../__pycache__/connection.cpython-312.pyc | Bin 4753 -> 0 bytes .../util/__pycache__/proxy.cpython-312.pyc | Bin 1549 -> 0 bytes .../util/__pycache__/queue.cpython-312.pyc | Bin 1349 -> 0 bytes .../util/__pycache__/request.cpython-312.pyc | Bin 4180 -> 0 bytes .../util/__pycache__/response.cpython-312.pyc | Bin 2986 -> 0 bytes .../util/__pycache__/retry.cpython-312.pyc | Bin 21715 -> 0 bytes .../util/__pycache__/ssl_.cpython-312.pyc | Bin 15100 -> 0 bytes .../ssl_match_hostname.cpython-312.pyc | Bin 5068 -> 0 bytes .../__pycache__/ssltransport.cpython-312.pyc | Bin 10769 -> 0 bytes .../util/__pycache__/timeout.cpython-312.pyc | Bin 11136 -> 0 bytes .../util/__pycache__/url.cpython-312.pyc | Bin 15792 -> 0 bytes .../util/__pycache__/wait.cpython-312.pyc | Bin 4400 -> 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 | 495 - .../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 - .../site-packages/pip/_vendor/vendor.txt | 24 - .../pip/_vendor/webencodings/__init__.py | 342 - .../__pycache__/__init__.cpython-312.pyc | Bin 11998 -> 0 bytes .../__pycache__/labels.cpython-312.pyc | Bin 7129 -> 0 bytes .../__pycache__/mklabels.cpython-312.pyc | Bin 2696 -> 0 bytes .../__pycache__/tests.cpython-312.pyc | Bin 9248 -> 0 bytes .../x_user_defined.cpython-312.pyc | Bin 3292 -> 0 bytes .../pip/_vendor/webencodings/labels.py | 231 - .../pip/_vendor/webencodings/mklabels.py | 59 - .../pip/_vendor/webencodings/tests.py | 153 - .../_vendor/webencodings/x_user_defined.py | 325 - .../lib/python3.12/site-packages/pip/py.typed | 4 - .../AUTHORS.rst | 11 - .../prompt_toolkit-3.0.50.dist-info/INSTALLER | 1 - .../prompt_toolkit-3.0.50.dist-info/LICENSE | 27 - .../prompt_toolkit-3.0.50.dist-info/METADATA | 178 - .../prompt_toolkit-3.0.50.dist-info/RECORD | 296 - .../prompt_toolkit-3.0.50.dist-info/WHEEL | 5 - .../top_level.txt | 1 - .../site-packages/prompt_toolkit/__init__.py | 52 - .../__pycache__/__init__.cpython-312.pyc | Bin 1633 -> 0 bytes .../__pycache__/auto_suggest.cpython-312.pyc | Bin 8346 -> 0 bytes .../__pycache__/buffer.cpython-312.pyc | Bin 77361 -> 0 bytes .../__pycache__/cache.cpython-312.pyc | Bin 5225 -> 0 bytes .../__pycache__/cursor_shapes.cpython-312.pyc | Bin 4661 -> 0 bytes .../data_structures.cpython-312.pyc | Bin 732 -> 0 bytes .../__pycache__/document.cpython-312.pyc | Bin 47831 -> 0 bytes .../__pycache__/enums.cpython-312.pyc | Bin 572 -> 0 bytes .../__pycache__/history.cpython-312.pyc | Bin 13143 -> 0 bytes .../__pycache__/keys.cpython-312.pyc | Bin 5314 -> 0 bytes .../__pycache__/log.cpython-312.pyc | Bin 412 -> 0 bytes .../__pycache__/mouse_events.cpython-312.pyc | Bin 2894 -> 0 bytes .../__pycache__/patch_stdout.cpython-312.pyc | Bin 11756 -> 0 bytes .../__pycache__/renderer.cpython-312.pyc | Bin 29537 -> 0 bytes .../__pycache__/search.cpython-312.pyc | Bin 7730 -> 0 bytes .../__pycache__/selection.cpython-312.pyc | Bin 2090 -> 0 bytes .../__pycache__/token.cpython-312.pyc | Bin 326 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 11339 -> 0 bytes .../__pycache__/validation.cpython-312.pyc | Bin 8918 -> 0 bytes .../__pycache__/win32_types.cpython-312.pyc | Bin 7170 -> 0 bytes .../prompt_toolkit/application/__init__.py | 32 - .../__pycache__/__init__.cpython-312.pyc | Bin 697 -> 0 bytes .../__pycache__/application.cpython-312.pyc | Bin 67748 -> 0 bytes .../__pycache__/current.cpython-312.pyc | Bin 7151 -> 0 bytes .../__pycache__/dummy.cpython-312.pyc | Bin 2772 -> 0 bytes .../run_in_terminal.cpython-312.pyc | Bin 5176 -> 0 bytes .../prompt_toolkit/application/application.py | 1626 ---- .../prompt_toolkit/application/current.py | 195 - .../prompt_toolkit/application/dummy.py | 55 - .../application/run_in_terminal.py | 117 - .../prompt_toolkit/auto_suggest.py | 177 - .../site-packages/prompt_toolkit/buffer.py | 2029 ---- .../site-packages/prompt_toolkit/cache.py | 127 - .../prompt_toolkit/clipboard/__init__.py | 17 - .../__pycache__/__init__.cpython-312.pyc | Bin 467 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 4804 -> 0 bytes .../__pycache__/in_memory.cpython-312.pyc | Bin 2176 -> 0 bytes .../__pycache__/pyperclip.cpython-312.pyc | Bin 1738 -> 0 bytes .../prompt_toolkit/clipboard/base.py | 109 - .../prompt_toolkit/clipboard/in_memory.py | 44 - .../prompt_toolkit/clipboard/pyperclip.py | 42 - .../prompt_toolkit/completion/__init__.py | 43 - .../__pycache__/__init__.cpython-312.pyc | Bin 946 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 18708 -> 0 bytes .../__pycache__/deduplicate.cpython-312.pyc | Bin 1956 -> 0 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 5429 -> 0 bytes .../fuzzy_completer.cpython-312.pyc | Bin 9605 -> 0 bytes .../__pycache__/nested.cpython-312.pyc | Bin 4834 -> 0 bytes .../word_completer.cpython-312.pyc | Bin 4259 -> 0 bytes .../prompt_toolkit/completion/base.py | 438 - .../prompt_toolkit/completion/deduplicate.py | 45 - .../prompt_toolkit/completion/filesystem.py | 118 - .../completion/fuzzy_completer.py | 213 - .../prompt_toolkit/completion/nested.py | 109 - .../completion/word_completer.py | 94 - .../prompt_toolkit/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 190 -> 0 bytes .../contrib/completers/__init__.py | 5 - .../__pycache__/__init__.cpython-312.pyc | Bin 330 -> 0 bytes .../__pycache__/system.cpython-312.pyc | Bin 2677 -> 0 bytes .../contrib/completers/system.py | 64 - .../contrib/regular_languages/__init__.py | 80 - .../__pycache__/__init__.cpython-312.pyc | Bin 3538 -> 0 bytes .../__pycache__/compiler.cpython-312.pyc | Bin 25532 -> 0 bytes .../__pycache__/completion.cpython-312.pyc | Bin 4494 -> 0 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 4383 -> 0 bytes .../__pycache__/regex_parser.cpython-312.pyc | Bin 11220 -> 0 bytes .../__pycache__/validation.cpython-312.pyc | Bin 2581 -> 0 bytes .../contrib/regular_languages/compiler.py | 579 -- .../contrib/regular_languages/completion.py | 100 - .../contrib/regular_languages/lexer.py | 94 - .../contrib/regular_languages/regex_parser.py | 279 - .../contrib/regular_languages/validation.py | 60 - .../prompt_toolkit/contrib/ssh/__init__.py | 8 - .../ssh/__pycache__/__init__.cpython-312.pyc | Bin 378 -> 0 bytes .../ssh/__pycache__/server.cpython-312.pyc | Bin 9171 -> 0 bytes .../prompt_toolkit/contrib/ssh/server.py | 178 - .../prompt_toolkit/contrib/telnet/__init__.py | 7 - .../__pycache__/__init__.cpython-312.pyc | Bin 327 -> 0 bytes .../telnet/__pycache__/log.cpython-312.pyc | Bin 439 -> 0 bytes .../__pycache__/protocol.cpython-312.pyc | Bin 7658 -> 0 bytes .../telnet/__pycache__/server.cpython-312.pyc | Bin 20352 -> 0 bytes .../prompt_toolkit/contrib/telnet/log.py | 13 - .../prompt_toolkit/contrib/telnet/protocol.py | 209 - .../prompt_toolkit/contrib/telnet/server.py | 428 - .../prompt_toolkit/cursor_shapes.py | 117 - .../prompt_toolkit/data_structures.py | 18 - .../site-packages/prompt_toolkit/document.py | 1182 --- .../site-packages/prompt_toolkit/enums.py | 19 - .../prompt_toolkit/eventloop/__init__.py | 31 - .../__pycache__/__init__.cpython-312.pyc | Bin 728 -> 0 bytes .../async_generator.cpython-312.pyc | Bin 4263 -> 0 bytes .../__pycache__/inputhook.cpython-312.pyc | Bin 7582 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 3606 -> 0 bytes .../__pycache__/win32.cpython-312.pyc | Bin 2709 -> 0 bytes .../eventloop/async_generator.py | 125 - .../prompt_toolkit/eventloop/inputhook.py | 191 - .../prompt_toolkit/eventloop/utils.py | 101 - .../prompt_toolkit/eventloop/win32.py | 72 - .../prompt_toolkit/filters/__init__.py | 71 - .../__pycache__/__init__.cpython-312.pyc | Bin 2041 -> 0 bytes .../filters/__pycache__/app.cpython-312.pyc | Bin 15852 -> 0 bytes .../filters/__pycache__/base.cpython-312.pyc | Bin 10799 -> 0 bytes .../filters/__pycache__/cli.cpython-312.pyc | Bin 3720 -> 0 bytes .../filters/__pycache__/utils.cpython-312.pyc | Bin 1322 -> 0 bytes .../prompt_toolkit/filters/app.py | 419 - .../prompt_toolkit/filters/base.py | 260 - .../prompt_toolkit/filters/cli.py | 65 - .../prompt_toolkit/filters/utils.py | 41 - .../prompt_toolkit/formatted_text/__init__.py | 59 - .../__pycache__/__init__.cpython-312.pyc | Bin 1520 -> 0 bytes .../__pycache__/ansi.cpython-312.pyc | Bin 9542 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 6447 -> 0 bytes .../__pycache__/html.cpython-312.pyc | Bin 5900 -> 0 bytes .../__pycache__/pygments.cpython-312.pyc | Bin 1410 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 4021 -> 0 bytes .../prompt_toolkit/formatted_text/ansi.py | 297 - .../prompt_toolkit/formatted_text/base.py | 179 - .../prompt_toolkit/formatted_text/html.py | 145 - .../prompt_toolkit/formatted_text/pygments.py | 32 - .../prompt_toolkit/formatted_text/utils.py | 103 - .../site-packages/prompt_toolkit/history.py | 306 - .../prompt_toolkit/input/__init__.py | 14 - .../__pycache__/__init__.cpython-312.pyc | Bin 446 -> 0 bytes .../ansi_escape_sequences.cpython-312.pyc | Bin 17754 -> 0 bytes .../input/__pycache__/base.cpython-312.pyc | Bin 5900 -> 0 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 2659 -> 0 bytes .../__pycache__/posix_pipe.cpython-312.pyc | Bin 5671 -> 0 bytes .../__pycache__/posix_utils.cpython-312.pyc | Bin 3072 -> 0 bytes .../__pycache__/typeahead.cpython-312.pyc | Bin 3116 -> 0 bytes .../input/__pycache__/vt100.cpython-312.pyc | Bin 12160 -> 0 bytes .../__pycache__/vt100_parser.cpython-312.pyc | Bin 8793 -> 0 bytes .../input/__pycache__/win32.cpython-312.pyc | Bin 34680 -> 0 bytes .../__pycache__/win32_pipe.cpython-312.pyc | Bin 6788 -> 0 bytes .../input/ansi_escape_sequences.py | 344 - .../prompt_toolkit/input/base.py | 153 - .../prompt_toolkit/input/defaults.py | 79 - .../prompt_toolkit/input/posix_pipe.py | 118 - .../prompt_toolkit/input/posix_utils.py | 97 - .../prompt_toolkit/input/typeahead.py | 78 - .../prompt_toolkit/input/vt100.py | 309 - .../prompt_toolkit/input/vt100_parser.py | 250 - .../prompt_toolkit/input/win32.py | 886 -- .../prompt_toolkit/input/win32_pipe.py | 156 - .../prompt_toolkit/key_binding/__init__.py | 22 - .../__pycache__/__init__.cpython-312.pyc | Bin 555 -> 0 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 1757 -> 0 bytes .../__pycache__/digraphs.cpython-312.pyc | Bin 56633 -> 0 bytes .../__pycache__/emacs_state.cpython-312.pyc | Bin 1565 -> 0 bytes .../__pycache__/key_bindings.cpython-312.pyc | Bin 24901 -> 0 bytes .../__pycache__/key_processor.cpython-312.pyc | Bin 21088 -> 0 bytes .../__pycache__/vi_state.cpython-312.pyc | Bin 3247 -> 0 bytes .../key_binding/bindings/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 203 -> 0 bytes .../__pycache__/auto_suggest.cpython-312.pyc | Bin 3182 -> 0 bytes .../__pycache__/basic.cpython-312.pyc | Bin 11591 -> 0 bytes .../__pycache__/completion.cpython-312.pyc | Bin 9443 -> 0 bytes .../bindings/__pycache__/cpr.cpython-312.pyc | Bin 1449 -> 0 bytes .../__pycache__/emacs.cpython-312.pyc | Bin 27192 -> 0 bytes .../__pycache__/focus.cpython-312.pyc | Bin 1011 -> 0 bytes .../__pycache__/mouse.cpython-312.pyc | Bin 12119 -> 0 bytes .../named_commands.cpython-312.pyc | Bin 28405 -> 0 bytes .../open_in_editor.cpython-312.pyc | Bin 1811 -> 0 bytes .../page_navigation.cpython-312.pyc | Bin 2738 -> 0 bytes .../__pycache__/scroll.cpython-312.pyc | Bin 7175 -> 0 bytes .../__pycache__/search.cpython-312.pyc | Bin 4046 -> 0 bytes .../bindings/__pycache__/vi.cpython-312.pyc | Bin 103244 -> 0 bytes .../key_binding/bindings/auto_suggest.py | 66 - .../key_binding/bindings/basic.py | 257 - .../key_binding/bindings/completion.py | 206 - .../key_binding/bindings/cpr.py | 30 - .../key_binding/bindings/emacs.py | 563 -- .../key_binding/bindings/focus.py | 26 - .../key_binding/bindings/mouse.py | 348 - .../key_binding/bindings/named_commands.py | 691 -- .../key_binding/bindings/open_in_editor.py | 52 - .../key_binding/bindings/page_navigation.py | 85 - .../key_binding/bindings/scroll.py | 190 - .../key_binding/bindings/search.py | 96 - .../prompt_toolkit/key_binding/bindings/vi.py | 2233 ----- .../prompt_toolkit/key_binding/defaults.py | 63 - .../prompt_toolkit/key_binding/digraphs.py | 1378 --- .../prompt_toolkit/key_binding/emacs_state.py | 36 - .../key_binding/key_bindings.py | 670 -- .../key_binding/key_processor.py | 526 - .../prompt_toolkit/key_binding/vi_state.py | 107 - .../site-packages/prompt_toolkit/keys.py | 222 - .../prompt_toolkit/layout/__init__.py | 147 - .../__pycache__/__init__.cpython-312.pyc | Bin 3379 -> 0 bytes .../__pycache__/containers.cpython-312.pyc | Bin 100619 -> 0 bytes .../__pycache__/controls.cpython-312.pyc | Bin 36715 -> 0 bytes .../__pycache__/dimension.cpython-312.pyc | Bin 8479 -> 0 bytes .../layout/__pycache__/dummy.cpython-312.pyc | Bin 1734 -> 0 bytes .../layout/__pycache__/layout.cpython-312.pyc | Bin 16096 -> 0 bytes .../__pycache__/margins.cpython-312.pyc | Bin 11654 -> 0 bytes .../layout/__pycache__/menus.cpython-312.pyc | Bin 30478 -> 0 bytes .../mouse_handlers.cpython-312.pyc | Bin 2314 -> 0 bytes .../__pycache__/processors.cpython-312.pyc | Bin 39022 -> 0 bytes .../layout/__pycache__/screen.cpython-312.pyc | Bin 11672 -> 0 bytes .../scrollable_pane.cpython-312.pyc | Bin 19514 -> 0 bytes .../layout/__pycache__/utils.cpython-312.pyc | Bin 3554 -> 0 bytes .../prompt_toolkit/layout/containers.py | 2738 ------ .../prompt_toolkit/layout/controls.py | 956 -- .../prompt_toolkit/layout/dimension.py | 220 - .../prompt_toolkit/layout/dummy.py | 40 - .../prompt_toolkit/layout/layout.py | 412 - .../prompt_toolkit/layout/margins.py | 304 - .../prompt_toolkit/layout/menus.py | 748 -- .../prompt_toolkit/layout/mouse_handlers.py | 56 - .../prompt_toolkit/layout/processors.py | 1016 -- .../prompt_toolkit/layout/screen.py | 323 - .../prompt_toolkit/layout/scrollable_pane.py | 494 - .../prompt_toolkit/layout/utils.py | 80 - .../prompt_toolkit/lexers/__init__.py | 21 - .../__pycache__/__init__.cpython-312.pyc | Bin 592 -> 0 bytes .../lexers/__pycache__/base.cpython-312.pyc | Bin 3866 -> 0 bytes .../__pycache__/pygments.cpython-312.pyc | Bin 11708 -> 0 bytes .../prompt_toolkit/lexers/base.py | 85 - .../prompt_toolkit/lexers/pygments.py | 328 - .../site-packages/prompt_toolkit/log.py | 13 - .../prompt_toolkit/mouse_events.py | 85 - .../prompt_toolkit/output/__init__.py | 15 - .../__pycache__/__init__.cpython-312.pyc | Bin 441 -> 0 bytes .../output/__pycache__/base.cpython-312.pyc | Bin 14447 -> 0 bytes .../__pycache__/color_depth.cpython-312.pyc | Bin 2069 -> 0 bytes .../output/__pycache__/conemu.cpython-312.pyc | Bin 2703 -> 0 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 3044 -> 0 bytes .../__pycache__/flush_stdout.cpython-312.pyc | Bin 2327 -> 0 bytes .../__pycache__/plain_text.cpython-312.pyc | Bin 7502 -> 0 bytes .../output/__pycache__/vt100.cpython-312.pyc | Bin 27603 -> 0 bytes .../output/__pycache__/win32.cpython-312.pyc | Bin 29544 -> 0 bytes .../__pycache__/windows10.cpython-312.pyc | Bin 5052 -> 0 bytes .../prompt_toolkit/output/base.py | 332 - .../prompt_toolkit/output/color_depth.py | 64 - .../prompt_toolkit/output/conemu.py | 65 - .../prompt_toolkit/output/defaults.py | 106 - .../prompt_toolkit/output/flush_stdout.py | 87 - .../prompt_toolkit/output/plain_text.py | 143 - .../prompt_toolkit/output/vt100.py | 757 -- .../prompt_toolkit/output/win32.py | 683 -- .../prompt_toolkit/output/windows10.py | 133 - .../prompt_toolkit/patch_stdout.py | 297 - .../site-packages/prompt_toolkit/py.typed | 0 .../site-packages/prompt_toolkit/renderer.py | 820 -- .../site-packages/prompt_toolkit/search.py | 226 - .../site-packages/prompt_toolkit/selection.py | 58 - .../prompt_toolkit/shortcuts/__init__.py | 46 - .../__pycache__/__init__.cpython-312.pyc | Bin 937 -> 0 bytes .../__pycache__/dialogs.cpython-312.pyc | Bin 12144 -> 0 bytes .../__pycache__/prompt.cpython-312.pyc | Bin 58180 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 8248 -> 0 bytes .../prompt_toolkit/shortcuts/dialogs.py | 330 - .../shortcuts/progress_bar/__init__.py | 33 - .../__pycache__/__init__.cpython-312.pyc | Bin 680 -> 0 bytes .../__pycache__/base.cpython-312.pyc | Bin 19074 -> 0 bytes .../__pycache__/formatters.cpython-312.pyc | Bin 17172 -> 0 bytes .../shortcuts/progress_bar/base.py | 449 - .../shortcuts/progress_bar/formatters.py | 431 - .../prompt_toolkit/shortcuts/prompt.py | 1513 --- .../prompt_toolkit/shortcuts/utils.py | 239 - .../prompt_toolkit/styles/__init__.py | 67 - .../__pycache__/__init__.cpython-312.pyc | Bin 1394 -> 0 bytes .../styles/__pycache__/base.cpython-312.pyc | Bin 5618 -> 0 bytes .../__pycache__/defaults.cpython-312.pyc | Bin 6722 -> 0 bytes .../__pycache__/named_colors.cpython-312.pyc | Bin 6315 -> 0 bytes .../__pycache__/pygments.cpython-312.pyc | Bin 2497 -> 0 bytes .../styles/__pycache__/style.cpython-312.pyc | Bin 15290 -> 0 bytes .../style_transformation.cpython-312.pyc | Bin 16352 -> 0 bytes .../prompt_toolkit/styles/base.py | 184 - .../prompt_toolkit/styles/defaults.py | 236 - .../prompt_toolkit/styles/named_colors.py | 162 - .../prompt_toolkit/styles/pygments.py | 70 - .../prompt_toolkit/styles/style.py | 401 - .../styles/style_transformation.py | 374 - .../site-packages/prompt_toolkit/token.py | 9 - .../site-packages/prompt_toolkit/utils.py | 327 - .../prompt_toolkit/validation.py | 192 - .../prompt_toolkit/widgets/__init__.py | 63 - .../__pycache__/__init__.cpython-312.pyc | Bin 1259 -> 0 bytes .../widgets/__pycache__/base.cpython-312.pyc | Bin 40378 -> 0 bytes .../__pycache__/dialogs.cpython-312.pyc | Bin 4066 -> 0 bytes .../widgets/__pycache__/menus.cpython-312.pyc | Bin 17838 -> 0 bytes .../__pycache__/toolbars.cpython-312.pyc | Bin 16464 -> 0 bytes .../prompt_toolkit/widgets/base.py | 995 -- .../prompt_toolkit/widgets/dialogs.py | 108 - .../prompt_toolkit/widgets/menus.py | 374 - .../prompt_toolkit/widgets/toolbars.py | 370 - .../prompt_toolkit/win32_types.py | 229 - .../ptyprocess-0.7.0.dist-info/INSTALLER | 1 - .../ptyprocess-0.7.0.dist-info/LICENSE | 16 - .../ptyprocess-0.7.0.dist-info/METADATA | 37 - .../ptyprocess-0.7.0.dist-info/RECORD | 13 - .../ptyprocess-0.7.0.dist-info/WHEEL | 5 - .../site-packages/ptyprocess/__init__.py | 4 - .../__pycache__/__init__.cpython-312.pyc | Bin 367 -> 0 bytes .../__pycache__/_fork_pty.cpython-312.pyc | Bin 3344 -> 0 bytes .../__pycache__/ptyprocess.cpython-312.pyc | Bin 34311 -> 0 bytes .../__pycache__/util.cpython-312.pyc | Bin 3227 -> 0 bytes .../site-packages/ptyprocess/_fork_pty.py | 78 - .../site-packages/ptyprocess/ptyprocess.py | 842 -- .../site-packages/ptyprocess/util.py | 71 - .../pure_eval-0.2.3.dist-info/INSTALLER | 1 - .../pure_eval-0.2.3.dist-info/LICENSE.txt | 21 - .../pure_eval-0.2.3.dist-info/METADATA | 227 - .../pure_eval-0.2.3.dist-info/RECORD | 17 - .../pure_eval-0.2.3.dist-info/WHEEL | 5 - .../pure_eval-0.2.3.dist-info/top_level.txt | 1 - .../site-packages/pure_eval/__init__.py | 17 - .../__pycache__/__init__.cpython-312.pyc | Bin 548 -> 0 bytes .../__pycache__/core.cpython-312.pyc | Bin 21504 -> 0 bytes .../my_getattr_static.cpython-312.pyc | Bin 5443 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 7815 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 202 -> 0 bytes .../site-packages/pure_eval/core.py | 449 - .../pure_eval/my_getattr_static.py | 140 - .../site-packages/pure_eval/py.typed | 1 - .../site-packages/pure_eval/utils.py | 206 - .../site-packages/pure_eval/version.py | 1 - .../pydantic-2.10.6.dist-info/INSTALLER | 1 - .../pydantic-2.10.6.dist-info/METADATA | 359 - .../pydantic-2.10.6.dist-info/RECORD | 214 - .../pydantic-2.10.6.dist-info/REQUESTED | 0 .../pydantic-2.10.6.dist-info/WHEEL | 4 - .../licenses/LICENSE | 21 - .../site-packages/pydantic/__init__.py | 431 - .../__pycache__/__init__.cpython-312.pyc | Bin 13789 -> 0 bytes .../__pycache__/_migration.cpython-312.pyc | Bin 10872 -> 0 bytes .../alias_generators.cpython-312.pyc | Bin 3281 -> 0 bytes .../__pycache__/aliases.cpython-312.pyc | Bin 6442 -> 0 bytes .../annotated_handlers.cpython-312.pyc | Bin 5487 -> 0 bytes .../class_validators.cpython-312.pyc | Bin 361 -> 0 bytes .../__pycache__/color.cpython-312.pyc | Bin 30173 -> 0 bytes .../__pycache__/config.cpython-312.pyc | Bin 5602 -> 0 bytes .../__pycache__/dataclasses.cpython-312.pyc | Bin 14741 -> 0 bytes .../datetime_parse.cpython-312.pyc | Bin 361 -> 0 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 351 -> 0 bytes .../__pycache__/env_settings.cpython-312.pyc | Bin 357 -> 0 bytes .../error_wrappers.cpython-312.pyc | Bin 361 -> 0 bytes .../__pycache__/errors.cpython-312.pyc | Bin 6318 -> 0 bytes .../__pycache__/fields.cpython-312.pyc | Bin 63235 -> 0 bytes .../functional_serializers.cpython-312.pyc | Bin 18046 -> 0 bytes .../functional_validators.cpython-312.pyc | Bin 32030 -> 0 bytes .../__pycache__/generics.cpython-312.pyc | Bin 349 -> 0 bytes .../pydantic/__pycache__/json.cpython-312.pyc | Bin 341 -> 0 bytes .../__pycache__/json_schema.cpython-312.pyc | Bin 111811 -> 0 bytes .../pydantic/__pycache__/main.cpython-312.pyc | Bin 70455 -> 0 bytes .../pydantic/__pycache__/mypy.cpython-312.pyc | Bin 60513 -> 0 bytes .../__pycache__/networks.cpython-312.pyc | Bin 49046 -> 0 bytes .../__pycache__/parse.cpython-312.pyc | Bin 343 -> 0 bytes .../__pycache__/root_model.cpython-312.pyc | Bin 7785 -> 0 bytes .../__pycache__/schema.cpython-312.pyc | Bin 345 -> 0 bytes .../__pycache__/tools.cpython-312.pyc | Bin 343 -> 0 bytes .../__pycache__/type_adapter.cpython-312.pyc | Bin 30120 -> 0 bytes .../__pycache__/types.cpython-312.pyc | Bin 96404 -> 0 bytes .../__pycache__/typing.cpython-312.pyc | Bin 341 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 343 -> 0 bytes .../validate_call_decorator.cpython-312.pyc | Bin 5410 -> 0 bytes .../__pycache__/validators.cpython-312.pyc | Bin 353 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 3833 -> 0 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 5247 -> 0 bytes .../pydantic/_internal/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 186 -> 0 bytes .../__pycache__/_config.cpython-312.pyc | Bin 14385 -> 0 bytes .../_core_metadata.cpython-312.pyc | Bin 4078 -> 0 bytes .../__pycache__/_core_utils.cpython-312.pyc | Bin 28955 -> 0 bytes .../__pycache__/_dataclasses.cpython-312.pyc | Bin 10047 -> 0 bytes .../__pycache__/_decorators.cpython-312.pyc | Bin 35184 -> 0 bytes .../_decorators_v1.cpython-312.pyc | Bin 8605 -> 0 bytes .../_discriminated_union.cpython-312.pyc | Bin 21456 -> 0 bytes .../_docs_extraction.cpython-312.pyc | Bin 5201 -> 0 bytes .../__pycache__/_fields.cpython-312.pyc | Bin 15223 -> 0 bytes .../__pycache__/_forward_ref.cpython-312.pyc | Bin 1295 -> 0 bytes .../_generate_schema.cpython-312.pyc | Bin 118185 -> 0 bytes .../__pycache__/_generics.cpython-312.pyc | Bin 23470 -> 0 bytes .../__pycache__/_git.cpython-312.pyc | Bin 1556 -> 0 bytes .../__pycache__/_import_utils.cpython-312.pyc | Bin 876 -> 0 bytes .../_internal_dataclass.cpython-312.pyc | Bin 335 -> 0 bytes .../_known_annotated_metadata.cpython-312.pyc | Bin 13936 -> 0 bytes .../__pycache__/_mock_val_ser.cpython-312.pyc | Bin 11241 -> 0 bytes .../_model_construction.cpython-312.pyc | Bin 33532 -> 0 bytes .../_namespace_utils.cpython-312.pyc | Bin 12118 -> 0 bytes .../__pycache__/_repr.cpython-312.pyc | Bin 7543 -> 0 bytes .../_schema_generation_shared.cpython-312.pyc | Bin 6342 -> 0 bytes .../__pycache__/_serializers.cpython-312.pyc | Bin 1915 -> 0 bytes .../__pycache__/_signature.cpython-312.pyc | Bin 6755 -> 0 bytes .../_std_types_schema.cpython-312.pyc | Bin 19062 -> 0 bytes .../__pycache__/_typing_extra.cpython-312.pyc | Bin 34486 -> 0 bytes .../__pycache__/_utils.cpython-312.pyc | Bin 17044 -> 0 bytes .../_validate_call.cpython-312.pyc | Bin 5743 -> 0 bytes .../__pycache__/_validators.cpython-312.pyc | Bin 16984 -> 0 bytes .../pydantic/_internal/_config.py | 345 - .../pydantic/_internal/_core_metadata.py | 91 - .../pydantic/_internal/_core_utils.py | 610 -- .../pydantic/_internal/_dataclasses.py | 246 - .../pydantic/_internal/_decorators.py | 823 -- .../pydantic/_internal/_decorators_v1.py | 174 - .../_internal/_discriminated_union.py | 503 - .../pydantic/_internal/_docs_extraction.py | 108 - .../pydantic/_internal/_fields.py | 392 - .../pydantic/_internal/_forward_ref.py | 23 - .../pydantic/_internal/_generate_schema.py | 2522 ----- .../pydantic/_internal/_generics.py | 536 - .../site-packages/pydantic/_internal/_git.py | 27 - .../pydantic/_internal/_import_utils.py | 20 - .../pydantic/_internal/_internal_dataclass.py | 7 - .../_internal/_known_annotated_metadata.py | 392 - .../pydantic/_internal/_mock_val_ser.py | 235 - .../pydantic/_internal/_model_construction.py | 792 -- .../pydantic/_internal/_namespace_utils.py | 284 - .../site-packages/pydantic/_internal/_repr.py | 123 - .../_internal/_schema_generation_shared.py | 126 - .../pydantic/_internal/_serializers.py | 51 - .../pydantic/_internal/_signature.py | 188 - .../pydantic/_internal/_std_types_schema.py | 404 - .../pydantic/_internal/_typing_extra.py | 893 -- .../pydantic/_internal/_utils.py | 389 - .../pydantic/_internal/_validate_call.py | 115 - .../pydantic/_internal/_validators.py | 424 - .../site-packages/pydantic/_migration.py | 308 - .../pydantic/alias_generators.py | 62 - .../site-packages/pydantic/aliases.py | 132 - .../pydantic/annotated_handlers.py | 122 - .../pydantic/class_validators.py | 5 - .../site-packages/pydantic/color.py | 604 -- .../site-packages/pydantic/config.py | 1049 -- .../site-packages/pydantic/dataclasses.py | 366 - .../site-packages/pydantic/datetime_parse.py | 5 - .../site-packages/pydantic/decorator.py | 5 - .../pydantic/deprecated/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 187 -> 0 bytes .../class_validators.cpython-312.pyc | Bin 11708 -> 0 bytes .../__pycache__/config.cpython-312.pyc | Bin 4061 -> 0 bytes .../copy_internals.cpython-312.pyc | Bin 8677 -> 0 bytes .../__pycache__/decorator.cpython-312.pyc | Bin 14044 -> 0 bytes .../__pycache__/json.cpython-312.pyc | Bin 6201 -> 0 bytes .../__pycache__/parse.cpython-312.pyc | Bin 3393 -> 0 bytes .../__pycache__/tools.cpython-312.pyc | Bin 3538 -> 0 bytes .../pydantic/deprecated/class_validators.py | 256 - .../pydantic/deprecated/config.py | 72 - .../pydantic/deprecated/copy_internals.py | 224 - .../pydantic/deprecated/decorator.py | 283 - .../site-packages/pydantic/deprecated/json.py | 141 - .../pydantic/deprecated/parse.py | 80 - .../pydantic/deprecated/tools.py | 103 - .../site-packages/pydantic/env_settings.py | 5 - .../site-packages/pydantic/error_wrappers.py | 5 - .../site-packages/pydantic/errors.py | 162 - .../pydantic/experimental/__init__.py | 10 - .../__pycache__/__init__.cpython-312.pyc | Bin 557 -> 0 bytes .../__pycache__/pipeline.cpython-312.pyc | Bin 34706 -> 0 bytes .../pydantic/experimental/pipeline.py | 669 -- .../site-packages/pydantic/fields.py | 1504 --- .../pydantic/functional_serializers.py | 449 - .../pydantic/functional_validators.py | 825 -- .../site-packages/pydantic/generics.py | 5 - .../python3.12/site-packages/pydantic/json.py | 5 - .../site-packages/pydantic/json_schema.py | 2649 ----- .../python3.12/site-packages/pydantic/main.py | 1688 ---- .../python3.12/site-packages/pydantic/mypy.py | 1320 --- .../site-packages/pydantic/networks.py | 1291 --- .../site-packages/pydantic/parse.py | 5 - .../site-packages/pydantic/plugin/__init__.py | 171 - .../__pycache__/__init__.cpython-312.pyc | Bin 7663 -> 0 bytes .../__pycache__/_loader.cpython-312.pyc | Bin 2376 -> 0 bytes .../_schema_validator.cpython-312.pyc | Bin 6899 -> 0 bytes .../site-packages/pydantic/plugin/_loader.py | 56 - .../pydantic/plugin/_schema_validator.py | 139 - .../site-packages/pydantic/py.typed | 0 .../site-packages/pydantic/root_model.py | 156 - .../site-packages/pydantic/schema.py | 5 - .../site-packages/pydantic/tools.py | 5 - .../site-packages/pydantic/type_adapter.py | 676 -- .../site-packages/pydantic/types.py | 3255 ------- .../site-packages/pydantic/typing.py | 5 - .../site-packages/pydantic/utils.py | 5 - .../site-packages/pydantic/v1/__init__.py | 131 - .../v1/__pycache__/__init__.cpython-312.pyc | Bin 2210 -> 0 bytes .../_hypothesis_plugin.cpython-312.pyc | Bin 20532 -> 0 bytes .../annotated_types.cpython-312.pyc | Bin 3863 -> 0 bytes .../class_validators.cpython-312.pyc | Bin 19662 -> 0 bytes .../v1/__pycache__/color.cpython-312.pyc | Bin 25817 -> 0 bytes .../v1/__pycache__/config.cpython-312.pyc | Bin 8390 -> 0 bytes .../__pycache__/dataclasses.cpython-312.pyc | Bin 22760 -> 0 bytes .../datetime_parse.cpython-312.pyc | Bin 10336 -> 0 bytes .../v1/__pycache__/decorator.cpython-312.pyc | Bin 13919 -> 0 bytes .../__pycache__/env_settings.cpython-312.pyc | Bin 17726 -> 0 bytes .../error_wrappers.cpython-312.pyc | Bin 8919 -> 0 bytes .../v1/__pycache__/errors.cpython-312.pyc | Bin 29588 -> 0 bytes .../v1/__pycache__/fields.cpython-312.pyc | Bin 57417 -> 0 bytes .../v1/__pycache__/generics.cpython-312.pyc | Bin 16983 -> 0 bytes .../v1/__pycache__/json.cpython-312.pyc | Bin 5220 -> 0 bytes .../v1/__pycache__/main.cpython-312.pyc | Bin 48160 -> 0 bytes .../v1/__pycache__/mypy.cpython-312.pyc | Bin 46482 -> 0 bytes .../v1/__pycache__/networks.cpython-312.pyc | Bin 29549 -> 0 bytes .../v1/__pycache__/parse.cpython-312.pyc | Bin 2737 -> 0 bytes .../v1/__pycache__/schema.cpython-312.pyc | Bin 48489 -> 0 bytes .../v1/__pycache__/tools.cpython-312.pyc | Bin 3870 -> 0 bytes .../v1/__pycache__/types.cpython-312.pyc | Bin 48492 -> 0 bytes .../v1/__pycache__/typing.cpython-312.pyc | Bin 22248 -> 0 bytes .../v1/__pycache__/utils.cpython-312.pyc | Bin 35235 -> 0 bytes .../v1/__pycache__/validators.cpython-312.pyc | Bin 30888 -> 0 bytes .../v1/__pycache__/version.cpython-312.pyc | Bin 1949 -> 0 bytes .../pydantic/v1/_hypothesis_plugin.py | 391 - .../pydantic/v1/annotated_types.py | 72 - .../pydantic/v1/class_validators.py | 361 - .../site-packages/pydantic/v1/color.py | 494 - .../site-packages/pydantic/v1/config.py | 191 - .../site-packages/pydantic/v1/dataclasses.py | 500 - .../pydantic/v1/datetime_parse.py | 248 - .../site-packages/pydantic/v1/decorator.py | 264 - .../site-packages/pydantic/v1/env_settings.py | 350 - .../pydantic/v1/error_wrappers.py | 161 - .../site-packages/pydantic/v1/errors.py | 646 -- .../site-packages/pydantic/v1/fields.py | 1253 --- .../site-packages/pydantic/v1/generics.py | 400 - .../site-packages/pydantic/v1/json.py | 112 - .../site-packages/pydantic/v1/main.py | 1107 --- .../site-packages/pydantic/v1/mypy.py | 949 -- .../site-packages/pydantic/v1/networks.py | 747 -- .../site-packages/pydantic/v1/parse.py | 66 - .../site-packages/pydantic/v1/py.typed | 0 .../site-packages/pydantic/v1/schema.py | 1163 --- .../site-packages/pydantic/v1/tools.py | 92 - .../site-packages/pydantic/v1/types.py | 1205 --- .../site-packages/pydantic/v1/typing.py | 608 -- .../site-packages/pydantic/v1/utils.py | 804 -- .../site-packages/pydantic/v1/validators.py | 768 -- .../site-packages/pydantic/v1/version.py | 38 - .../pydantic/validate_call_decorator.py | 115 - .../site-packages/pydantic/validators.py | 5 - .../site-packages/pydantic/version.py | 78 - .../site-packages/pydantic/warnings.py | 86 - .../pydantic_core-2.27.2.dist-info/INSTALLER | 1 - .../pydantic_core-2.27.2.dist-info/METADATA | 161 - .../pydantic_core-2.27.2.dist-info/RECORD | 12 - .../pydantic_core-2.27.2.dist-info/WHEEL | 4 - .../licenses/LICENSE | 21 - .../site-packages/pydantic_core/__init__.py | 139 - .../__pycache__/__init__.cpython-312.pyc | Bin 3057 -> 0 bytes .../__pycache__/core_schema.cpython-312.pyc | Bin 146425 -> 0 bytes .../pydantic_core/_pydantic_core.pyi | 1013 -- .../pydantic_core/core_schema.py | 4211 -------- .../site-packages/pydantic_core/py.typed | 0 .../pygments-2.19.1.dist-info/INSTALLER | 1 - .../pygments-2.19.1.dist-info/METADATA | 58 - .../pygments-2.19.1.dist-info/RECORD | 682 -- .../pygments-2.19.1.dist-info/WHEEL | 4 - .../entry_points.txt | 2 - .../licenses/AUTHORS | 291 - .../licenses/LICENSE | 25 - .../site-packages/pygments/__init__.py | 82 - .../site-packages/pygments/__main__.py | 17 - .../__pycache__/__init__.cpython-312.pyc | Bin 3449 -> 0 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 768 -> 0 bytes .../__pycache__/cmdline.cpython-312.pyc | Bin 26533 -> 0 bytes .../__pycache__/console.cpython-312.pyc | Bin 2618 -> 0 bytes .../__pycache__/filter.cpython-312.pyc | Bin 3211 -> 0 bytes .../__pycache__/formatter.cpython-312.pyc | Bin 4681 -> 0 bytes .../__pycache__/lexer.cpython-312.pyc | Bin 38745 -> 0 bytes .../__pycache__/modeline.cpython-312.pyc | Bin 1554 -> 0 bytes .../__pycache__/plugin.cpython-312.pyc | Bin 2613 -> 0 bytes .../__pycache__/regexopt.cpython-312.pyc | Bin 4066 -> 0 bytes .../__pycache__/scanner.cpython-312.pyc | Bin 4741 -> 0 bytes .../__pycache__/sphinxext.cpython-312.pyc | Bin 12096 -> 0 bytes .../__pycache__/style.cpython-312.pyc | Bin 6690 -> 0 bytes .../__pycache__/token.cpython-312.pyc | Bin 8179 -> 0 bytes .../__pycache__/unistring.cpython-312.pyc | Bin 32996 -> 0 bytes .../pygments/__pycache__/util.cpython-312.pyc | Bin 14068 -> 0 bytes .../site-packages/pygments/cmdline.py | 668 -- .../site-packages/pygments/console.py | 70 - .../site-packages/pygments/filter.py | 70 - .../pygments/filters/__init__.py | 940 -- .../__pycache__/__init__.cpython-312.pyc | Bin 37916 -> 0 bytes .../site-packages/pygments/formatter.py | 129 - .../pygments/formatters/__init__.py | 157 - .../__pycache__/__init__.cpython-312.pyc | Bin 6902 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 4200 -> 0 bytes .../__pycache__/bbcode.cpython-312.pyc | Bin 4193 -> 0 bytes .../__pycache__/groff.cpython-312.pyc | Bin 7293 -> 0 bytes .../__pycache__/html.cpython-312.pyc | Bin 41362 -> 0 bytes .../__pycache__/img.cpython-312.pyc | Bin 28674 -> 0 bytes .../__pycache__/irc.cpython-312.pyc | Bin 6014 -> 0 bytes .../__pycache__/latex.cpython-312.pyc | Bin 20108 -> 0 bytes .../__pycache__/other.cpython-312.pyc | Bin 6836 -> 0 bytes .../__pycache__/pangomarkup.cpython-312.pyc | Bin 2941 -> 0 bytes .../__pycache__/rtf.cpython-312.pyc | Bin 13773 -> 0 bytes .../__pycache__/svg.cpython-312.pyc | Bin 9100 -> 0 bytes .../__pycache__/terminal.cpython-312.pyc | Bin 5766 -> 0 bytes .../__pycache__/terminal256.cpython-312.pyc | Bin 15106 -> 0 bytes .../pygments/formatters/_mapping.py | 23 - .../pygments/formatters/bbcode.py | 108 - .../pygments/formatters/groff.py | 170 - .../site-packages/pygments/formatters/html.py | 995 -- .../site-packages/pygments/formatters/img.py | 686 -- .../site-packages/pygments/formatters/irc.py | 154 - .../pygments/formatters/latex.py | 518 - .../pygments/formatters/other.py | 160 - .../pygments/formatters/pangomarkup.py | 83 - .../site-packages/pygments/formatters/rtf.py | 349 - .../site-packages/pygments/formatters/svg.py | 185 - .../pygments/formatters/terminal.py | 127 - .../pygments/formatters/terminal256.py | 338 - .../site-packages/pygments/lexer.py | 961 -- .../site-packages/pygments/lexers/__init__.py | 362 - .../__pycache__/__init__.cpython-312.pyc | Bin 14672 -> 0 bytes .../__pycache__/_ada_builtins.cpython-312.pyc | Bin 1230 -> 0 bytes .../__pycache__/_asy_builtins.cpython-312.pyc | Bin 17623 -> 0 bytes .../__pycache__/_cl_builtins.cpython-312.pyc | Bin 11659 -> 0 bytes .../_cocoa_builtins.cpython-312.pyc | Bin 97563 -> 0 bytes .../_csound_builtins.cpython-312.pyc | Bin 16371 -> 0 bytes .../__pycache__/_css_builtins.cpython-312.pyc | Bin 9380 -> 0 bytes .../_googlesql_builtins.cpython-312.pyc | Bin 10818 -> 0 bytes .../_julia_builtins.cpython-312.pyc | Bin 8245 -> 0 bytes .../_lasso_builtins.cpython-312.pyc | Bin 76723 -> 0 bytes .../_lilypond_builtins.cpython-312.pyc | Bin 88401 -> 0 bytes .../__pycache__/_lua_builtins.cpython-312.pyc | Bin 8382 -> 0 bytes .../_luau_builtins.cpython-312.pyc | Bin 1044 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 66946 -> 0 bytes .../__pycache__/_mql_builtins.cpython-312.pyc | Bin 18004 -> 0 bytes .../_mysql_builtins.cpython-312.pyc | Bin 19550 -> 0 bytes .../_openedge_builtins.cpython-312.pyc | Bin 34086 -> 0 bytes .../__pycache__/_php_builtins.cpython-312.pyc | Bin 65519 -> 0 bytes .../_postgres_builtins.cpython-312.pyc | Bin 11291 -> 0 bytes .../_qlik_builtins.cpython-312.pyc | Bin 6371 -> 0 bytes .../_scheme_builtins.cpython-312.pyc | Bin 23168 -> 0 bytes .../_scilab_builtins.cpython-312.pyc | Bin 35215 -> 0 bytes .../_sourcemod_builtins.cpython-312.pyc | Bin 21833 -> 0 bytes .../_stan_builtins.cpython-312.pyc | Bin 9947 -> 0 bytes .../_stata_builtins.cpython-312.pyc | Bin 21231 -> 0 bytes .../_tsql_builtins.cpython-312.pyc | Bin 8863 -> 0 bytes .../__pycache__/_usd_builtins.cpython-312.pyc | Bin 1393 -> 0 bytes .../_vbscript_builtins.cpython-312.pyc | Bin 2922 -> 0 bytes .../__pycache__/_vim_builtins.cpython-312.pyc | Bin 30725 -> 0 bytes .../__pycache__/actionscript.cpython-312.pyc | Bin 11110 -> 0 bytes .../lexers/__pycache__/ada.cpython-312.pyc | Bin 5506 -> 0 bytes .../lexers/__pycache__/agile.cpython-312.pyc | Bin 1301 -> 0 bytes .../__pycache__/algebra.cpython-312.pyc | Bin 10990 -> 0 bytes .../__pycache__/ambient.cpython-312.pyc | Bin 3118 -> 0 bytes .../lexers/__pycache__/amdgpu.cpython-312.pyc | Bin 2241 -> 0 bytes .../lexers/__pycache__/ampl.cpython-312.pyc | Bin 4089 -> 0 bytes .../__pycache__/apdlexer.cpython-312.pyc | Bin 19030 -> 0 bytes .../lexers/__pycache__/apl.cpython-312.pyc | Bin 2510 -> 0 bytes .../__pycache__/archetype.cpython-312.pyc | Bin 9182 -> 0 bytes .../lexers/__pycache__/arrow.cpython-312.pyc | Bin 3560 -> 0 bytes .../lexers/__pycache__/arturo.cpython-312.pyc | Bin 9737 -> 0 bytes .../lexers/__pycache__/asc.cpython-312.pyc | Bin 2040 -> 0 bytes .../lexers/__pycache__/asm.cpython-312.pyc | Bin 36004 -> 0 bytes .../lexers/__pycache__/asn1.cpython-312.pyc | Bin 4481 -> 0 bytes .../__pycache__/automation.cpython-312.pyc | Bin 18408 -> 0 bytes .../lexers/__pycache__/bare.cpython-312.pyc | Bin 2867 -> 0 bytes .../lexers/__pycache__/basic.cpython-312.pyc | Bin 26964 -> 0 bytes .../lexers/__pycache__/bdd.cpython-312.pyc | Bin 2076 -> 0 bytes .../lexers/__pycache__/berry.cpython-312.pyc | Bin 3550 -> 0 bytes .../lexers/__pycache__/bibtex.cpython-312.pyc | Bin 5216 -> 0 bytes .../__pycache__/blueprint.cpython-312.pyc | Bin 5304 -> 0 bytes .../lexers/__pycache__/boa.cpython-312.pyc | Bin 3526 -> 0 bytes .../lexers/__pycache__/bqn.cpython-312.pyc | Bin 2540 -> 0 bytes .../__pycache__/business.cpython-312.pyc | Bin 22057 -> 0 bytes .../lexers/__pycache__/c_cpp.cpython-312.pyc | Bin 16088 -> 0 bytes .../lexers/__pycache__/c_like.cpython-312.pyc | Bin 27560 -> 0 bytes .../__pycache__/capnproto.cpython-312.pyc | Bin 2399 -> 0 bytes .../lexers/__pycache__/carbon.cpython-312.pyc | Bin 3537 -> 0 bytes .../lexers/__pycache__/cddl.cpython-312.pyc | Bin 4229 -> 0 bytes .../lexers/__pycache__/chapel.cpython-312.pyc | Bin 4263 -> 0 bytes .../lexers/__pycache__/clean.cpython-312.pyc | Bin 6072 -> 0 bytes .../lexers/__pycache__/codeql.cpython-312.pyc | Bin 2745 -> 0 bytes .../lexers/__pycache__/comal.cpython-312.pyc | Bin 3219 -> 0 bytes .../__pycache__/compiled.cpython-312.pyc | Bin 1992 -> 0 bytes .../__pycache__/configs.cpython-312.pyc | Bin 44510 -> 0 bytes .../__pycache__/console.cpython-312.pyc | Bin 4242 -> 0 bytes .../lexers/__pycache__/cplint.cpython-312.pyc | Bin 1754 -> 0 bytes .../__pycache__/crystal.cpython-312.pyc | Bin 15176 -> 0 bytes .../lexers/__pycache__/csound.cpython-312.pyc | Bin 14113 -> 0 bytes .../lexers/__pycache__/css.cpython-312.pyc | Bin 22099 -> 0 bytes .../lexers/__pycache__/d.cpython-312.pyc | Bin 8328 -> 0 bytes .../lexers/__pycache__/dalvik.cpython-312.pyc | Bin 4538 -> 0 bytes .../lexers/__pycache__/data.cpython-312.pyc | Bin 21162 -> 0 bytes .../lexers/__pycache__/dax.cpython-312.pyc | Bin 6239 -> 0 bytes .../__pycache__/devicetree.cpython-312.pyc | Bin 4039 -> 0 bytes .../lexers/__pycache__/diff.cpython-312.pyc | Bin 5674 -> 0 bytes .../lexers/__pycache__/dns.cpython-312.pyc | Bin 3773 -> 0 bytes .../lexers/__pycache__/dotnet.cpython-312.pyc | Bin 35221 -> 0 bytes .../lexers/__pycache__/dsls.cpython-312.pyc | Bin 33784 -> 0 bytes .../lexers/__pycache__/dylan.cpython-312.pyc | Bin 9728 -> 0 bytes .../lexers/__pycache__/ecl.cpython-312.pyc | Bin 5582 -> 0 bytes .../lexers/__pycache__/eiffel.cpython-312.pyc | Bin 2989 -> 0 bytes .../lexers/__pycache__/elm.cpython-312.pyc | Bin 3233 -> 0 bytes .../lexers/__pycache__/elpi.cpython-312.pyc | Bin 7231 -> 0 bytes .../lexers/__pycache__/email.cpython-312.pyc | Bin 5979 -> 0 bytes .../lexers/__pycache__/erlang.cpython-312.pyc | Bin 20544 -> 0 bytes .../__pycache__/esoteric.cpython-312.pyc | Bin 9761 -> 0 bytes .../lexers/__pycache__/ezhil.cpython-312.pyc | Bin 3855 -> 0 bytes .../lexers/__pycache__/factor.cpython-312.pyc | Bin 16922 -> 0 bytes .../lexers/__pycache__/fantom.cpython-312.pyc | Bin 7991 -> 0 bytes .../lexers/__pycache__/felix.cpython-312.pyc | Bin 8246 -> 0 bytes .../lexers/__pycache__/fift.cpython-312.pyc | Bin 1958 -> 0 bytes .../__pycache__/floscript.cpython-312.pyc | Bin 2976 -> 0 bytes .../lexers/__pycache__/forth.cpython-312.pyc | Bin 5352 -> 0 bytes .../__pycache__/fortran.cpython-312.pyc | Bin 8713 -> 0 bytes .../lexers/__pycache__/foxpro.cpython-312.pyc | Bin 20806 -> 0 bytes .../__pycache__/freefem.cpython-312.pyc | Bin 12781 -> 0 bytes .../lexers/__pycache__/func.cpython-312.pyc | Bin 3332 -> 0 bytes .../__pycache__/functional.cpython-312.pyc | Bin 1042 -> 0 bytes .../__pycache__/futhark.cpython-312.pyc | Bin 4074 -> 0 bytes .../__pycache__/gcodelexer.cpython-312.pyc | Bin 1314 -> 0 bytes .../__pycache__/gdscript.cpython-312.pyc | Bin 7208 -> 0 bytes .../lexers/__pycache__/gleam.cpython-312.pyc | Bin 2706 -> 0 bytes .../lexers/__pycache__/go.cpython-312.pyc | Bin 3381 -> 0 bytes .../grammar_notation.cpython-312.pyc | Bin 7711 -> 0 bytes .../lexers/__pycache__/graph.cpython-312.pyc | Bin 3808 -> 0 bytes .../__pycache__/graphics.cpython-312.pyc | Bin 29697 -> 0 bytes .../__pycache__/graphql.cpython-312.pyc | Bin 4441 -> 0 bytes .../__pycache__/graphviz.cpython-312.pyc | Bin 2215 -> 0 bytes .../lexers/__pycache__/gsql.cpython-312.pyc | Bin 3775 -> 0 bytes .../lexers/__pycache__/hare.cpython-312.pyc | Bin 2948 -> 0 bytes .../__pycache__/haskell.cpython-312.pyc | Bin 30494 -> 0 bytes .../lexers/__pycache__/haxe.cpython-312.pyc | Bin 22278 -> 0 bytes .../lexers/__pycache__/hdl.cpython-312.pyc | Bin 17473 -> 0 bytes .../__pycache__/hexdump.cpython-312.pyc | Bin 3649 -> 0 bytes .../lexers/__pycache__/html.cpython-312.pyc | Bin 20727 -> 0 bytes .../lexers/__pycache__/idl.cpython-312.pyc | Bin 12467 -> 0 bytes .../lexers/__pycache__/igor.cpython-312.pyc | Bin 25692 -> 0 bytes .../__pycache__/inferno.cpython-312.pyc | Bin 3245 -> 0 bytes .../__pycache__/installers.cpython-312.pyc | Bin 13774 -> 0 bytes .../__pycache__/int_fiction.cpython-312.pyc | Bin 48097 -> 0 bytes .../lexers/__pycache__/iolang.cpython-312.pyc | Bin 2209 -> 0 bytes .../lexers/__pycache__/j.cpython-312.pyc | Bin 4301 -> 0 bytes .../__pycache__/javascript.cpython-312.pyc | Bin 56993 -> 0 bytes .../__pycache__/jmespath.cpython-312.pyc | Bin 2399 -> 0 bytes .../lexers/__pycache__/jslt.cpython-312.pyc | Bin 3757 -> 0 bytes .../lexers/__pycache__/json5.cpython-312.pyc | Bin 2879 -> 0 bytes .../__pycache__/jsonnet.cpython-312.pyc | Bin 4855 -> 0 bytes .../lexers/__pycache__/jsx.cpython-312.pyc | Bin 2911 -> 0 bytes .../lexers/__pycache__/julia.cpython-312.pyc | Bin 10933 -> 0 bytes .../lexers/__pycache__/jvm.cpython-312.pyc | Bin 63870 -> 0 bytes .../lexers/__pycache__/kuin.cpython-312.pyc | Bin 9879 -> 0 bytes .../lexers/__pycache__/kusto.cpython-312.pyc | Bin 2841 -> 0 bytes .../lexers/__pycache__/ldap.cpython-312.pyc | Bin 6425 -> 0 bytes .../lexers/__pycache__/lean.cpython-312.pyc | Bin 7990 -> 0 bytes .../__pycache__/lilypond.cpython-312.pyc | Bin 8374 -> 0 bytes .../lexers/__pycache__/lisp.cpython-312.pyc | Bin 121639 -> 0 bytes .../__pycache__/macaulay2.cpython-312.pyc | Bin 23154 -> 0 bytes .../lexers/__pycache__/make.cpython-312.pyc | Bin 6668 -> 0 bytes .../lexers/__pycache__/maple.cpython-312.pyc | Bin 4977 -> 0 bytes .../lexers/__pycache__/markup.cpython-312.pyc | Bin 60415 -> 0 bytes .../lexers/__pycache__/math.cpython-312.pyc | Bin 1038 -> 0 bytes .../lexers/__pycache__/matlab.cpython-312.pyc | Bin 55737 -> 0 bytes .../lexers/__pycache__/maxima.cpython-312.pyc | Bin 3186 -> 0 bytes .../lexers/__pycache__/meson.cpython-312.pyc | Bin 3519 -> 0 bytes .../lexers/__pycache__/mime.cpython-312.pyc | Bin 10132 -> 0 bytes .../__pycache__/minecraft.cpython-312.pyc | Bin 10694 -> 0 bytes .../lexers/__pycache__/mips.cpython-312.pyc | Bin 3433 -> 0 bytes .../lexers/__pycache__/ml.cpython-312.pyc | Bin 26164 -> 0 bytes .../__pycache__/modeling.cpython-312.pyc | Bin 12068 -> 0 bytes .../__pycache__/modula2.cpython-312.pyc | Bin 26498 -> 0 bytes .../lexers/__pycache__/mojo.cpython-312.pyc | Bin 14359 -> 0 bytes .../lexers/__pycache__/monte.cpython-312.pyc | Bin 5111 -> 0 bytes .../lexers/__pycache__/mosel.cpython-312.pyc | Bin 6960 -> 0 bytes .../lexers/__pycache__/ncl.cpython-312.pyc | Bin 45912 -> 0 bytes .../lexers/__pycache__/nimrod.cpython-312.pyc | Bin 6458 -> 0 bytes .../lexers/__pycache__/nit.cpython-312.pyc | Bin 2754 -> 0 bytes .../lexers/__pycache__/nix.cpython-312.pyc | Bin 5463 -> 0 bytes .../__pycache__/numbair.cpython-312.pyc | Bin 2129 -> 0 bytes .../lexers/__pycache__/oberon.cpython-312.pyc | Bin 3743 -> 0 bytes .../__pycache__/objective.cpython-312.pyc | Bin 19467 -> 0 bytes .../lexers/__pycache__/ooc.cpython-312.pyc | Bin 3114 -> 0 bytes .../__pycache__/openscad.cpython-312.pyc | Bin 3726 -> 0 bytes .../lexers/__pycache__/other.cpython-312.pyc | Bin 2448 -> 0 bytes .../__pycache__/parasail.cpython-312.pyc | Bin 2883 -> 0 bytes .../__pycache__/parsers.cpython-312.pyc | Bin 24398 -> 0 bytes .../lexers/__pycache__/pascal.cpython-312.pyc | Bin 23938 -> 0 bytes .../lexers/__pycache__/pawn.cpython-312.pyc | Bin 7861 -> 0 bytes .../lexers/__pycache__/pddl.cpython-312.pyc | Bin 2809 -> 0 bytes .../lexers/__pycache__/perl.cpython-312.pyc | Bin 39014 -> 0 bytes .../lexers/__pycache__/phix.cpython-312.pyc | Bin 18420 -> 0 bytes .../lexers/__pycache__/php.cpython-312.pyc | Bin 14319 -> 0 bytes .../__pycache__/pointless.cpython-312.pyc | Bin 2293 -> 0 bytes .../lexers/__pycache__/pony.cpython-312.pyc | Bin 3422 -> 0 bytes .../lexers/__pycache__/praat.cpython-312.pyc | Bin 10284 -> 0 bytes .../__pycache__/procfile.cpython-312.pyc | Bin 1627 -> 0 bytes .../lexers/__pycache__/prolog.cpython-312.pyc | Bin 10529 -> 0 bytes .../lexers/__pycache__/promql.cpython-312.pyc | Bin 3332 -> 0 bytes .../lexers/__pycache__/prql.cpython-312.pyc | Bin 8380 -> 0 bytes .../lexers/__pycache__/ptx.cpython-312.pyc | Bin 3768 -> 0 bytes .../lexers/__pycache__/python.cpython-312.pyc | Bin 42911 -> 0 bytes .../lexers/__pycache__/q.cpython-312.pyc | Bin 5842 -> 0 bytes .../lexers/__pycache__/qlik.cpython-312.pyc | Bin 3508 -> 0 bytes .../lexers/__pycache__/qvt.cpython-312.pyc | Bin 5376 -> 0 bytes .../lexers/__pycache__/r.cpython-312.pyc | Bin 6086 -> 0 bytes .../lexers/__pycache__/rdf.cpython-312.pyc | Bin 12256 -> 0 bytes .../lexers/__pycache__/rebol.cpython-312.pyc | Bin 19247 -> 0 bytes .../lexers/__pycache__/rego.cpython-312.pyc | Bin 1872 -> 0 bytes .../__pycache__/resource.cpython-312.pyc | Bin 3584 -> 0 bytes .../lexers/__pycache__/ride.cpython-312.pyc | Bin 4486 -> 0 bytes .../lexers/__pycache__/rita.cpython-312.pyc | Bin 1467 -> 0 bytes .../lexers/__pycache__/rnc.cpython-312.pyc | Bin 2009 -> 0 bytes .../__pycache__/roboconf.cpython-312.pyc | Bin 2360 -> 0 bytes .../robotframework.cpython-312.pyc | Bin 29603 -> 0 bytes .../lexers/__pycache__/ruby.cpython-312.pyc | Bin 22587 -> 0 bytes .../lexers/__pycache__/rust.cpython-312.pyc | Bin 7302 -> 0 bytes .../lexers/__pycache__/sas.cpython-312.pyc | Bin 7037 -> 0 bytes .../lexers/__pycache__/savi.cpython-312.pyc | Bin 3978 -> 0 bytes .../lexers/__pycache__/scdoc.cpython-312.pyc | Bin 2816 -> 0 bytes .../__pycache__/scripting.cpython-312.pyc | Bin 71797 -> 0 bytes .../lexers/__pycache__/sgf.cpython-312.pyc | Bin 2077 -> 0 bytes .../lexers/__pycache__/shell.cpython-312.pyc | Bin 37098 -> 0 bytes .../lexers/__pycache__/sieve.cpython-312.pyc | Bin 2747 -> 0 bytes .../lexers/__pycache__/slash.cpython-312.pyc | Bin 8390 -> 0 bytes .../__pycache__/smalltalk.cpython-312.pyc | Bin 6699 -> 0 bytes .../lexers/__pycache__/smithy.cpython-312.pyc | Bin 3124 -> 0 bytes .../lexers/__pycache__/smv.cpython-312.pyc | Bin 2806 -> 0 bytes .../lexers/__pycache__/snobol.cpython-312.pyc | Bin 2502 -> 0 bytes .../__pycache__/solidity.cpython-312.pyc | Bin 3405 -> 0 bytes .../lexers/__pycache__/soong.cpython-312.pyc | Bin 2270 -> 0 bytes .../lexers/__pycache__/sophia.cpython-312.pyc | Bin 3850 -> 0 bytes .../__pycache__/special.cpython-312.pyc | Bin 5427 -> 0 bytes .../lexers/__pycache__/spice.cpython-312.pyc | Bin 3175 -> 0 bytes .../lexers/__pycache__/sql.cpython-312.pyc | Bin 45581 -> 0 bytes .../__pycache__/srcinfo.cpython-312.pyc | Bin 2005 -> 0 bytes .../lexers/__pycache__/stata.cpython-312.pyc | Bin 5157 -> 0 bytes .../__pycache__/supercollider.cpython-312.pyc | Bin 3907 -> 0 bytes .../__pycache__/tablegen.cpython-312.pyc | Bin 3349 -> 0 bytes .../lexers/__pycache__/tact.cpython-312.pyc | Bin 9034 -> 0 bytes .../lexers/__pycache__/tal.cpython-312.pyc | Bin 2971 -> 0 bytes .../lexers/__pycache__/tcl.cpython-312.pyc | Bin 5145 -> 0 bytes .../lexers/__pycache__/teal.cpython-312.pyc | Bin 3554 -> 0 bytes .../__pycache__/templates.cpython-312.pyc | Bin 83651 -> 0 bytes .../__pycache__/teraterm.cpython-312.pyc | Bin 5562 -> 0 bytes .../__pycache__/testing.cpython-312.pyc | Bin 10070 -> 0 bytes .../lexers/__pycache__/text.cpython-312.pyc | Bin 1552 -> 0 bytes .../__pycache__/textedit.cpython-312.pyc | Bin 8514 -> 0 bytes .../__pycache__/textfmts.cpython-312.pyc | Bin 15597 -> 0 bytes .../__pycache__/theorem.cpython-312.pyc | Bin 14905 -> 0 bytes .../__pycache__/thingsdb.cpython-312.pyc | Bin 5616 -> 0 bytes .../lexers/__pycache__/tlb.cpython-312.pyc | Bin 1869 -> 0 bytes .../lexers/__pycache__/tls.cpython-312.pyc | Bin 1927 -> 0 bytes .../lexers/__pycache__/tnt.cpython-312.pyc | Bin 13590 -> 0 bytes .../__pycache__/trafficscript.cpython-312.pyc | Bin 1846 -> 0 bytes .../__pycache__/typoscript.cpython-312.pyc | Bin 7362 -> 0 bytes .../lexers/__pycache__/typst.cpython-312.pyc | Bin 6907 -> 0 bytes .../lexers/__pycache__/ul4.cpython-312.pyc | Bin 8143 -> 0 bytes .../lexers/__pycache__/unicon.cpython-312.pyc | Bin 12510 -> 0 bytes .../lexers/__pycache__/urbi.cpython-312.pyc | Bin 5912 -> 0 bytes .../lexers/__pycache__/usd.cpython-312.pyc | Bin 4024 -> 0 bytes .../__pycache__/varnish.cpython-312.pyc | Bin 6947 -> 0 bytes .../__pycache__/verification.cpython-312.pyc | Bin 4031 -> 0 bytes .../__pycache__/verifpal.cpython-312.pyc | Bin 2973 -> 0 bytes .../lexers/__pycache__/vip.cpython-312.pyc | Bin 5696 -> 0 bytes .../lexers/__pycache__/vyper.cpython-312.pyc | Bin 4926 -> 0 bytes .../lexers/__pycache__/web.cpython-312.pyc | Bin 1316 -> 0 bytes .../__pycache__/webassembly.cpython-312.pyc | Bin 5822 -> 0 bytes .../lexers/__pycache__/webidl.cpython-312.pyc | Bin 8106 -> 0 bytes .../__pycache__/webmisc.cpython-312.pyc | Bin 43543 -> 0 bytes .../lexers/__pycache__/wgsl.cpython-312.pyc | Bin 10852 -> 0 bytes .../lexers/__pycache__/whiley.cpython-312.pyc | Bin 3637 -> 0 bytes .../lexers/__pycache__/wowtoc.cpython-312.pyc | Bin 3242 -> 0 bytes .../lexers/__pycache__/wren.cpython-312.pyc | Bin 3107 -> 0 bytes .../lexers/__pycache__/x10.cpython-312.pyc | Bin 2398 -> 0 bytes .../lexers/__pycache__/xorg.cpython-312.pyc | Bin 1387 -> 0 bytes .../lexers/__pycache__/yang.cpython-312.pyc | Bin 4151 -> 0 bytes .../lexers/__pycache__/yara.cpython-312.pyc | Bin 2733 -> 0 bytes .../lexers/__pycache__/zig.cpython-312.pyc | Bin 3896 -> 0 bytes .../pygments/lexers/_ada_builtins.py | 103 - .../pygments/lexers/_asy_builtins.py | 1644 ---- .../pygments/lexers/_cl_builtins.py | 231 - .../pygments/lexers/_cocoa_builtins.py | 75 - .../pygments/lexers/_csound_builtins.py | 1780 ---- .../pygments/lexers/_css_builtins.py | 558 -- .../pygments/lexers/_googlesql_builtins.py | 918 -- .../pygments/lexers/_julia_builtins.py | 411 - .../pygments/lexers/_lasso_builtins.py | 5326 ---------- .../pygments/lexers/_lilypond_builtins.py | 4932 ---------- .../pygments/lexers/_lua_builtins.py | 285 - .../pygments/lexers/_luau_builtins.py | 62 - .../site-packages/pygments/lexers/_mapping.py | 602 -- .../pygments/lexers/_mql_builtins.py | 1171 --- .../pygments/lexers/_mysql_builtins.py | 1335 --- .../pygments/lexers/_openedge_builtins.py | 2600 ----- .../pygments/lexers/_php_builtins.py | 3325 ------- .../pygments/lexers/_postgres_builtins.py | 739 -- .../pygments/lexers/_qlik_builtins.py | 666 -- .../pygments/lexers/_scheme_builtins.py | 1609 --- .../pygments/lexers/_scilab_builtins.py | 3093 ------ .../pygments/lexers/_sourcemod_builtins.py | 1151 --- .../pygments/lexers/_stan_builtins.py | 648 -- .../pygments/lexers/_stata_builtins.py | 457 - .../pygments/lexers/_tsql_builtins.py | 1003 -- .../pygments/lexers/_usd_builtins.py | 112 - .../pygments/lexers/_vbscript_builtins.py | 279 - .../pygments/lexers/_vim_builtins.py | 1938 ---- .../pygments/lexers/actionscript.py | 243 - .../site-packages/pygments/lexers/ada.py | 144 - .../site-packages/pygments/lexers/agile.py | 25 - .../site-packages/pygments/lexers/algebra.py | 299 - .../site-packages/pygments/lexers/ambient.py | 75 - .../site-packages/pygments/lexers/amdgpu.py | 54 - .../site-packages/pygments/lexers/ampl.py | 87 - .../site-packages/pygments/lexers/apdlexer.py | 593 -- .../site-packages/pygments/lexers/apl.py | 103 - .../pygments/lexers/archetype.py | 315 - .../site-packages/pygments/lexers/arrow.py | 116 - .../site-packages/pygments/lexers/arturo.py | 249 - .../site-packages/pygments/lexers/asc.py | 55 - .../site-packages/pygments/lexers/asm.py | 1051 -- .../site-packages/pygments/lexers/asn1.py | 178 - .../pygments/lexers/automation.py | 379 - .../site-packages/pygments/lexers/bare.py | 101 - .../site-packages/pygments/lexers/basic.py | 656 -- .../site-packages/pygments/lexers/bdd.py | 57 - .../site-packages/pygments/lexers/berry.py | 99 - .../site-packages/pygments/lexers/bibtex.py | 159 - .../pygments/lexers/blueprint.py | 173 - .../site-packages/pygments/lexers/boa.py | 97 - .../site-packages/pygments/lexers/bqn.py | 112 - .../site-packages/pygments/lexers/business.py | 625 -- .../site-packages/pygments/lexers/c_cpp.py | 414 - .../site-packages/pygments/lexers/c_like.py | 738 -- .../pygments/lexers/capnproto.py | 74 - .../site-packages/pygments/lexers/carbon.py | 95 - .../site-packages/pygments/lexers/cddl.py | 172 - .../site-packages/pygments/lexers/chapel.py | 139 - .../site-packages/pygments/lexers/clean.py | 180 - .../site-packages/pygments/lexers/codeql.py | 80 - .../site-packages/pygments/lexers/comal.py | 81 - .../site-packages/pygments/lexers/compiled.py | 35 - .../site-packages/pygments/lexers/configs.py | 1433 --- .../site-packages/pygments/lexers/console.py | 114 - .../site-packages/pygments/lexers/cplint.py | 43 - .../site-packages/pygments/lexers/crystal.py | 364 - .../site-packages/pygments/lexers/csound.py | 466 - .../site-packages/pygments/lexers/css.py | 602 -- .../site-packages/pygments/lexers/d.py | 259 - .../site-packages/pygments/lexers/dalvik.py | 126 - .../site-packages/pygments/lexers/data.py | 763 -- .../site-packages/pygments/lexers/dax.py | 135 - .../pygments/lexers/devicetree.py | 108 - .../site-packages/pygments/lexers/diff.py | 169 - .../site-packages/pygments/lexers/dns.py | 109 - .../site-packages/pygments/lexers/dotnet.py | 873 -- .../site-packages/pygments/lexers/dsls.py | 970 -- .../site-packages/pygments/lexers/dylan.py | 279 - .../site-packages/pygments/lexers/ecl.py | 144 - .../site-packages/pygments/lexers/eiffel.py | 68 - .../site-packages/pygments/lexers/elm.py | 123 - .../site-packages/pygments/lexers/elpi.py | 175 - .../site-packages/pygments/lexers/email.py | 132 - .../site-packages/pygments/lexers/erlang.py | 526 - .../site-packages/pygments/lexers/esoteric.py | 300 - .../site-packages/pygments/lexers/ezhil.py | 76 - .../site-packages/pygments/lexers/factor.py | 363 - .../site-packages/pygments/lexers/fantom.py | 251 - .../site-packages/pygments/lexers/felix.py | 275 - .../site-packages/pygments/lexers/fift.py | 68 - .../pygments/lexers/floscript.py | 81 - .../site-packages/pygments/lexers/forth.py | 178 - .../site-packages/pygments/lexers/fortran.py | 212 - .../site-packages/pygments/lexers/foxpro.py | 427 - .../site-packages/pygments/lexers/freefem.py | 893 -- .../site-packages/pygments/lexers/func.py | 110 - .../pygments/lexers/functional.py | 21 - .../site-packages/pygments/lexers/futhark.py | 105 - .../pygments/lexers/gcodelexer.py | 35 - .../site-packages/pygments/lexers/gdscript.py | 189 - .../site-packages/pygments/lexers/gleam.py | 74 - .../site-packages/pygments/lexers/go.py | 97 - .../pygments/lexers/grammar_notation.py | 262 - .../site-packages/pygments/lexers/graph.py | 108 - .../site-packages/pygments/lexers/graphics.py | 794 -- .../site-packages/pygments/lexers/graphql.py | 176 - .../site-packages/pygments/lexers/graphviz.py | 58 - .../site-packages/pygments/lexers/gsql.py | 103 - .../site-packages/pygments/lexers/hare.py | 73 - .../site-packages/pygments/lexers/haskell.py | 866 -- .../site-packages/pygments/lexers/haxe.py | 935 -- .../site-packages/pygments/lexers/hdl.py | 466 - .../site-packages/pygments/lexers/hexdump.py | 102 - .../site-packages/pygments/lexers/html.py | 670 -- .../site-packages/pygments/lexers/idl.py | 284 - .../site-packages/pygments/lexers/igor.py | 435 - .../site-packages/pygments/lexers/inferno.py | 95 - .../pygments/lexers/installers.py | 352 - .../pygments/lexers/int_fiction.py | 1370 --- .../site-packages/pygments/lexers/iolang.py | 61 - .../site-packages/pygments/lexers/j.py | 151 - .../pygments/lexers/javascript.py | 1591 --- .../site-packages/pygments/lexers/jmespath.py | 69 - .../site-packages/pygments/lexers/jslt.py | 94 - .../site-packages/pygments/lexers/json5.py | 83 - .../site-packages/pygments/lexers/jsonnet.py | 169 - .../site-packages/pygments/lexers/jsx.py | 100 - .../site-packages/pygments/lexers/julia.py | 294 - .../site-packages/pygments/lexers/jvm.py | 1802 ---- .../site-packages/pygments/lexers/kuin.py | 332 - .../site-packages/pygments/lexers/kusto.py | 93 - .../site-packages/pygments/lexers/ldap.py | 155 - .../site-packages/pygments/lexers/lean.py | 241 - .../site-packages/pygments/lexers/lilypond.py | 225 - .../site-packages/pygments/lexers/lisp.py | 3146 ------ .../pygments/lexers/macaulay2.py | 1814 ---- .../site-packages/pygments/lexers/make.py | 212 - .../site-packages/pygments/lexers/maple.py | 291 - .../site-packages/pygments/lexers/markup.py | 1654 ---- .../site-packages/pygments/lexers/math.py | 21 - .../site-packages/pygments/lexers/matlab.py | 3307 ------- .../site-packages/pygments/lexers/maxima.py | 84 - .../site-packages/pygments/lexers/meson.py | 139 - .../site-packages/pygments/lexers/mime.py | 210 - .../pygments/lexers/minecraft.py | 391 - .../site-packages/pygments/lexers/mips.py | 130 - .../site-packages/pygments/lexers/ml.py | 958 -- .../site-packages/pygments/lexers/modeling.py | 366 - .../site-packages/pygments/lexers/modula2.py | 1579 --- .../site-packages/pygments/lexers/mojo.py | 707 -- .../site-packages/pygments/lexers/monte.py | 203 - .../site-packages/pygments/lexers/mosel.py | 447 - .../site-packages/pygments/lexers/ncl.py | 894 -- .../site-packages/pygments/lexers/nimrod.py | 199 - .../site-packages/pygments/lexers/nit.py | 63 - .../site-packages/pygments/lexers/nix.py | 144 - .../site-packages/pygments/lexers/numbair.py | 63 - .../site-packages/pygments/lexers/oberon.py | 120 - .../pygments/lexers/objective.py | 513 - .../site-packages/pygments/lexers/ooc.py | 84 - .../site-packages/pygments/lexers/openscad.py | 96 - .../site-packages/pygments/lexers/other.py | 41 - .../site-packages/pygments/lexers/parasail.py | 78 - .../site-packages/pygments/lexers/parsers.py | 798 -- .../site-packages/pygments/lexers/pascal.py | 644 -- .../site-packages/pygments/lexers/pawn.py | 202 - .../site-packages/pygments/lexers/pddl.py | 82 - .../site-packages/pygments/lexers/perl.py | 733 -- .../site-packages/pygments/lexers/phix.py | 363 - .../site-packages/pygments/lexers/php.py | 334 - .../pygments/lexers/pointless.py | 70 - .../site-packages/pygments/lexers/pony.py | 93 - .../site-packages/pygments/lexers/praat.py | 303 - .../site-packages/pygments/lexers/procfile.py | 41 - .../site-packages/pygments/lexers/prolog.py | 318 - .../site-packages/pygments/lexers/promql.py | 176 - .../site-packages/pygments/lexers/prql.py | 251 - .../site-packages/pygments/lexers/ptx.py | 119 - .../site-packages/pygments/lexers/python.py | 1201 --- .../site-packages/pygments/lexers/q.py | 187 - .../site-packages/pygments/lexers/qlik.py | 117 - .../site-packages/pygments/lexers/qvt.py | 153 - .../site-packages/pygments/lexers/r.py | 196 - .../site-packages/pygments/lexers/rdf.py | 468 - .../site-packages/pygments/lexers/rebol.py | 419 - .../site-packages/pygments/lexers/rego.py | 57 - .../site-packages/pygments/lexers/resource.py | 83 - .../site-packages/pygments/lexers/ride.py | 138 - .../site-packages/pygments/lexers/rita.py | 42 - .../site-packages/pygments/lexers/rnc.py | 66 - .../site-packages/pygments/lexers/roboconf.py | 81 - .../pygments/lexers/robotframework.py | 551 -- .../site-packages/pygments/lexers/ruby.py | 518 - .../site-packages/pygments/lexers/rust.py | 222 - .../site-packages/pygments/lexers/sas.py | 227 - .../site-packages/pygments/lexers/savi.py | 171 - .../site-packages/pygments/lexers/scdoc.py | 85 - .../pygments/lexers/scripting.py | 1614 ---- .../site-packages/pygments/lexers/sgf.py | 59 - .../site-packages/pygments/lexers/shell.py | 902 -- .../site-packages/pygments/lexers/sieve.py | 78 - .../site-packages/pygments/lexers/slash.py | 183 - .../pygments/lexers/smalltalk.py | 194 - .../site-packages/pygments/lexers/smithy.py | 77 - .../site-packages/pygments/lexers/smv.py | 78 - .../site-packages/pygments/lexers/snobol.py | 82 - .../site-packages/pygments/lexers/solidity.py | 87 - .../site-packages/pygments/lexers/soong.py | 78 - .../site-packages/pygments/lexers/sophia.py | 102 - .../site-packages/pygments/lexers/special.py | 122 - .../site-packages/pygments/lexers/spice.py | 70 - .../site-packages/pygments/lexers/sql.py | 1203 --- .../site-packages/pygments/lexers/srcinfo.py | 62 - .../site-packages/pygments/lexers/stata.py | 170 - .../pygments/lexers/supercollider.py | 94 - .../site-packages/pygments/lexers/tablegen.py | 177 - .../site-packages/pygments/lexers/tact.py | 303 - .../site-packages/pygments/lexers/tal.py | 77 - .../site-packages/pygments/lexers/tcl.py | 148 - .../site-packages/pygments/lexers/teal.py | 88 - .../pygments/lexers/templates.py | 2355 ----- .../site-packages/pygments/lexers/teraterm.py | 325 - .../site-packages/pygments/lexers/testing.py | 209 - .../site-packages/pygments/lexers/text.py | 27 - .../site-packages/pygments/lexers/textedit.py | 205 - .../site-packages/pygments/lexers/textfmts.py | 436 - .../site-packages/pygments/lexers/theorem.py | 410 - .../site-packages/pygments/lexers/thingsdb.py | 140 - .../site-packages/pygments/lexers/tlb.py | 59 - .../site-packages/pygments/lexers/tls.py | 54 - .../site-packages/pygments/lexers/tnt.py | 270 - .../pygments/lexers/trafficscript.py | 51 - .../pygments/lexers/typoscript.py | 216 - .../site-packages/pygments/lexers/typst.py | 160 - .../site-packages/pygments/lexers/ul4.py | 309 - .../site-packages/pygments/lexers/unicon.py | 413 - .../site-packages/pygments/lexers/urbi.py | 145 - .../site-packages/pygments/lexers/usd.py | 85 - .../site-packages/pygments/lexers/varnish.py | 189 - .../pygments/lexers/verification.py | 113 - .../site-packages/pygments/lexers/verifpal.py | 65 - .../site-packages/pygments/lexers/vip.py | 150 - .../site-packages/pygments/lexers/vyper.py | 140 - .../site-packages/pygments/lexers/web.py | 24 - .../pygments/lexers/webassembly.py | 119 - .../site-packages/pygments/lexers/webidl.py | 298 - .../site-packages/pygments/lexers/webmisc.py | 1006 -- .../site-packages/pygments/lexers/wgsl.py | 406 - .../site-packages/pygments/lexers/whiley.py | 115 - .../site-packages/pygments/lexers/wowtoc.py | 120 - .../site-packages/pygments/lexers/wren.py | 98 - .../site-packages/pygments/lexers/x10.py | 66 - .../site-packages/pygments/lexers/xorg.py | 38 - .../site-packages/pygments/lexers/yang.py | 103 - .../site-packages/pygments/lexers/yara.py | 69 - .../site-packages/pygments/lexers/zig.py | 125 - .../site-packages/pygments/modeline.py | 43 - .../site-packages/pygments/plugin.py | 72 - .../site-packages/pygments/regexopt.py | 91 - .../site-packages/pygments/scanner.py | 104 - .../site-packages/pygments/sphinxext.py | 247 - .../site-packages/pygments/style.py | 203 - .../site-packages/pygments/styles/__init__.py | 61 - .../__pycache__/__init__.cpython-312.pyc | Bin 2620 -> 0 bytes .../__pycache__/_mapping.cpython-312.pyc | Bin 3633 -> 0 bytes .../styles/__pycache__/abap.cpython-312.pyc | Bin 1068 -> 0 bytes .../styles/__pycache__/algol.cpython-312.pyc | Bin 2588 -> 0 bytes .../__pycache__/algol_nu.cpython-312.pyc | Bin 2603 -> 0 bytes .../__pycache__/arduino.cpython-312.pyc | Bin 4262 -> 0 bytes .../styles/__pycache__/autumn.cpython-312.pyc | Bin 2844 -> 0 bytes .../__pycache__/borland.cpython-312.pyc | Bin 2213 -> 0 bytes .../styles/__pycache__/bw.cpython-312.pyc | Bin 1890 -> 0 bytes .../styles/__pycache__/coffee.cpython-312.pyc | Bin 3434 -> 0 bytes .../__pycache__/colorful.cpython-312.pyc | Bin 3702 -> 0 bytes .../__pycache__/default.cpython-312.pyc | Bin 3204 -> 0 bytes .../__pycache__/dracula.cpython-312.pyc | Bin 3017 -> 0 bytes .../styles/__pycache__/emacs.cpython-312.pyc | Bin 3244 -> 0 bytes .../__pycache__/friendly.cpython-312.pyc | Bin 3340 -> 0 bytes .../friendly_grayscale.cpython-312.pyc | Bin 3550 -> 0 bytes .../styles/__pycache__/fruity.cpython-312.pyc | Bin 1919 -> 0 bytes .../__pycache__/gh_dark.cpython-312.pyc | Bin 4008 -> 0 bytes .../__pycache__/gruvbox.cpython-312.pyc | Bin 4356 -> 0 bytes .../styles/__pycache__/igor.cpython-312.pyc | Bin 1113 -> 0 bytes .../styles/__pycache__/inkpot.cpython-312.pyc | Bin 2975 -> 0 bytes .../__pycache__/lightbulb.cpython-312.pyc | Bin 4346 -> 0 bytes .../__pycache__/lilypond.cpython-312.pyc | Bin 3487 -> 0 bytes .../__pycache__/lovelace.cpython-312.pyc | Bin 4240 -> 0 bytes .../styles/__pycache__/manni.cpython-312.pyc | Bin 3475 -> 0 bytes .../__pycache__/material.cpython-312.pyc | Bin 4788 -> 0 bytes .../__pycache__/monokai.cpython-312.pyc | Bin 4769 -> 0 bytes .../styles/__pycache__/murphy.cpython-312.pyc | Bin 3660 -> 0 bytes .../styles/__pycache__/native.cpython-312.pyc | Bin 2937 -> 0 bytes .../styles/__pycache__/nord.cpython-312.pyc | Bin 5566 -> 0 bytes .../__pycache__/onedark.cpython-312.pyc | Bin 2243 -> 0 bytes .../__pycache__/paraiso_dark.cpython-312.pyc | Bin 5109 -> 0 bytes .../__pycache__/paraiso_light.cpython-312.pyc | Bin 5115 -> 0 bytes .../styles/__pycache__/pastie.cpython-312.pyc | Bin 3449 -> 0 bytes .../__pycache__/perldoc.cpython-312.pyc | Bin 3035 -> 0 bytes .../__pycache__/rainbow_dash.cpython-312.pyc | Bin 3681 -> 0 bytes .../styles/__pycache__/rrt.cpython-312.pyc | Bin 1443 -> 0 bytes .../styles/__pycache__/sas.cpython-312.pyc | Bin 1788 -> 0 bytes .../__pycache__/solarized.cpython-312.pyc | Bin 5740 -> 0 bytes .../__pycache__/staroffice.cpython-312.pyc | Bin 1091 -> 0 bytes .../__pycache__/stata_dark.cpython-312.pyc | Bin 1658 -> 0 bytes .../__pycache__/stata_light.cpython-312.pyc | Bin 1659 -> 0 bytes .../styles/__pycache__/tango.cpython-312.pyc | Bin 6112 -> 0 bytes .../styles/__pycache__/trac.cpython-312.pyc | Bin 2584 -> 0 bytes .../styles/__pycache__/vim.cpython-312.pyc | Bin 2467 -> 0 bytes .../styles/__pycache__/vs.cpython-312.pyc | Bin 1472 -> 0 bytes .../styles/__pycache__/xcode.cpython-312.pyc | Bin 1810 -> 0 bytes .../__pycache__/zenburn.cpython-312.pyc | Bin 3319 -> 0 bytes .../site-packages/pygments/styles/_mapping.py | 54 - .../site-packages/pygments/styles/abap.py | 32 - .../site-packages/pygments/styles/algol.py | 65 - .../site-packages/pygments/styles/algol_nu.py | 65 - .../site-packages/pygments/styles/arduino.py | 100 - .../site-packages/pygments/styles/autumn.py | 67 - .../site-packages/pygments/styles/borland.py | 53 - .../site-packages/pygments/styles/bw.py | 52 - .../site-packages/pygments/styles/coffee.py | 80 - .../site-packages/pygments/styles/colorful.py | 83 - .../site-packages/pygments/styles/default.py | 76 - .../site-packages/pygments/styles/dracula.py | 90 - .../site-packages/pygments/styles/emacs.py | 75 - .../site-packages/pygments/styles/friendly.py | 76 - .../pygments/styles/friendly_grayscale.py | 80 - .../site-packages/pygments/styles/fruity.py | 47 - .../site-packages/pygments/styles/gh_dark.py | 113 - .../site-packages/pygments/styles/gruvbox.py | 118 - .../site-packages/pygments/styles/igor.py | 32 - .../site-packages/pygments/styles/inkpot.py | 72 - .../pygments/styles/lightbulb.py | 110 - .../site-packages/pygments/styles/lilypond.py | 62 - .../site-packages/pygments/styles/lovelace.py | 100 - .../site-packages/pygments/styles/manni.py | 79 - .../site-packages/pygments/styles/material.py | 124 - .../site-packages/pygments/styles/monokai.py | 112 - .../site-packages/pygments/styles/murphy.py | 82 - .../site-packages/pygments/styles/native.py | 70 - .../site-packages/pygments/styles/nord.py | 156 - .../site-packages/pygments/styles/onedark.py | 63 - .../pygments/styles/paraiso_dark.py | 124 - .../pygments/styles/paraiso_light.py | 124 - .../site-packages/pygments/styles/pastie.py | 78 - .../site-packages/pygments/styles/perldoc.py | 73 - .../pygments/styles/rainbow_dash.py | 95 - .../site-packages/pygments/styles/rrt.py | 40 - .../site-packages/pygments/styles/sas.py | 46 - .../pygments/styles/solarized.py | 144 - .../pygments/styles/staroffice.py | 31 - .../pygments/styles/stata_dark.py | 42 - .../pygments/styles/stata_light.py | 42 - .../site-packages/pygments/styles/tango.py | 143 - .../site-packages/pygments/styles/trac.py | 66 - .../site-packages/pygments/styles/vim.py | 67 - .../site-packages/pygments/styles/vs.py | 41 - .../site-packages/pygments/styles/xcode.py | 53 - .../site-packages/pygments/styles/zenburn.py | 83 - .../site-packages/pygments/token.py | 214 - .../site-packages/pygments/unistring.py | 153 - .../python3.12/site-packages/pygments/util.py | 324 - .../rich-13.9.4.dist-info/INSTALLER | 1 - .../rich-13.9.4.dist-info/LICENSE | 19 - .../rich-13.9.4.dist-info/METADATA | 473 - .../rich-13.9.4.dist-info/RECORD | 163 - .../rich-13.9.4.dist-info/REQUESTED | 0 .../site-packages/rich-13.9.4.dist-info/WHEEL | 4 - .../python3.12/site-packages/rich/__init__.py | 177 - .../python3.12/site-packages/rich/__main__.py | 273 - .../rich/__pycache__/__init__.cpython-312.pyc | Bin 6976 -> 0 bytes .../rich/__pycache__/__main__.cpython-312.pyc | Bin 10145 -> 0 bytes .../__pycache__/_cell_widths.cpython-312.pyc | Bin 7857 -> 0 bytes .../__pycache__/_emoji_codes.cpython-312.pyc | Bin 205961 -> 0 bytes .../_emoji_replace.cpython-312.pyc | Bin 1714 -> 0 bytes .../_export_format.cpython-312.pyc | Bin 2334 -> 0 bytes .../__pycache__/_extension.cpython-312.pyc | Bin 498 -> 0 bytes .../rich/__pycache__/_fileno.cpython-312.pyc | Bin 840 -> 0 bytes .../rich/__pycache__/_inspect.cpython-312.pyc | Bin 12011 -> 0 bytes .../__pycache__/_log_render.cpython-312.pyc | Bin 4120 -> 0 bytes .../rich/__pycache__/_loop.cpython-312.pyc | Bin 1870 -> 0 bytes .../__pycache__/_null_file.cpython-312.pyc | Bin 3614 -> 0 bytes .../__pycache__/_palettes.cpython-312.pyc | Bin 5145 -> 0 bytes .../rich/__pycache__/_pick.cpython-312.pyc | Bin 711 -> 0 bytes .../rich/__pycache__/_ratio.cpython-312.pyc | Bin 6550 -> 0 bytes .../__pycache__/_spinners.cpython-312.pyc | Bin 13164 -> 0 bytes .../rich/__pycache__/_stack.cpython-312.pyc | Bin 950 -> 0 bytes .../rich/__pycache__/_timer.cpython-312.pyc | Bin 850 -> 0 bytes .../_win32_console.cpython-312.pyc | Bin 28760 -> 0 bytes .../rich/__pycache__/_windows.cpython-312.pyc | Bin 2451 -> 0 bytes .../_windows_renderer.cpython-312.pyc | Bin 3534 -> 0 bytes .../rich/__pycache__/_wrap.cpython-312.pyc | Bin 3321 -> 0 bytes .../rich/__pycache__/abc.cpython-312.pyc | Bin 1581 -> 0 bytes .../rich/__pycache__/align.cpython-312.pyc | Bin 12363 -> 0 bytes .../rich/__pycache__/ansi.cpython-312.pyc | Bin 9106 -> 0 bytes .../rich/__pycache__/bar.cpython-312.pyc | Bin 4257 -> 0 bytes .../rich/__pycache__/box.cpython-312.pyc | Bin 11795 -> 0 bytes .../rich/__pycache__/cells.cpython-312.pyc | Bin 5563 -> 0 bytes .../rich/__pycache__/color.cpython-312.pyc | Bin 26538 -> 0 bytes .../__pycache__/color_triplet.cpython-312.pyc | Bin 1686 -> 0 bytes .../rich/__pycache__/columns.cpython-312.pyc | Bin 8572 -> 0 bytes .../rich/__pycache__/console.cpython-312.pyc | Bin 114716 -> 0 bytes .../__pycache__/constrain.cpython-312.pyc | Bin 2243 -> 0 bytes .../__pycache__/containers.cpython-312.pyc | Bin 9216 -> 0 bytes .../rich/__pycache__/control.cpython-312.pyc | Bin 10890 -> 0 bytes .../default_styles.cpython-312.pyc | Bin 10394 -> 0 bytes .../rich/__pycache__/diagnose.cpython-312.pyc | Bin 1424 -> 0 bytes .../rich/__pycache__/emoji.cpython-312.pyc | Bin 4158 -> 0 bytes .../rich/__pycache__/errors.cpython-312.pyc | Bin 1830 -> 0 bytes .../__pycache__/file_proxy.cpython-312.pyc | Bin 3562 -> 0 bytes .../rich/__pycache__/filesize.cpython-312.pyc | Bin 3042 -> 0 bytes .../__pycache__/highlighter.cpython-312.pyc | Bin 9885 -> 0 bytes .../rich/__pycache__/json.cpython-312.pyc | Bin 6008 -> 0 bytes .../rich/__pycache__/jupyter.cpython-312.pyc | Bin 5182 -> 0 bytes .../rich/__pycache__/layout.cpython-312.pyc | Bin 20157 -> 0 bytes .../rich/__pycache__/live.cpython-312.pyc | Bin 19127 -> 0 bytes .../__pycache__/live_render.cpython-312.pyc | Bin 4867 -> 0 bytes .../rich/__pycache__/logging.cpython-312.pyc | Bin 14037 -> 0 bytes .../rich/__pycache__/markdown.cpython-312.pyc | Bin 36040 -> 0 bytes .../rich/__pycache__/markup.cpython-312.pyc | Bin 9551 -> 0 bytes .../rich/__pycache__/measure.cpython-312.pyc | Bin 6361 -> 0 bytes .../rich/__pycache__/padding.cpython-312.pyc | Bin 6916 -> 0 bytes .../rich/__pycache__/pager.cpython-312.pyc | Bin 1805 -> 0 bytes .../rich/__pycache__/palette.cpython-312.pyc | Bin 5227 -> 0 bytes .../rich/__pycache__/panel.cpython-312.pyc | Bin 12760 -> 0 bytes .../rich/__pycache__/pretty.cpython-312.pyc | Bin 40594 -> 0 bytes .../rich/__pycache__/progress.cpython-312.pyc | Bin 75891 -> 0 bytes .../__pycache__/progress_bar.cpython-312.pyc | Bin 10374 -> 0 bytes .../rich/__pycache__/prompt.cpython-312.pyc | Bin 15970 -> 0 bytes .../rich/__pycache__/protocol.cpython-312.pyc | Bin 1765 -> 0 bytes .../rich/__pycache__/region.cpython-312.pyc | Bin 552 -> 0 bytes .../rich/__pycache__/repr.cpython-312.pyc | Bin 6597 -> 0 bytes .../rich/__pycache__/rule.cpython-312.pyc | Bin 6541 -> 0 bytes .../rich/__pycache__/scope.cpython-312.pyc | Bin 3803 -> 0 bytes .../rich/__pycache__/screen.cpython-312.pyc | Bin 2457 -> 0 bytes .../rich/__pycache__/segment.cpython-312.pyc | Bin 28532 -> 0 bytes .../rich/__pycache__/spinner.cpython-312.pyc | Bin 6075 -> 0 bytes .../rich/__pycache__/status.cpython-312.pyc | Bin 6053 -> 0 bytes .../rich/__pycache__/style.cpython-312.pyc | Bin 33475 -> 0 bytes .../rich/__pycache__/styled.cpython-312.pyc | Bin 2100 -> 0 bytes .../rich/__pycache__/syntax.cpython-312.pyc | Bin 40090 -> 0 bytes .../rich/__pycache__/table.cpython-312.pyc | Bin 43877 -> 0 bytes .../terminal_theme.cpython-312.pyc | Bin 3333 -> 0 bytes .../rich/__pycache__/text.cpython-312.pyc | Bin 61227 -> 0 bytes .../rich/__pycache__/theme.cpython-312.pyc | Bin 6317 -> 0 bytes .../rich/__pycache__/themes.cpython-312.pyc | Bin 299 -> 0 bytes .../__pycache__/traceback.cpython-312.pyc | Bin 32865 -> 0 bytes .../rich/__pycache__/tree.cpython-312.pyc | Bin 11721 -> 0 bytes .../site-packages/rich/_cell_widths.py | 454 - .../site-packages/rich/_emoji_codes.py | 3610 ------- .../site-packages/rich/_emoji_replace.py | 32 - .../site-packages/rich/_export_format.py | 76 - .../site-packages/rich/_extension.py | 10 - .../python3.12/site-packages/rich/_fileno.py | 24 - .../python3.12/site-packages/rich/_inspect.py | 268 - .../site-packages/rich/_log_render.py | 94 - .../python3.12/site-packages/rich/_loop.py | 43 - .../site-packages/rich/_null_file.py | 69 - .../site-packages/rich/_palettes.py | 309 - .../python3.12/site-packages/rich/_pick.py | 17 - .../python3.12/site-packages/rich/_ratio.py | 159 - .../site-packages/rich/_spinners.py | 482 - .../python3.12/site-packages/rich/_stack.py | 16 - .../python3.12/site-packages/rich/_timer.py | 19 - .../site-packages/rich/_win32_console.py | 661 -- .../python3.12/site-packages/rich/_windows.py | 71 - .../site-packages/rich/_windows_renderer.py | 56 - .../python3.12/site-packages/rich/_wrap.py | 93 - .../lib/python3.12/site-packages/rich/abc.py | 33 - .../python3.12/site-packages/rich/align.py | 312 - .../lib/python3.12/site-packages/rich/ansi.py | 241 - .../lib/python3.12/site-packages/rich/bar.py | 93 - .../lib/python3.12/site-packages/rich/box.py | 480 - .../python3.12/site-packages/rich/cells.py | 174 - .../python3.12/site-packages/rich/color.py | 621 -- .../site-packages/rich/color_triplet.py | 38 - .../python3.12/site-packages/rich/columns.py | 187 - .../python3.12/site-packages/rich/console.py | 2661 ----- .../site-packages/rich/constrain.py | 37 - .../site-packages/rich/containers.py | 167 - .../python3.12/site-packages/rich/control.py | 225 - .../site-packages/rich/default_styles.py | 191 - .../python3.12/site-packages/rich/diagnose.py | 37 - .../python3.12/site-packages/rich/emoji.py | 96 - .../python3.12/site-packages/rich/errors.py | 34 - .../site-packages/rich/file_proxy.py | 57 - .../python3.12/site-packages/rich/filesize.py | 88 - .../site-packages/rich/highlighter.py | 232 - .../lib/python3.12/site-packages/rich/json.py | 139 - .../python3.12/site-packages/rich/jupyter.py | 101 - .../python3.12/site-packages/rich/layout.py | 442 - .../lib/python3.12/site-packages/rich/live.py | 375 - .../site-packages/rich/live_render.py | 112 - .../python3.12/site-packages/rich/logging.py | 297 - .../python3.12/site-packages/rich/markdown.py | 784 -- .../python3.12/site-packages/rich/markup.py | 251 - .../python3.12/site-packages/rich/measure.py | 151 - .../python3.12/site-packages/rich/padding.py | 141 - .../python3.12/site-packages/rich/pager.py | 34 - .../python3.12/site-packages/rich/palette.py | 100 - .../python3.12/site-packages/rich/panel.py | 318 - .../python3.12/site-packages/rich/pretty.py | 1016 -- .../python3.12/site-packages/rich/progress.py | 1715 ---- .../site-packages/rich/progress_bar.py | 223 - .../python3.12/site-packages/rich/prompt.py | 400 - .../python3.12/site-packages/rich/protocol.py | 42 - .../python3.12/site-packages/rich/py.typed | 0 .../python3.12/site-packages/rich/region.py | 10 - .../lib/python3.12/site-packages/rich/repr.py | 149 - .../lib/python3.12/site-packages/rich/rule.py | 130 - .../python3.12/site-packages/rich/scope.py | 86 - .../python3.12/site-packages/rich/screen.py | 54 - .../python3.12/site-packages/rich/segment.py | 752 -- .../python3.12/site-packages/rich/spinner.py | 138 - .../python3.12/site-packages/rich/status.py | 131 - .../python3.12/site-packages/rich/style.py | 796 -- .../python3.12/site-packages/rich/styled.py | 42 - .../python3.12/site-packages/rich/syntax.py | 966 -- .../python3.12/site-packages/rich/table.py | 1007 -- .../site-packages/rich/terminal_theme.py | 153 - .../lib/python3.12/site-packages/rich/text.py | 1361 --- .../python3.12/site-packages/rich/theme.py | 115 - .../python3.12/site-packages/rich/themes.py | 5 - .../site-packages/rich/traceback.py | 797 -- .../lib/python3.12/site-packages/rich/tree.py | 257 - .../stack_data-0.6.3.dist-info/INSTALLER | 1 - .../stack_data-0.6.3.dist-info/LICENSE.txt | 21 - .../stack_data-0.6.3.dist-info/METADATA | 443 - .../stack_data-0.6.3.dist-info/RECORD | 19 - .../stack_data-0.6.3.dist-info/WHEEL | 5 - .../stack_data-0.6.3.dist-info/top_level.txt | 1 - .../site-packages/stack_data/__init__.py | 10 - .../__pycache__/__init__.cpython-312.pyc | Bin 729 -> 0 bytes .../__pycache__/core.cpython-312.pyc | Bin 44905 -> 0 bytes .../__pycache__/formatting.cpython-312.pyc | Bin 11478 -> 0 bytes .../__pycache__/serializing.cpython-312.pyc | Bin 9227 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 10307 -> 0 bytes .../__pycache__/version.cpython-312.pyc | Bin 203 -> 0 bytes .../site-packages/stack_data/core.py | 926 -- .../site-packages/stack_data/formatting.py | 234 - .../site-packages/stack_data/py.typed | 1 - .../site-packages/stack_data/serializing.py | 201 - .../site-packages/stack_data/utils.py | 185 - .../site-packages/stack_data/version.py | 1 - .../traitlets-5.14.3.dist-info/INSTALLER | 1 - .../traitlets-5.14.3.dist-info/METADATA | 282 - .../traitlets-5.14.3.dist-info/RECORD | 54 - .../traitlets-5.14.3.dist-info/WHEEL | 4 - .../licenses/LICENSE | 30 - .../site-packages/traitlets/__init__.py | 35 - .../__pycache__/__init__.cpython-312.pyc | Bin 1431 -> 0 bytes .../__pycache__/_version.cpython-312.pyc | Bin 864 -> 0 bytes .../traitlets/__pycache__/log.cpython-312.pyc | Bin 1198 -> 0 bytes .../__pycache__/traitlets.cpython-312.pyc | Bin 181573 -> 0 bytes .../site-packages/traitlets/_version.py | 19 - .../traitlets/config/__init__.py | 20 - .../__pycache__/__init__.cpython-312.pyc | Bin 519 -> 0 bytes .../__pycache__/application.cpython-312.pyc | Bin 49729 -> 0 bytes .../argcomplete_config.cpython-312.pyc | Bin 10273 -> 0 bytes .../__pycache__/configurable.cpython-312.pyc | Bin 25478 -> 0 bytes .../config/__pycache__/loader.cpython-312.pyc | Bin 51062 -> 0 bytes .../__pycache__/manager.cpython-312.pyc | Bin 3953 -> 0 bytes .../__pycache__/sphinxdoc.cpython-312.pyc | Bin 7245 -> 0 bytes .../traitlets/config/application.py | 1129 --- .../traitlets/config/argcomplete_config.py | 220 - .../traitlets/config/configurable.py | 600 -- .../site-packages/traitlets/config/loader.py | 1179 --- .../site-packages/traitlets/config/manager.py | 84 - .../traitlets/config/sphinxdoc.py | 164 - .../python3.12/site-packages/traitlets/log.py | 31 - .../site-packages/traitlets/py.typed | 0 .../site-packages/traitlets/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 0 bytes .../test_traitlets.cpython-312.pyc | Bin 3538 -> 0 bytes .../tests/__pycache__/utils.cpython-312.pyc | Bin 2173 -> 0 bytes .../traitlets/tests/test_traitlets.py | 59 - .../site-packages/traitlets/tests/utils.py | 42 - .../site-packages/traitlets/traitlets.py | 4312 --------- .../site-packages/traitlets/utils/__init__.py | 91 - .../__pycache__/__init__.cpython-312.pyc | Bin 3809 -> 0 bytes .../utils/__pycache__/bunch.cpython-312.pyc | Bin 1441 -> 0 bytes .../__pycache__/decorators.cpython-312.pyc | Bin 3266 -> 0 bytes .../__pycache__/descriptions.cpython-312.pyc | Bin 6490 -> 0 bytes .../__pycache__/getargspec.cpython-312.pyc | Bin 2442 -> 0 bytes .../__pycache__/importstring.cpython-312.pyc | Bin 1598 -> 0 bytes .../__pycache__/nested_update.cpython-312.pyc | Bin 1405 -> 0 bytes .../__pycache__/sentinel.cpython-312.pyc | Bin 1332 -> 0 bytes .../utils/__pycache__/text.cpython-312.pyc | Bin 1709 -> 0 bytes .../__pycache__/warnings.cpython-312.pyc | Bin 2788 -> 0 bytes .../site-packages/traitlets/utils/bunch.py | 29 - .../traitlets/utils/decorators.py | 86 - .../traitlets/utils/descriptions.py | 182 - .../traitlets/utils/getargspec.py | 51 - .../traitlets/utils/importstring.py | 41 - .../traitlets/utils/nested_update.py | 41 - .../site-packages/traitlets/utils/sentinel.py | 24 - .../site-packages/traitlets/utils/text.py | 40 - .../site-packages/traitlets/utils/warnings.py | 64 - .../INSTALLER | 1 - .../LICENSE | 279 - .../METADATA | 67 - .../typing_extensions-4.12.2.dist-info/RECORD | 7 - .../typing_extensions-4.12.2.dist-info/WHEEL | 4 - .../site-packages/typing_extensions.py | 3641 ------- .../uWSGI-2.0.28.dist-info/INSTALLER | 1 - .../uWSGI-2.0.28.dist-info/LICENSE | 355 - .../uWSGI-2.0.28.dist-info/METADATA | 33 - .../uWSGI-2.0.28.dist-info/RECORD | 10 - .../uWSGI-2.0.28.dist-info/REQUESTED | 0 .../uWSGI-2.0.28.dist-info/WHEEL | 5 - .../uWSGI-2.0.28.dist-info/top_level.txt | 1 - .../site-packages/uwsgidecorators.py | 419 - .../wcwidth-0.2.13.dist-info/INSTALLER | 1 - .../wcwidth-0.2.13.dist-info/LICENSE | 27 - .../wcwidth-0.2.13.dist-info/METADATA | 410 - .../wcwidth-0.2.13.dist-info/RECORD | 19 - .../wcwidth-0.2.13.dist-info/WHEEL | 6 - .../wcwidth-0.2.13.dist-info/top_level.txt | 1 - .../wcwidth-0.2.13.dist-info/zip-safe | 1 - .../site-packages/wcwidth/__init__.py | 29 - .../__pycache__/__init__.cpython-312.pyc | Bin 569 -> 0 bytes .../__pycache__/table_vs16.cpython-312.pyc | Bin 1767 -> 0 bytes .../__pycache__/table_wide.cpython-312.pyc | Bin 8293 -> 0 bytes .../__pycache__/table_zero.cpython-312.pyc | Bin 23348 -> 0 bytes .../unicode_versions.cpython-312.pyc | Bin 917 -> 0 bytes .../__pycache__/wcwidth.cpython-312.pyc | Bin 12045 -> 0 bytes .../site-packages/wcwidth/table_vs16.py | 125 - .../site-packages/wcwidth/table_wide.py | 1493 --- .../site-packages/wcwidth/table_zero.py | 4843 ---------- .../site-packages/wcwidth/unicode_versions.py | 38 - .../site-packages/wcwidth/wcwidth.py | 345 - .venv/pyvenv.cfg | 5 - .venv/share/man/man1/ipython.1 | 60 - __pycache__/lessons.cpython-312.pyc | Bin 799 -> 0 bytes __pycache__/read_stats.cpython-312.pyc | Bin 6326 -> 0 bytes __pycache__/stats.cpython-312.pyc | Bin 9519 -> 0 bytes read_stats2.py | 112 - 5375 files changed, 685841 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/inspectionProfiles/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/testpks.iml delete mode 100644 .idea/vcs.xml delete mode 100644 .read_stats.py.swp delete mode 100644 .venv/bin/Activate.ps1 delete mode 100644 .venv/bin/activate delete mode 100644 .venv/bin/activate.csh delete mode 100644 .venv/bin/activate.fish delete mode 100755 .venv/bin/ipython delete mode 100755 .venv/bin/ipython3 delete mode 100755 .venv/bin/markdown-it delete mode 100755 .venv/bin/pip delete mode 100755 .venv/bin/pip3 delete mode 100755 .venv/bin/pip3.12 delete mode 100755 .venv/bin/pygmentize delete mode 120000 .venv/bin/python delete mode 120000 .venv/bin/python3 delete mode 120000 .venv/bin/python3.12 delete mode 100755 .venv/bin/uwsgi delete mode 100644 .venv/lib/python3.12/site-packages/IPython/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/conftest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/consoleapp.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/display.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/__pycache__/paths.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/conftest.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/consoleapp.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/alias.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/application.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/async_helpers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/autocall.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/builtin_trap.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/compilerop.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/completer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/completerlib.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/crashhandler.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/debugger.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/display.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/display_functions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/display_trap.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/displayhook.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/displaypub.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/error.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/events.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/excolors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/extensions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/formatters.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/getipython.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/guarded_eval.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/history.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/historyapp.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/hooks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputsplitter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer2.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/interactiveshell.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/latex_symbols.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/logger.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/macro.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/magic.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/magic_arguments.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/oinspect.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/page.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/payload.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/payloadpage.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/prefilter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/profileapp.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/profiledir.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/prompts.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/pylabtools.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/release.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/shellapp.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/splitinput.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/ultratb.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/__pycache__/usage.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/alias.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/application.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/async_helpers.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/autocall.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/builtin_trap.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/compilerop.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/completer.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/completerlib.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/crashhandler.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/debugger.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/display.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/display_functions.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/display_trap.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/displayhook.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/displaypub.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/error.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/events.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/excolors.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/extensions.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/formatters.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/getipython.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/guarded_eval.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/history.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/historyapp.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/hooks.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/inputsplitter.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/inputtransformer.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/inputtransformer2.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/interactiveshell.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/latex_symbols.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/logger.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/macro.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magic.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magic_arguments.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/ast_mod.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/auto.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/basic.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/code.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/config.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/display.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/execution.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/extension.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/history.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/logging.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/namespace.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/osm.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/packaging.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/pylab.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/__pycache__/script.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/ast_mod.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/auto.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/basic.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/code.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/config.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/display.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/execution.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/extension.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/history.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/logging.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/namespace.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/osm.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/packaging.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/pylab.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/magics/script.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/oinspect.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/page.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/payload.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/payloadpage.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/prefilter.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/profile/README_STARTUP delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/profileapp.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/profiledir.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/prompts.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/pylabtools.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/release.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/shellapp.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/splitinput.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/2x2.jpg delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/2x2.png delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/bad_all.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/nonascii.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/nonascii2.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/print_argv.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/refbug.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/simpleerr.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/tclass.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_alias.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_application.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_async_helpers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_autocall.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_compilerop.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_completer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_completerlib.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_debugger.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_display.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_displayhook.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_events.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_exceptiongroup_tb.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_extension.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_formatters.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_guarded_eval.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_handlers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_history.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_hooks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_imports.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_inputsplitter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_inputtransformer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_inputtransformer2.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_inputtransformer2_line.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_interactiveshell.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_iplib.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_logger.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_magic.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_magic_arguments.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_magic_terminal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_oinspect.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_page.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_paths.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_prefilter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_profile.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_prompts.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_pylabtools.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_run.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_shellapp.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_splitinput.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/__pycache__/test_ultratb.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/bad_all.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/daft_extension/__pycache__/daft_extension.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/daft_extension/daft_extension.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/nonascii.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/nonascii2.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/print_argv.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/refbug.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/simpleerr.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/tclass.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_alias.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_application.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_async_helpers.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_autocall.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_compilerop.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_completer.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_completerlib.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_debugger.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_display.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_displayhook.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_events.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_exceptiongroup_tb.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_extension.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_formatters.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_guarded_eval.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_handlers.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_history.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_hooks.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_imports.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_inputsplitter.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2_line.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_interactiveshell.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_iplib.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_logger.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_magic.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_arguments.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_terminal.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_oinspect.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_page.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_paths.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_prefilter.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_profile.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_prompts.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_pylabtools.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_run.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_shellapp.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_splitinput.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/tests/test_ultratb.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/ultratb.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/core/usage.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/display.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/autoreload.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/storemagic.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/autoreload.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/storemagic.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_autoreload.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_storemagic.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/test_autoreload.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/extensions/tests/test_storemagic.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_for_kernel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_loaders.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/qt_for_kernel.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/qt_loaders.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/tests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/test_qt_loaders.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/external/tests/test_qt_loaders.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/backgroundjobs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/clipboard.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/deepreload.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/demo.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/display.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/editorhooks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/guisupport.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/latextools.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/lexers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/__pycache__/pretty.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/backgroundjobs.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/clipboard.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/deepreload.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/demo.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/display.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/editorhooks.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/guisupport.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/latextools.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/lexers.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/pretty.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_backgroundjobs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_clipboard.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_deepreload.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_display.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_editorhooks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_imports.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_latextools.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_lexers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_pretty.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_pygments.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test.wav delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_backgroundjobs.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_clipboard.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_deepreload.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_display.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_editorhooks.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_imports.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_latextools.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_lexers.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_pretty.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/lib/tests/test_pygments.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/paths.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__pycache__/custom_doctests.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__pycache__/ipython_console_highlighting.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/__pycache__/ipython_directive.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/custom_doctests.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/ipython_console_highlighting.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/sphinxext/ipython_directive.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/console.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/debugger.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/embed.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/interactiveshell.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/ipapp.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/magics.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/prompts.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/__pycache__/ptutils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/console.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/debugger.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/embed.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/interactiveshell.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/ipapp.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/magics.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/prompts.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/asyncio.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/glut.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/gtk.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/gtk3.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/gtk4.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/osx.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/pyglet.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/qt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/tk.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/__pycache__/wx.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/asyncio.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/glut.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/gtk.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/gtk3.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/gtk4.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/osx.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/pyglet.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/qt.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/tk.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/pt_inputhooks/wx.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/ptutils.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__pycache__/auto_match.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__pycache__/auto_suggest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/__pycache__/filters.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/auto_match.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/auto_suggest.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/shortcuts/filters.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_debug_magic.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_embed.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_help.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_interactivshell.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_pt_inputhooks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/__pycache__/test_shortcuts.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_debug_magic.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_embed.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_help.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_interactivshell.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_pt_inputhooks.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/terminal/tests/test_shortcuts.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/decorators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/globalipapp.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/ipunittest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/skipdoctest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/__pycache__/tools.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/decorators.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/globalipapp.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/ipunittest.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/README.txt delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/dtexample.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/ipdoctest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/pytest_ipdoctest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/setup.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/simple.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/simplevars.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/test_ipdoctest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/__pycache__/test_refs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/dtexample.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/ipdoctest.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/pytest_ipdoctest.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/setup.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/simple.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/simplevars.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_combo.txt delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_example.txt delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_exampleip.txt delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_ipdoctest.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/plugin/test_refs.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/skipdoctest.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__pycache__/test_decorators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__pycache__/test_ipunittest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/__pycache__/test_tools.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/test_decorators.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/test_ipunittest.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tests/test_tools.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/testing/tools.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/PyColorize.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/PyColorize.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_cli.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_common.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_emscripten.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_posix.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_win32.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_process_win32_controller.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/_sysinfo.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/capture.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/colorable.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/coloransi.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/contexts.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/daemonize.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/data.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/decorators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/dir2.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/docs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/encoding.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/eventful.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/frame.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/generics.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/importstring.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/io.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/ipstruct.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/jsonutil.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/localinterfaces.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/log.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/module_paths.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/openpy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/path.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/process.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/py3compat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/sentinel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/shimmodule.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/signatures.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/strdispatch.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/sysinfo.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/syspathcontext.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/tempdir.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/terminal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/text.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/timing.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/tokenutil.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/traitlets.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/tz.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/ulinecache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/__pycache__/wildcard.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_cli.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_common.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_emscripten.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_posix.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_win32.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_process_win32_controller.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/_sysinfo.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/capture.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/colorable.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/coloransi.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/contexts.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/daemonize.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/data.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/decorators.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/dir2.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/docs.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/encoding.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/eventful.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/frame.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/generics.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/importstring.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/io.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/ipstruct.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/jsonutil.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/localinterfaces.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/log.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/module_paths.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/openpy.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/path.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/process.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/py3compat.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/sentinel.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/shimmodule.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/signatures.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/strdispatch.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/sysinfo.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/syspathcontext.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tempdir.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/terminal.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_capture.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_decorators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_deprecated.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_dir2.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_imports.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_importstring.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_io.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_module_paths.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_openpy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_path.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_process.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_pycolorize.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_shimmodule.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_sysinfo.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_tempdir.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_text.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_tokenutil.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/__pycache__/test_wildcard.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_capture.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_decorators.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_deprecated.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_dir2.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_imports.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_importstring.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_io.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_module_paths.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_openpy.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_path.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_process.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_pycolorize.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_shimmodule.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_sysinfo.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_tempdir.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_text.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_tokenutil.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tests/test_wildcard.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/text.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/timing.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tokenutil.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/traitlets.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/tz.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/ulinecache.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/version.py delete mode 100644 .venv/lib/python3.12/site-packages/IPython/utils/wildcard.py delete mode 100644 .venv/lib/python3.12/site-packages/__pycache__/decorator.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/__pycache__/uwsgidecorators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types-0.7.0.dist-info/licenses/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types/__pycache__/test_cases.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/annotated_types/test_cases.py delete mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/asttokens-3.0.0.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/astroid_compat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/asttokens.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/line_numbers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/mark_tokens.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/util.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/astroid_compat.py delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/asttokens.py delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/line_numbers.py delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/mark_tokens.py delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/util.py delete mode 100644 .venv/lib/python3.12/site-packages/asttokens/version.py delete mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/pbr.json delete mode 100644 .venv/lib/python3.12/site-packages/decorator-5.1.1.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/decorator.py delete mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/executing-2.2.0.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/executing/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/_exceptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/_position_node_finder.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/_pytest_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/executing.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/executing/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/executing/_exceptions.py delete mode 100644 .venv/lib/python3.12/site-packages/executing/_position_node_finder.py delete mode 100644 .venv/lib/python3.12/site-packages/executing/_pytest_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/executing/executing.py delete mode 100644 .venv/lib/python3.12/site-packages/executing/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/executing/version.py delete mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/entry_points.txt delete mode 100644 .venv/lib/python3.12/site-packages/ipython-8.32.0.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/AUTHORS.txt delete mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/jedi-0.19.2.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/_compatibility.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/common.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/debug.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/file_io.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/parser_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/settings.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/_compatibility.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/classes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/completion.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/completion_cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/environment.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/errors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/exceptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/file_name.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/helpers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/interpreter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/keywords.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/project.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/replstartup.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/__pycache__/strings.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/classes.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/completion.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/completion_cache.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/environment.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/errors.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/exceptions.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/file_name.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/helpers.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/interpreter.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/keywords.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/project.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/refactoring/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/refactoring/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/refactoring/__pycache__/extract.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/refactoring/extract.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/replstartup.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/api/strings.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/cache.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/common.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/debug.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/file_io.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/analysis.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/arguments.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/base_value.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/context.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/docstring_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/docstrings.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/dynamic_params.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/filters.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/finder.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/flow_analysis.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/helpers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/imports.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/lazy_value.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/names.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/param.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/parser_cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/recursion.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/references.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/signature.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/star_args.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/syntax_tree.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/sys_path.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/analysis.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/arguments.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/base_value.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/cache.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/access.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/getattr_static.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/mixed.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/__pycache__/value.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/access.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/getattr_static.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/mixed.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/__pycache__/functions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/subprocess/functions.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/compiled/value.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/context.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/docstring_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/docstrings.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/dynamic_params.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/filters.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/finder.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/flow_analysis.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/annotation.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/conversion.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/generics.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/stub_value.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/type_var.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/typeshed.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/typing.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/annotation.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/base.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/conversion.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/generics.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/stub_value.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/type_var.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/typeshed.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/typing.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/gradual/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/helpers.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/imports.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/lazy_value.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/names.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/param.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/parser_cache.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/recursion.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/references.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/signature.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/star_args.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/syntax_tree.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/sys_path.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/decorator.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/dynamic_arrays.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/function.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/instance.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/iterable.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/klass.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/module.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/__pycache__/namespace.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/decorator.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/dynamic_arrays.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/function.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/instance.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/iterable.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/klass.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/module.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/inference/value/namespace.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/parser_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/django.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/flask.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/pytest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/registry.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/__pycache__/stdlib.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/django.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/flask.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/pytest.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/registry.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/plugins/stdlib.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/settings.py delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/LICENSE.txt delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/apps/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/apps/config.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/apps/registry.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/global_settings.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/locale/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/urls/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/urls/i18n.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/conf/urls/static.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/actions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/apps.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/checks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/decorators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/filters.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/forms.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/helpers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/options.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/sites.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/admin_list.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/admin_modify.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/admin_static.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/admin_urls.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/templatetags/log.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/tests.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/views/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/views/autocomplete.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/views/decorators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/views/main.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admin/widgets.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/middleware.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/urls.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/admindocs/views.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/admin.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/apps.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/backends.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/base_user.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/checks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/context_processors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/decorators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/forms.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/handlers/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/handlers/modwsgi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/hashers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/management/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/management/commands/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/management/commands/changepassword.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/management/commands/createsuperuser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/middleware.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/mixins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/password_validation.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/signals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/tokens.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/urls.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/validators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/auth/views.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/admin.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/apps.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/checks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/fields.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/forms.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/management/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/management/commands/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/management/commands/remove_stale_contenttypes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/contenttypes/views.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/forms.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/middleware.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/sitemaps.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/templatetags/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/templatetags/flatpages.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/urls.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/flatpages/views.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/gis/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/gis/db/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/gis/db/models/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/gis/db/models/fields.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/humanize/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/humanize/templatetags/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/humanize/templatetags/humanize.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/api.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/context_processors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/middleware.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/cookie.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/fallback.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/storage/session.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/messages/views.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/aggregates/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/aggregates/general.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/aggregates/mixins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/aggregates/statistics.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/constraints.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/array.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/citext.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/hstore.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/jsonb.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/mixins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/fields/ranges.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/functions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/indexes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/lookups.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/operations.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/search.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/signals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/postgres/validators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/redirects/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/redirects/middleware.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/redirects/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/cache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/cached_db.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/db.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/file.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/backends/signed_cookies.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/base_session.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/management/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/management/commands/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/management/commands/clearsessions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/middleware.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sessions/serializers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/management/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/management/commands/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/management/commands/ping_google.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sitemaps/views.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/apps.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/management.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/managers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/middleware.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/requests.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/sites/shortcuts.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/apps.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/checks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/finders.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/handlers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/commands/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/commands/collectstatic.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/commands/findstatic.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/management/commands/runserver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/storage.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/templatetags/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/templatetags/staticfiles.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/testing.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/urls.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/staticfiles/views.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/syndication/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/contrib/syndication/views.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/db.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/dummy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/filebased.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/locmem.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/backends/memcached.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/cache/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/caches.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/database.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/messages.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/model_checks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/registry.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/security/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/security/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/security/csrf.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/security/sessions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/templates.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/translation.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/checks/urls.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/images.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/locks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/move.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/storage.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/temp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/uploadedfile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/uploadhandler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/files/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/handlers/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/handlers/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/handlers/exception.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/handlers/wsgi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/console.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/dummy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/filebased.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/locmem.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/backends/smtp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/message.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/mail/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/color.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/dumpdata.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/loaddata.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/makemessages.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/runserver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/commands/testserver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/sql.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/templates.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/management/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/paginator.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/serializers/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/serializers/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/serializers/json.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/serializers/python.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/servers/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/servers/basehttp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/signals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/signing.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/validators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/core/wsgi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/creation.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/features.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/introspection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/operations.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/schema.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/base/validation.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/ddl_references.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/dummy/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/dummy/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/mysql/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/mysql/client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/creation.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/postgresql/operations.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/signals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/creation.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/features.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/introspection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/operations.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/sqlite3/schema.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/backends/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/autodetector.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/executor.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/graph.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/loader.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/migration.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/fields.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/special.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/operations/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/optimizer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/questioner.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/recorder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/serializer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/state.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/topological_sort.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/migrations/writer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/aggregates.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/constraints.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/deletion.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/enums.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/expressions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/files.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/mixins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/proxy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/related.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/related_descriptors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/related_lookups.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/fields/reverse_related.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/comparison.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/datetime.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/math.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/mixins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/text.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/functions/window.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/indexes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/lookups.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/manager.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/options.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/query.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/query_utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/signals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/compiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/datastructures.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/query.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/subqueries.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/sql/where.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/models/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/transaction.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/db/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/dispatch/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/dispatch/dispatcher.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/boundfield.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/fields.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/forms.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/formsets.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/renderers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/forms/widgets.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/cookie.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/multipartparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/request.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/http/response.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/cache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/clickjacking.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/common.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/csrf.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/gzip.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/http.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/locale.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/middleware/security.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/shortcuts.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/django.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/dummy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/jinja2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/backends/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/context.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/context_processors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/defaultfilters.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/defaulttags.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/engine.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/library.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loader.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loader_tags.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/app_directories.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/cached.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/filesystem.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/loaders/locmem.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/response.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/smartif.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/template/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/cache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/i18n.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/l10n.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/static.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/templatetags/tz.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/html.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/runner.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/selenium.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/signals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/testcases.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/test/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/conf.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/converters.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/resolvers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/urls/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/_os.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/archive.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/autoreload.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/baseconv.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/cache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/crypto.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/datastructures.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/dateformat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/dateparse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/dates.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/datetime_safe.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/deconstruct.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/decorators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/deprecation.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/duration.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/encoding.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/feedgenerator.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/formats.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/functional.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/hashable.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/html.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/http.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/inspect.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/ipv6.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/itercompat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/jslex.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/log.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/lorem_ipsum.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/module_loading.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/numberformat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/regex_helper.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/safestring.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/six.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/termcolors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/text.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/timesince.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/timezone.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/topological_sort.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/reloader.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/template.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/trans_null.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/translation/trans_real.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/tree.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/version.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/utils/xmlutils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/csrf.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/debug.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/cache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/clickjacking.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/csrf.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/debug.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/gzip.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/http.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/decorators/vary.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/defaults.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/dates.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/detail.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/edit.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/generic/list.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/i18n.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/django-stubs/django-stubs/views/static.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/BaseHTTPServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/CGIHTTPServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/ConfigParser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/Cookie.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/HTMLParser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/Queue.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/SimpleHTTPServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/SocketServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/StringIO.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/UserDict.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/UserList.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/UserString.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/__builtin__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_ast.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_collections.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_functools.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_hotshot.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_io.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_json.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_md5.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_sha.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_sha256.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_sha512.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_socket.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_sre.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_struct.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_symtable.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_threading_local.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/_winreg.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/abc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/ast.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/atexit.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/builtins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/cPickle.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/cStringIO.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/collections.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/commands.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/compileall.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/cookielib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/copy_reg.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/dircache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/archive_util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/bcppcompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/ccompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/cmd.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_dumb.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_msi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_packager.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_rpm.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/bdist_wininst.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build_clib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build_ext.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build_py.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/build_scripts.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/check.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/clean.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/config.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_data.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_egg_info.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_headers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_lib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/install_scripts.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/register.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/sdist.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/command/upload.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/config.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/core.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/cygwinccompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/debug.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/dep_util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/dir_util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/dist.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/emxccompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/errors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/extension.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/fancy_getopt.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/file_util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/filelist.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/log.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/msvccompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/spawn.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/sysconfig.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/text_file.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/unixccompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/distutils/version.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/dummy_thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/MIMEText.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/_parseaddr.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/base64mime.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/charset.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/encoders.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/feedparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/generator.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/header.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/iterators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/message.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/application.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/audio.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/image.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/message.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/multipart.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/nonmultipart.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/mime/text.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/quoprimime.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/email/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/encodings/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/encodings/utf_8.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/fcntl.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/fnmatch.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/functools.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/future_builtins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/gc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/getopt.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/getpass.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/gettext.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/glob.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/gzip.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/hashlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/heapq.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/htmlentitydefs.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/httplib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/imp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/importlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/inspect.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/io.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/itertools.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/json.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/markupbase.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/md5.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/mimetools.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/dummy/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/dummy/connection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/pool.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/process.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/multiprocessing/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/mutex.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/ntpath.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/nturl2path.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/os/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/os/path.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/os2emxpath.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/pipes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/platform.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/popen2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/posix.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/posixpath.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/random.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/re.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/repr.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/resource.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/rfc822.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/robotparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/runpy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sets.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sha.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/shelve.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/shlex.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/signal.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/smtplib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/spwd.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sre_constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sre_parse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/stat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/string.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/stringold.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/strop.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/subprocess.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/symbol.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/sys.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/tempfile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/textwrap.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/toaiff.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/tokenize.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/types.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/typing.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/unittest.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/urllib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/urllib2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/urlparse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/user.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/whichdb.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2/xmlrpclib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/__future__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_bisect.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_codecs.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_csv.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_curses.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_dummy_threading.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_heapq.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_msi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_random.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_typeshed/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_typeshed/wsgi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_typeshed/xml.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_warnings.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_weakref.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/_weakrefset.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/aifc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/antigravity.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/argparse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/array.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/asynchat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/asyncore.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/audioop.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/base64.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/bdb.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/binascii.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/binhex.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/bisect.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/bz2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cProfile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/calendar.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cgi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cgitb.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/chunk.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cmath.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/cmd.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/code.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/codecs.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/codeop.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/colorsys.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/contextlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/copy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/crypt.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/csv.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ctypes/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ctypes/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ctypes/wintypes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/curses/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/curses/ascii.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/curses/panel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/curses/textpad.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/datetime.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/decimal.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/difflib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/dis.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/doctest.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/dummy_threading.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ensurepip/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/errno.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/filecmp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/fileinput.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/formatter.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/fractions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ftplib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/genericpath.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/grp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/hmac.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/imaplib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/imghdr.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/keyword.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/driver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/grammar.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/literals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/parse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/pgen.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/token.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pgen2/tokenize.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pygram.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/lib2to3/pytree.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/linecache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/locale.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/logging/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/logging/config.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/logging/handlers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/macpath.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/mailbox.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/mailcap.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/marshal.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/math.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/mimetypes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/mmap.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/modulefinder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msilib/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msilib/schema.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msilib/sequence.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msilib/text.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/msvcrt.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/netrc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/nis.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/numbers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/opcode.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/operator.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/optparse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pdb.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pickle.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pickletools.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pkgutil.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/plistlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/poplib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pprint.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/profile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pstats.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pty.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pwd.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/py_compile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pyclbr.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pydoc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pydoc_data/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pydoc_data/topics.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pyexpat/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pyexpat/errors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/pyexpat/model.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/quopri.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/readline.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/rlcompleter.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sched.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/select.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/shutil.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/site.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/smtpd.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sndhdr.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/socket.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sqlite3/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sqlite3/dbapi2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sre_compile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/ssl.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/stringprep.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/struct.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sunau.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/symtable.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/sysconfig.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/syslog.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/tabnanny.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/tarfile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/telnetlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/termios.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/this.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/threading.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/time.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/timeit.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/token.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/trace.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/traceback.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/tty.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/turtle.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/unicodedata.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/uu.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/uuid.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/warnings.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wave.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/weakref.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/webbrowser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/winsound.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/handlers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/headers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/simple_server.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/types.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/wsgiref/validate.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xdrlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/NodeFilter.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/domreg.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/expatbuilder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/minicompat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/minidom.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/pulldom.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/dom/xmlbuilder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/ElementInclude.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/ElementPath.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/ElementTree.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/etree/cElementTree.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/parsers/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/parsers/expat/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/parsers/expat/errors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/parsers/expat/model.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/sax/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/sax/handler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/sax/saxutils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/xml/sax/xmlreader.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/zipfile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/zipimport.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/2and3/zlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.7/_py_abc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.7/contextvars.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.7/dataclasses.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.9/graphlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3.9/zoneinfo/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_ast.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_bootlocale.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_compat_pickle.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_compression.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_decimal.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_dummy_thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_imp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_importlib_modulespec.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_json.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_markupbase.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_operator.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_osx_support.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_posixsubprocess.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_pydecimal.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_sitebuiltins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_stat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_threading_local.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_tkinter.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_tracemalloc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/_winapi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/abc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/ast.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/base_events.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/base_futures.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/base_subprocess.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/base_tasks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/coroutines.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/events.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/format_helpers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/futures.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/locks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/log.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/proactor_events.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/protocols.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/queues.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/runners.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/selector_events.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/sslproto.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/staggered.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/streams.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/subprocess.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/tasks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/threads.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/transports.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/trsock.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/unix_events.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/windows_events.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/asyncio/windows_utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/atexit.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/builtins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/collections/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/collections/abc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/compileall.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/futures/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/futures/_base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/futures/process.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/concurrent/futures/thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/configparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/copyreg.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/dbm/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/dbm/dumb.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/dbm/gnu.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/dbm/ndbm.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/archive_util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/bcppcompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/ccompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/cmd.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_dumb.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_msi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_packager.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_rpm.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/bdist_wininst.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build_clib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build_ext.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build_py.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/build_scripts.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/check.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/clean.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/config.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_data.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_egg_info.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_headers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_lib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/install_scripts.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/register.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/sdist.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/command/upload.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/config.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/core.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/cygwinccompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/debug.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/dep_util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/dir_util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/dist.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/errors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/extension.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/fancy_getopt.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/file_util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/filelist.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/log.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/msvccompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/spawn.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/sysconfig.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/text_file.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/unixccompiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/distutils/version.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/charset.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/contentmanager.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/encoders.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/errors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/feedparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/generator.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/header.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/headerregistry.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/iterators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/message.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/application.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/audio.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/image.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/message.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/multipart.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/nonmultipart.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/mime/text.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/policy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/email/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/encodings/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/encodings/utf_8.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/enum.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/faulthandler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/fcntl.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/fnmatch.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/functools.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/gc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/getopt.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/getpass.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/gettext.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/glob.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/gzip.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/hashlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/heapq.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/html/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/html/entities.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/html/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/cookiejar.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/cookies.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/http/server.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/imp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/abc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/machinery.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/metadata.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/resources.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/importlib/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/inspect.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/io.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/ipaddress.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/itertools.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/json/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/json/decoder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/json/encoder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/json/tool.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/lzma.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/macurl2path.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/connection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/context.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/dummy/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/dummy/connection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/managers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/pool.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/process.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/queues.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/shared_memory.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/sharedctypes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/spawn.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/multiprocessing/synchronize.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/nntplib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/ntpath.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/nturl2path.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/os/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/os/path.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/pathlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/pipes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/platform.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/posix.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/posixpath.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/queue.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/random.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/re.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/reprlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/resource.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/runpy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/secrets.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/selectors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/shelve.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/shlex.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/signal.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/smtplib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/socketserver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/spwd.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/sre_constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/sre_parse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/stat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/statistics.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/string.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/subprocess.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/symbol.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/sys.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tempfile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/textwrap.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/commondialog.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/dialog.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/filedialog.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/font.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/messagebox.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tkinter/ttk.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tokenize.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/tracemalloc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/types.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/typing.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/async_case.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/case.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/loader.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/main.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/mock.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/result.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/runner.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/signals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/suite.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/unittest/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/error.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/parse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/request.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/response.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/urllib/robotparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/venv/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/winreg.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/xmlrpc/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/xmlrpc/client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/xmlrpc/server.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/xxlimited.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/stdlib/3/zipapp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/OpenSSL/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/OpenSSL/crypto.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/futures/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/futures/_base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/futures/process.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/concurrent/futures/thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/enum.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/fb303/FacebookService.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/fb303/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/ipaddress.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/recipe/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/kazoo/recipe/watchers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/pathlib2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/pymssql.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/routes/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/routes/mapper.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/routes/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/scribe/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/scribe/scribe.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/scribe/ttypes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/BaseHTTPServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/CGIHTTPServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/SimpleHTTPServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/_dummy_thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/_thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/cPickle.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/collections_abc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/configparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/email_mime_base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/email_mime_multipart.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/email_mime_nonmultipart.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/email_mime_text.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/html_entities.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/html_parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/http_client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/http_cookiejar.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/http_cookies.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/queue.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/reprlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/socketserver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/error.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/parse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/request.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/response.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib/robotparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_error.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_parse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_request.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_response.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/urllib_robotparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/six/moves/xmlrpc_client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/concurrent.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/gen.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/httpclient.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/httpserver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/httputil.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/ioloop.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/locks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/netutil.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/process.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/tcpserver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/testing.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2/tornado/web.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/atomicwrites/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/_version_info.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/converters.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/filters.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/attr/validators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/backports/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/backports/ssl_match_hostname.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/backports_abc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/callbacks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/linkifier.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/sanitizer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/bleach/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/auth.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/auth_handler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/connection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/ec2/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/elb/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/exception.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/kms/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/kms/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/kms/layer1.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/plugin.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/regioninfo.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/acl.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/bucket.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/bucketlistresultset.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/bucketlogging.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/connection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/cors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/deletemarker.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/key.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/keyfile.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/lifecycle.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/multidelete.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/multipart.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/prefix.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/tagging.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/user.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/s3/website.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/boto/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/abc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/cache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/decorators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/func.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/lfu.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/lru.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/rr.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cachetools/ttl.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/certifi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/characteristic/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/enums.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langbulgarianmodel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langcyrillicmodel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langgreekmodel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langhebrewmodel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langhungarianmodel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langthaimodel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/langturkishmodel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/universaldetector.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/chardet/version.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/_termui_impl.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/core.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/decorators.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/formatting.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/globals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/termui.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/testing.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/types.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/click/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/croniter.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/fernet.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/backends/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/backends/interfaces.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/bindings/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/bindings/openssl/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/bindings/openssl/binding.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/dh.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/dsa.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/ec.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/ed25519.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/ed448.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/padding.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/rsa.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/x25519.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/asymmetric/x448.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/ciphers/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/ciphers/aead.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/ciphers/algorithms.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/ciphers/modes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/cmac.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/constant_time.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/hashes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/hmac.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/concatkdf.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/hkdf.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/kbkdf.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/pbkdf2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/scrypt.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/kdf/x963kdf.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/keywrap.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/padding.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/poly1305.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/serialization/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/serialization/pkcs12.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/twofactor/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/twofactor/hotp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/hazmat/primitives/twofactor/totp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/x509/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/x509/extensions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/cryptography/x509/oid.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/datetimerange/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/_common.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/easter.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/relativedelta.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/rrule.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/tz/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/tz/_common.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/tz/tz.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/dateutil/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/decorator.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/deprecated/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/deprecated/classic.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/deprecated/sphinx.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/emoji/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/emoji/core.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/emoji/unicode_codes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/first.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/app.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/blueprints.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/cli.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/config.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/ctx.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/debughelpers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/globals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/helpers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/tag.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/logging.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/sessions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/signals.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/templating.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/testing.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/views.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/wrappers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/database.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/errors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/mixins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/geoip2/records.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/gflags.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/any_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/api_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/compiler/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/compiler/plugin_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/descriptor.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/descriptor_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/descriptor_pool.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/duration_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/empty_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/field_mask_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/containers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/decoder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/encoder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/enum_type_wrapper.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/extension_dict.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/message_listener.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/python_message.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/well_known_types.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/internal/wire_format.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/json_format.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/message.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/message_factory.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/reflection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/service.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/source_context_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/struct_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/symbol_database.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/timestamp_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/type_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/util/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/google/protobuf/wrappers_pb2.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/itsdangerous.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/_compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/_stringdefs.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/bccache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/compiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/debug.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/defaults.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/environment.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/ext.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/filters.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/lexer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/loaders.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/meta.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/nodes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/optimizer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/runtime.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/sandbox.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/tests.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/jinja2/visitor.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/__meta__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/blockparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/blockprocessors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/core.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/abbr.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/admonition.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/attr_list.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/codehilite.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/def_list.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/extra.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/fenced_code.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/footnotes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/legacy_attrs.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/legacy_em.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/md_in_html.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/meta.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/nl2br.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/sane_lists.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/smarty.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/tables.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/toc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/extensions/wikilinks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/inlinepatterns.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/pep562.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/postprocessors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/preprocessors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/serializers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/treeprocessors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markdown/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/_compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/_constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/_native.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/markupsafe/_speedups.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/const.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/decoder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/errors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/extension.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/maxminddb/reader.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/mock.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/mypy_extensions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/nmap/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/nmap/nmap.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/_version.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/_winapi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/agent.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/auth_handler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ber.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/buffered_pipe.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/channel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/common.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/compress.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/config.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/dsskey.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ecdsakey.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ed25519key.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/file.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/hostkeys.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_curve25519.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_ecdh_nist.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_gex.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_group1.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_group14.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_group16.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/kex_gss.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/message.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/packet.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/pipe.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/pkey.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/primes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/proxy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/py3compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/rsakey.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/server.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_attr.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_file.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_handle.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_server.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/sftp_si.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ssh_exception.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/ssh_gss.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/transport.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/paramiko/win_pageant.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/polib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/event.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/fault.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/option.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vim/view.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vmodl/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vmodl/fault.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyVmomi/vmodl/query.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pycurl.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/charset.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/connections.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/CLIENT.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/COMMAND.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/ER.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/FIELD_TYPE.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/FLAG.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/SERVER_STATUS.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/constants/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/converters.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/cursors.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/err.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/times.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pymysql/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/attributes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/connection/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/connection/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/connection/table.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/connection/util.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/indexes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/settings.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/throttle.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pynamodb/types.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pyre_extensions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/pytz/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/connection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/redis/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/adapters.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/api.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/auth.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/cookies.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/hooks.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/models.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/_collections.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/connection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/connectionpool.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/contrib/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/fields.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/filepost.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/packages/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/packages/ssl_match_hostname/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/poolmanager.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/request.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/response.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/connection.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/request.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/response.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/retry.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/ssl_.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/timeout.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/packages/urllib3/util/url.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/sessions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/status_codes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/structures.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/requests/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/retry/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/retry/api.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/simplejson/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/simplejson/decoder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/simplejson/encoder.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/simplejson/scanner.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/singledispatch.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/slugify/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/slugify/slugify.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/slugify/special.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/tabulate.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/termcolor.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/toml.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/typing_extensions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/tzlocal/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/ujson.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/_compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/_internal.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/_reloader.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/atom.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/cache.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/fixers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/iterio.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/jsrouting.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/limiter.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/lint.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/profiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/securecookie.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/sessions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/testtools.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/contrib/wrappers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/datastructures.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/debug/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/debug/console.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/debug/repr.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/debug/tbtools.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/exceptions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/filesystem.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/formparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/http.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/local.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/dispatcher.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/http_proxy.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/lint.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/profiler.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/proxy_fix.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/middleware/shared_data.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/posixemulation.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/routing.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/script.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/security.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/serving.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/test.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/testapp.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/urls.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/useragents.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/wrappers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/werkzeug/wsgi.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/composer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/constructor.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/cyaml.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/dumper.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/emitter.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/error.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/events.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/loader.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/nodes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/reader.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/representer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/resolver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/scanner.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/serializer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/2and3/yaml/tokens.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/os.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/threadpool/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/threadpool/binary.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/aiofiles/threadpool/text.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/contextvars.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/dataclasses.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/examples.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/nodes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/rst/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/rst/nodes.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/rst/roles.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/docutils/parsers/rst/states.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/filelock/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/freezegun/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/freezegun/api.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/frozendict.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/algorithms.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/contrib/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/contrib/algorithms/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/contrib/algorithms/py_ecdsa.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/jwt/contrib/algorithms/pycrypto.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/orjson.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pkg_resources/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pkg_resources/py31compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pyrfc3339/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pyrfc3339/generator.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pyrfc3339/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/pyrfc3339/utils.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/BaseHTTPServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/CGIHTTPServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/SimpleHTTPServer.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/_dummy_thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/_thread.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/builtins.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/cPickle.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/collections_abc.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/configparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/email_mime_base.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/email_mime_multipart.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/email_mime_nonmultipart.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/email_mime_text.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/html_entities.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/html_parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/http_client.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/http_cookiejar.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/http_cookies.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/queue.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/reprlib.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/socketserver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_commondialog.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_constants.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_dialog.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_filedialog.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_tkfiledialog.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/tkinter_ttk.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/error.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/parse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/request.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/response.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib/robotparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_error.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_parse.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_request.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_response.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/six/moves/urllib_robotparser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/typed_ast/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/typed_ast/ast27.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/typed_ast/ast3.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/typed_ast/conversions.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/__init__.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/adjustments.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/buffers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/channel.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/compat.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/parser.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/proxy_headers.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/receiver.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/rfc7230.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/runner.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/server.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/task.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/trigger.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/utilities.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/third_party/typeshed/third_party/3/waitress/wasyncore.pyi delete mode 100644 .venv/lib/python3.12/site-packages/jedi/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/_compat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/_punycode.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/main.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/parser_block.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/parser_core.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/parser_inline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/renderer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/ruler.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/token.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/tree.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/_compat.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/_punycode.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/cli/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/cli/__pycache__/parse.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/cli/parse.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/entities.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/html_blocks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/html_re.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/normalize_url.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/entities.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/html_blocks.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/html_re.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/normalize_url.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/common/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__pycache__/parse_link_destination.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__pycache__/parse_link_label.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/__pycache__/parse_link_title.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/parse_link_destination.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/parse_link_label.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/helpers/parse_link_title.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/main.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/parser_block.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/parser_core.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/parser_inline.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/port.yaml delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__pycache__/commonmark.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__pycache__/default.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/__pycache__/zero.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/commonmark.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/default.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/presets/zero.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/renderer.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/ruler.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/blockquote.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/code.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/fence.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/heading.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/hr.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/html_block.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/lheading.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/list.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/paragraph.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/reference.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/state_block.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/__pycache__/table.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/blockquote.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/code.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/fence.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/heading.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/hr.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/html_block.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/lheading.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/list.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/paragraph.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/reference.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/state_block.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_block/table.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/block.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/inline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/linkify.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/normalize.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/replacements.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/smartquotes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/state_core.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/__pycache__/text_join.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/block.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/inline.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/linkify.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/normalize.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/replacements.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/smartquotes.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/state_core.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_core/text_join.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/autolink.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/backticks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/balance_pairs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/emphasis.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/entity.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/escape.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/fragments_join.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/html_inline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/image.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/link.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/linkify.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/newline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/state_inline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/strikethrough.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/__pycache__/text.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/autolink.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/backticks.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/balance_pairs.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/emphasis.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/entity.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/escape.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/fragments_join.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/html_inline.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/image.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/link.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/linkify.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/newline.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/state_inline.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/strikethrough.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/rules_inline/text.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/token.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/tree.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/LICENSE.markdown-it delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/markdown_it_py-3.0.0.dist-info/entry_points.txt delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/entry_points.txt delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline-0.1.7.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/__pycache__/backend_inline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/__pycache__/config.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/backend_inline.py delete mode 100644 .venv/lib/python3.12/site-packages/matplotlib_inline/config.py delete mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_decode.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_encode.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_format.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_parse.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/__pycache__/_url.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/_decode.py delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/_encode.py delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/_format.py delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/_parse.py delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/_url.py delete mode 100644 .venv/lib/python3.12/site-packages/mdurl/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/AUTHORS.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/parso-0.8.4.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/_compatibility.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/file_io.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/grammar.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/normalizer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/parser.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/tree.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/_compatibility.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/cache.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/file_io.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/grammar.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/normalizer.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/parser.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/__pycache__/generator.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/__pycache__/grammar_parser.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/generator.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/pgen2/grammar_parser.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/diff.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/errors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/parser.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/pep8.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/prefix.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/token.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/tokenize.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/__pycache__/tree.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/diff.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/errors.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar310.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar311.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar312.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar313.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar36.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar37.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar38.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/grammar39.txt delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/parser.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/pep8.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/prefix.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/token.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/tokenize.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/python/tree.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/tree.py delete mode 100644 .venv/lib/python3.12/site-packages/parso/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/pexpect-4.9.0.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/ANSI.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/FSM.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/ANSI.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/FSM.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/_async.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/_async_pre_await.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/_async_w_await.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/exceptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/expect.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/fdpexpect.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/popen_spawn.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/pty_spawn.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/pxssh.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/replwrap.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/run.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/screen.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/socket_pexpect.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/spawnbase.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/_async.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/_async_pre_await.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/_async_w_await.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/bashrc.sh delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/exceptions.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/expect.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/fdpexpect.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/popen_spawn.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/pty_spawn.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/pxssh.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/replwrap.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/run.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/screen.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/socket_pexpect.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/spawnbase.py delete mode 100644 .venv/lib/python3.12/site-packages/pexpect/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/__pip-runner__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/build_env.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cache.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/main.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/check.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/download.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/help.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/index.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/install.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/list.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/search.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/show.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/configuration.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/exceptions.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/collector.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/index/sources.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/locations/base.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/main.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/index.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/link.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/auth.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/cache.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/download.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/session.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/check.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/pyproject.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/models.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/align.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/box.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/status.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/table.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/six.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 .venv/lib/python3.12/site-packages/pip/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/AUTHORS.rst delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit-3.0.50.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/auto_suggest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/buffer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/cache.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/cursor_shapes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/data_structures.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/document.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/enums.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/history.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/keys.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/log.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/mouse_events.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/patch_stdout.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/renderer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/search.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/selection.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/token.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/validation.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/__pycache__/win32_types.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/application.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/current.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/dummy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/__pycache__/run_in_terminal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/application.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/current.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/dummy.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/application/run_in_terminal.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/auto_suggest.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/buffer.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/cache.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__pycache__/in_memory.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/__pycache__/pyperclip.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/in_memory.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/clipboard/pyperclip.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/deduplicate.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/filesystem.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/fuzzy_completer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/nested.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/__pycache__/word_completer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/deduplicate.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/filesystem.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/fuzzy_completer.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/nested.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/completion/word_completer.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/completers/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/completers/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/completers/__pycache__/system.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/completers/system.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/compiler.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/completion.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/lexer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/regex_parser.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/__pycache__/validation.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/compiler.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/completion.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/lexer.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/regex_parser.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/regular_languages/validation.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/ssh/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/ssh/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/ssh/__pycache__/server.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/ssh/server.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__pycache__/log.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__pycache__/protocol.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/__pycache__/server.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/log.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/protocol.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/server.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/cursor_shapes.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/data_structures.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/document.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/enums.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/async_generator.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/inputhook.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/__pycache__/win32.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/async_generator.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/inputhook.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/eventloop/win32.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/app.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/cli.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/app.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/cli.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/filters/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/ansi.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/html.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/pygments.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/ansi.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/html.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/pygments.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/formatted_text/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/history.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/ansi_escape_sequences.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/defaults.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/posix_pipe.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/posix_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/typeahead.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/vt100.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/vt100_parser.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/win32.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/__pycache__/win32_pipe.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/ansi_escape_sequences.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/defaults.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/posix_pipe.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/posix_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/typeahead.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/vt100.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/vt100_parser.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/win32.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/input/win32_pipe.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/defaults.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/digraphs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/emacs_state.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/key_bindings.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/key_processor.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/__pycache__/vi_state.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/auto_suggest.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/basic.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/completion.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/cpr.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/emacs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/focus.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/mouse.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/named_commands.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/open_in_editor.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/page_navigation.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/scroll.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/search.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/__pycache__/vi.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/auto_suggest.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/basic.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/completion.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/cpr.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/emacs.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/focus.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/mouse.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/named_commands.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/open_in_editor.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/page_navigation.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/scroll.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/search.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/bindings/vi.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/defaults.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/digraphs.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/emacs_state.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/key_bindings.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/key_processor.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/key_binding/vi_state.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/keys.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/containers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/controls.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/dimension.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/dummy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/layout.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/margins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/menus.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/mouse_handlers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/processors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/screen.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/scrollable_pane.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/containers.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/controls.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/dimension.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/dummy.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/layout.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/margins.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/menus.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/mouse_handlers.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/processors.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/screen.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/scrollable_pane.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/layout/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/__pycache__/pygments.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/lexers/pygments.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/log.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/mouse_events.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/color_depth.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/conemu.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/defaults.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/flush_stdout.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/plain_text.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/vt100.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/win32.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/__pycache__/windows10.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/color_depth.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/conemu.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/defaults.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/flush_stdout.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/plain_text.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/vt100.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/win32.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/output/windows10.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/patch_stdout.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/renderer.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/search.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/selection.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__pycache__/dialogs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__pycache__/prompt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/dialogs.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/__pycache__/formatters.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/progress_bar/formatters.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/prompt.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/shortcuts/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/defaults.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/named_colors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/pygments.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/style.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/__pycache__/style_transformation.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/defaults.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/named_colors.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/pygments.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/style.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/styles/style_transformation.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/token.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/validation.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/base.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/dialogs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/menus.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/__pycache__/toolbars.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/base.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/dialogs.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/menus.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/widgets/toolbars.py delete mode 100644 .venv/lib/python3.12/site-packages/prompt_toolkit/win32_types.py delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess-0.7.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__pycache__/_fork_pty.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__pycache__/ptyprocess.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/__pycache__/util.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/_fork_pty.py delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/ptyprocess.py delete mode 100644 .venv/lib/python3.12/site-packages/ptyprocess/util.py delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval-0.2.3.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/core.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/my_getattr_static.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/core.py delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/my_getattr_static.py delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pure_eval/version.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/REQUESTED delete mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/pydantic-2.10.6.dist-info/licenses/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/_migration.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/alias_generators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/aliases.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/annotated_handlers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/class_validators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/color.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/config.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/dataclasses.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/datetime_parse.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/decorator.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/env_settings.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/error_wrappers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/errors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/fields.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_serializers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/functional_validators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/generics.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/json.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/json_schema.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/main.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/mypy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/networks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/parse.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/root_model.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/schema.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/tools.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/type_adapter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/types.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/typing.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/validate_call_decorator.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/validators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/__pycache__/warnings.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_config.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_metadata.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_core_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_dataclasses.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_decorators_v1.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_discriminated_union.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_docs_extraction.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_fields.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_forward_ref.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generate_schema.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_generics.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_git.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_import_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_internal_dataclass.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_known_annotated_metadata.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_mock_val_ser.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_model_construction.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_namespace_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_repr.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_schema_generation_shared.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_serializers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_signature.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_std_types_schema.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_typing_extra.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validate_call.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/__pycache__/_validators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_config.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_core_metadata.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_core_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_dataclasses.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_decorators.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_decorators_v1.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_discriminated_union.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_docs_extraction.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_fields.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_forward_ref.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_generate_schema.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_generics.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_git.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_import_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_internal_dataclass.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_known_annotated_metadata.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_mock_val_ser.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_model_construction.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_namespace_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_repr.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_schema_generation_shared.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_serializers.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_signature.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_std_types_schema.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_typing_extra.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_validate_call.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_internal/_validators.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/_migration.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/alias_generators.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/aliases.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/annotated_handlers.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/class_validators.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/color.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/config.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/dataclasses.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/datetime_parse.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/decorator.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/class_validators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/config.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/copy_internals.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/decorator.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/json.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/parse.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/__pycache__/tools.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/class_validators.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/config.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/copy_internals.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/decorator.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/json.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/parse.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/deprecated/tools.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/env_settings.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/error_wrappers.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/errors.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/experimental/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/experimental/__pycache__/pipeline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/experimental/pipeline.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/fields.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/functional_serializers.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/functional_validators.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/generics.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/json.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/json_schema.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/main.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/mypy.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/networks.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/parse.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_loader.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/__pycache__/_schema_validator.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/_loader.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/plugin/_schema_validator.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/root_model.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/schema.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/tools.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/type_adapter.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/types.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/typing.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/_hypothesis_plugin.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/annotated_types.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/class_validators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/color.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/config.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/dataclasses.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/datetime_parse.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/decorator.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/env_settings.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/error_wrappers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/errors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/fields.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/generics.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/json.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/main.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/mypy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/networks.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/parse.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/schema.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/tools.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/types.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/typing.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/validators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/_hypothesis_plugin.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/annotated_types.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/class_validators.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/color.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/config.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/dataclasses.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/datetime_parse.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/decorator.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/env_settings.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/error_wrappers.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/errors.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/fields.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/generics.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/json.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/main.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/mypy.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/networks.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/parse.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/schema.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/tools.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/types.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/typing.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/validators.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/v1/version.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/validate_call_decorator.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/validators.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/version.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic/warnings.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core-2.27.2.dist-info/licenses/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/__pycache__/core_schema.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/_pydantic_core.pyi delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/core_schema.py delete mode 100644 .venv/lib/python3.12/site-packages/pydantic_core/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/entry_points.txt delete mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/licenses/AUTHORS delete mode 100644 .venv/lib/python3.12/site-packages/pygments-2.19.1.dist-info/licenses/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/cmdline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/console.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/filter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/formatter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/lexer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/modeline.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/plugin.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/regexopt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/scanner.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/sphinxext.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/style.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/token.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/unistring.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/__pycache__/util.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/cmdline.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/console.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/filter.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/filters/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/filters/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatter.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/_mapping.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/bbcode.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/groff.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/html.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/img.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/irc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/latex.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/other.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/rtf.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/svg.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/terminal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/__pycache__/terminal256.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/_mapping.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/bbcode.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/groff.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/html.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/img.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/irc.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/latex.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/other.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/pangomarkup.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/rtf.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/svg.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/terminal.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/formatters/terminal256.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexer.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_ada_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_asy_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_cl_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_cocoa_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_csound_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_css_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_googlesql_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_julia_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lasso_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lilypond_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_lua_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_luau_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mapping.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mql_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_mysql_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_openedge_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_php_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_postgres_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_qlik_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_scheme_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_scilab_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_sourcemod_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_stan_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_stata_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_tsql_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_usd_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_vbscript_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/_vim_builtins.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/actionscript.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ada.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/agile.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/algebra.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ambient.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/amdgpu.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ampl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/apdlexer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/apl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/archetype.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/arrow.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/arturo.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/asc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/asm.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/asn1.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/automation.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/bare.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/basic.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/bdd.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/berry.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/bibtex.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/blueprint.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/boa.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/bqn.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/business.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/c_cpp.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/c_like.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/capnproto.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/carbon.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/cddl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/chapel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/clean.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/codeql.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/comal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/compiled.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/configs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/console.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/cplint.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/crystal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/csound.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/css.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/d.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dalvik.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/data.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dax.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/devicetree.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/diff.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dns.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dotnet.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dsls.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/dylan.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ecl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/eiffel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/elm.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/elpi.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/email.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/erlang.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/esoteric.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ezhil.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/factor.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/fantom.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/felix.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/fift.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/floscript.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/forth.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/fortran.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/foxpro.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/freefem.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/func.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/functional.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/futhark.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/gcodelexer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/gdscript.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/gleam.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/go.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/grammar_notation.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/graph.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/graphics.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/graphql.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/graphviz.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/gsql.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/hare.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/haskell.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/haxe.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/hdl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/hexdump.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/html.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/idl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/igor.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/inferno.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/installers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/int_fiction.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/iolang.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/j.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/javascript.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jmespath.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jslt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/json5.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jsonnet.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jsx.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/julia.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/jvm.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/kuin.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/kusto.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ldap.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/lean.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/lilypond.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/lisp.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/macaulay2.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/make.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/maple.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/markup.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/math.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/matlab.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/maxima.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/meson.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/mime.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/minecraft.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/mips.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ml.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/modeling.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/modula2.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/mojo.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/monte.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/mosel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ncl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/nimrod.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/nit.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/nix.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/numbair.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/oberon.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/objective.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ooc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/openscad.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/other.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/parasail.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/parsers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pascal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pawn.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pddl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/perl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/phix.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/php.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pointless.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/pony.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/praat.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/procfile.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/prolog.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/promql.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/prql.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ptx.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/python.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/q.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/qlik.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/qvt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/r.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rdf.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rebol.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rego.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/resource.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ride.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rita.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rnc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/roboconf.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/robotframework.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ruby.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/rust.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sas.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/savi.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/scdoc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/scripting.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sgf.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/shell.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sieve.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/slash.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/smalltalk.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/smithy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/smv.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/snobol.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/solidity.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/soong.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sophia.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/special.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/spice.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/sql.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/srcinfo.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/stata.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/supercollider.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tablegen.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tact.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tcl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/teal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/templates.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/teraterm.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/testing.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/text.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/textedit.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/textfmts.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/theorem.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/thingsdb.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tlb.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tls.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/tnt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/trafficscript.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/typoscript.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/typst.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/ul4.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/unicon.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/urbi.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/usd.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/varnish.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/verification.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/verifpal.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/vip.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/vyper.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/web.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/webassembly.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/webidl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/webmisc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/wgsl.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/whiley.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/wowtoc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/wren.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/x10.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/xorg.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/yang.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/yara.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/__pycache__/zig.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_ada_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_asy_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_cl_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_cocoa_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_csound_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_css_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_googlesql_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_julia_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_lasso_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_lilypond_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_lua_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_luau_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_mapping.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_mql_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_mysql_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_openedge_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_php_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_postgres_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_qlik_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_scheme_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_sourcemod_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_stan_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_stata_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_tsql_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_usd_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_vbscript_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/_vim_builtins.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/actionscript.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ada.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/agile.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/algebra.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ambient.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/amdgpu.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ampl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/apdlexer.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/apl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/archetype.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/arrow.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/arturo.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/asc.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/asm.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/asn1.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/automation.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/bare.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/basic.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/bdd.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/berry.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/bibtex.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/blueprint.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/boa.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/bqn.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/business.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/c_cpp.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/c_like.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/capnproto.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/carbon.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/cddl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/chapel.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/clean.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/codeql.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/comal.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/compiled.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/configs.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/console.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/cplint.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/crystal.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/csound.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/css.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/d.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dalvik.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/data.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dax.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/devicetree.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/diff.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dns.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dotnet.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dsls.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/dylan.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ecl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/eiffel.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/elm.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/elpi.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/email.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/erlang.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/esoteric.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ezhil.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/factor.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/fantom.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/felix.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/fift.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/floscript.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/forth.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/fortran.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/foxpro.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/freefem.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/func.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/functional.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/futhark.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/gcodelexer.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/gdscript.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/gleam.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/go.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/grammar_notation.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/graph.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/graphics.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/graphql.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/graphviz.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/gsql.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/hare.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/haskell.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/haxe.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/hdl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/hexdump.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/html.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/idl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/igor.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/inferno.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/installers.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/int_fiction.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/iolang.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/j.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/javascript.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jmespath.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jslt.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/json5.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jsonnet.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jsx.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/julia.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/jvm.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/kuin.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/kusto.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ldap.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/lean.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/lilypond.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/lisp.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/macaulay2.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/make.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/maple.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/markup.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/math.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/matlab.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/maxima.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/meson.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/mime.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/minecraft.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/mips.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ml.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/modeling.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/modula2.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/mojo.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/monte.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/mosel.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ncl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/nimrod.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/nit.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/nix.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/numbair.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/oberon.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/objective.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ooc.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/openscad.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/other.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/parasail.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/parsers.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pascal.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pawn.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pddl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/perl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/phix.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/php.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pointless.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/pony.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/praat.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/procfile.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/prolog.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/promql.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/prql.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ptx.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/python.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/q.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/qlik.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/qvt.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/r.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rdf.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rebol.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rego.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/resource.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ride.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rita.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rnc.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/roboconf.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/robotframework.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ruby.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/rust.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sas.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/savi.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/scdoc.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/scripting.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sgf.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/shell.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sieve.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/slash.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/smalltalk.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/smithy.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/smv.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/snobol.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/solidity.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/soong.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sophia.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/special.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/spice.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/sql.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/srcinfo.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/stata.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/supercollider.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tablegen.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tact.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tal.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tcl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/teal.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/templates.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/teraterm.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/testing.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/text.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/textedit.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/textfmts.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/theorem.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/thingsdb.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tlb.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tls.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/tnt.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/trafficscript.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/typoscript.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/typst.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/ul4.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/unicon.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/urbi.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/usd.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/varnish.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/verification.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/verifpal.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/vip.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/vyper.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/web.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/webassembly.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/webidl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/webmisc.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/wgsl.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/whiley.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/wowtoc.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/wren.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/x10.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/xorg.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/yang.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/yara.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/lexers/zig.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/modeline.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/plugin.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/regexopt.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/scanner.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/sphinxext.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/style.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/_mapping.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/abap.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/algol.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/algol_nu.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/arduino.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/autumn.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/borland.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/bw.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/coffee.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/colorful.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/default.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/dracula.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/emacs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/friendly.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/friendly_grayscale.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/fruity.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/gh_dark.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/gruvbox.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/igor.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/inkpot.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/lightbulb.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/lilypond.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/lovelace.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/manni.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/material.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/monokai.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/murphy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/native.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/nord.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/onedark.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/paraiso_dark.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/paraiso_light.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/pastie.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/perldoc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/rainbow_dash.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/rrt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/sas.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/solarized.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/staroffice.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/stata_dark.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/stata_light.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/tango.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/trac.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/vim.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/vs.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/xcode.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/__pycache__/zenburn.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/_mapping.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/abap.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/algol.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/algol_nu.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/arduino.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/autumn.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/borland.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/bw.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/coffee.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/colorful.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/default.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/dracula.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/emacs.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/friendly.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/friendly_grayscale.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/fruity.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/gh_dark.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/gruvbox.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/igor.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/inkpot.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/lightbulb.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/lilypond.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/lovelace.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/manni.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/material.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/monokai.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/murphy.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/native.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/nord.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/onedark.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/paraiso_dark.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/paraiso_light.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/pastie.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/perldoc.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/rainbow_dash.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/rrt.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/sas.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/solarized.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/staroffice.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/stata_dark.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/stata_light.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/tango.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/trac.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/vim.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/vs.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/xcode.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/styles/zenburn.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/token.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/unistring.py delete mode 100644 .venv/lib/python3.12/site-packages/pygments/util.py delete mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/REQUESTED delete mode 100644 .venv/lib/python3.12/site-packages/rich-13.9.4.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/rich/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/__main__.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/__main__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_cell_widths.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_emoji_codes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_emoji_replace.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_export_format.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_extension.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_fileno.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_inspect.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_log_render.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_loop.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_null_file.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_palettes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_pick.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_ratio.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_spinners.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_stack.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_timer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_win32_console.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_windows.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_windows_renderer.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/_wrap.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/abc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/align.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/ansi.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/bar.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/box.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/cells.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/color.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/color_triplet.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/columns.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/console.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/constrain.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/containers.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/control.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/default_styles.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/diagnose.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/emoji.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/errors.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/file_proxy.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/filesize.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/highlighter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/json.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/jupyter.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/layout.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/live.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/live_render.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/logging.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/markdown.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/markup.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/measure.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/padding.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/pager.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/palette.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/panel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/pretty.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/progress.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/progress_bar.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/prompt.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/protocol.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/region.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/repr.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/rule.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/scope.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/screen.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/segment.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/spinner.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/status.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/style.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/styled.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/syntax.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/table.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/terminal_theme.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/text.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/theme.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/themes.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/traceback.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/__pycache__/tree.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/rich/_cell_widths.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_emoji_codes.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_emoji_replace.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_export_format.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_extension.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_fileno.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_inspect.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_log_render.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_loop.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_null_file.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_palettes.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_pick.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_ratio.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_spinners.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_stack.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_timer.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_win32_console.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_windows.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_windows_renderer.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/_wrap.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/abc.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/align.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/ansi.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/bar.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/box.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/cells.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/color.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/color_triplet.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/columns.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/console.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/constrain.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/containers.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/control.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/default_styles.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/diagnose.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/emoji.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/errors.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/file_proxy.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/filesize.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/highlighter.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/json.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/jupyter.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/layout.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/live.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/live_render.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/logging.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/markdown.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/markup.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/measure.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/padding.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/pager.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/palette.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/panel.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/pretty.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/progress.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/progress_bar.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/prompt.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/protocol.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/rich/region.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/repr.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/rule.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/scope.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/screen.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/segment.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/spinner.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/status.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/style.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/styled.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/syntax.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/table.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/terminal_theme.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/text.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/theme.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/themes.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/traceback.py delete mode 100644 .venv/lib/python3.12/site-packages/rich/tree.py delete mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/stack_data-0.6.3.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/core.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/formatting.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/serializing.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/__pycache__/version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/core.py delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/formatting.py delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/serializing.py delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/stack_data/version.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/traitlets-5.14.3.dist-info/licenses/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/__pycache__/_version.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/__pycache__/log.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/__pycache__/traitlets.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/_version.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/application.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/argcomplete_config.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/configurable.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/loader.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/manager.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/__pycache__/sphinxdoc.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/application.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/argcomplete_config.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/configurable.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/loader.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/manager.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/config/sphinxdoc.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/log.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/py.typed delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/__pycache__/test_traitlets.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/__pycache__/utils.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/test_traitlets.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/tests/utils.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/traitlets.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/bunch.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/decorators.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/descriptions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/getargspec.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/importstring.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/nested_update.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/sentinel.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/text.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/__pycache__/warnings.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/bunch.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/decorators.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/descriptions.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/getargspec.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/importstring.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/nested_update.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/sentinel.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/text.py delete mode 100644 .venv/lib/python3.12/site-packages/traitlets/utils/warnings.py delete mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/typing_extensions-4.12.2.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/typing_extensions.py delete mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/REQUESTED delete mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/uWSGI-2.0.28.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/uwsgidecorators.py delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/LICENSE delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/METADATA delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/RECORD delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/WHEEL delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth-0.2.13.dist-info/zip-safe delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__init__.py delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/__init__.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/table_vs16.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/table_wide.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/table_zero.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/unicode_versions.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/__pycache__/wcwidth.cpython-312.pyc delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/table_vs16.py delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/table_wide.py delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/table_zero.py delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/unicode_versions.py delete mode 100644 .venv/lib/python3.12/site-packages/wcwidth/wcwidth.py delete mode 100644 .venv/pyvenv.cfg delete mode 100644 .venv/share/man/man1/ipython.1 delete mode 100644 __pycache__/lessons.cpython-312.pyc delete mode 100644 __pycache__/read_stats.cpython-312.pyc delete mode 100644 __pycache__/stats.cpython-312.pyc delete mode 100644 read_stats2.py diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index d460eee..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index af20f60..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/testpks.iml b/.idea/testpks.iml deleted file mode 100644 index 5c0fbc8..0000000 --- a/.idea/testpks.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.read_stats.py.swp b/.read_stats.py.swp deleted file mode 100644 index d016989bd6ed239c4a95bcd88d361c209211161b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2J8T?97{}MV0t5(3IvOVD!s}qK?Sw~iaN?C18Hj^ohgW1)75OqHUTGM zu`;2B(%oe>Aq9^^rMXr?cWr0yszvweF{{p)a* zW2Hc)K&3#XK&3#XK&3#XK&3#Xz{RJ4?hbj+Ani+B>QB1Qp-rFew)&_Ps1&Fas1&Fa zs1&Fas1&Fas1&Fas1&Fas1&#e72x;>{|)%#|MyFgJpTV*{QdvK9?$z0d<8xN?|`?# z%itx@0;j=UU>NKJd%;iFdEWcrP4FCe0@T4c`1@MV`xv|mx*!J`=ztW=gFWE0Ydr5$ z@HTiEJO%Cp)1VG^fp2zu-q+w$@E&*?aBv)qgFWD{t3B^?@Bw%OoCS}8Tfr6Jm#aMQ z3-Ahf7A%3Ipbo~tZt(q;p7$Ym6TAUl0FQ&)!2xgy7y=&nZWr1E&wv@Q4}5tA+5oSE z1uy}Iz$ce`-do^BFc0YEAirvpNx8RGt8Q~WC=?$Ci9*a(!HD$hH(<|%6!#tCL)c;n9|Z;;b~8d z7GWt%S7|CPAYsy#TG%$(bERrs$c?VyP3hILJQfFQW2{+Q&w`A1MB{ADrf3~D_s2Ml zC`P8+x>4UU>X7O!2GoMGYMTtK#AuHym&MwK1~-aVQ&|#j>dthw)U?faM=J)$N+K)hbpm@s=qfA9I>FNYCt8PbXpg@$Ty-w!W z9?9jhkkCBJdznVNY^kSo(p+oQWYTI=iPCGSXw=MWY;O3r#+fU%Ht^~2mdG^!kG*E? z^w=)ZXpLt`A@Znlsm;@v7Yi-vbaSa$(v25yH@^cVbf_hd$i&K4 zUhD8bX_o#Ry_V-6IAC7SvklnUS1K@H;URk%IWksp!)gq6U15BC@*P%EQ z`EJu7OWcaCW=ks1g8S!A%pMgH*4Hs9b2(UJWGIF1$;=w2IggcJZcxiLYc5hH299p~ zBW1VA!L@(Pq=9KW@TEq(Tq%#f6xVQXRke~J&0Bu6MluP_?qcgC@mUPNW_*PwDGhdM z*MW{A5K?A2+uva3OK@yvcK)PG*-9{T!t|PP#kTa|!rF3unNCtMo9k(;u6X;9BiLLs z5z$hGw#}Xr@ra!wE(}fwSAWu0pDPyWqJk*RRWZA%1RXBzkW{jy*i8)Bp zXouWp^GtZusF{@J+i?GkOR{E;sk82)HO{j2e(QA8&Xw-(v;8J1xiLm{h~LYSGiFhr zYkfm#tkl}zlyvK6Qz+Mmme3TG*0|f8C~s;FQMhcG3d3^D8c&c3w`gI1CZ$)^Nz>Z>#<3(rp!BReN&H$qZ{LH)>fMOr#Eb1fjE;W zY>A_EWR&*0AW@-B)E`|yHk9Gk4G~!uPati z;HWxF(e!DzF_&r zj4Q{YToIwdo^8(2^Q9H7#&voiGtR99H|Oa`?*eSP7htm@BxN{gyo0Sf4Y8`4NvkX* zwi1*a#q%mHHGH@eGD@+(ZaCZe+TX*KI8NbcF1Z7 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -For more information on Execution Policies: -https://go.microsoft.com/fwlink/?LinkID=135170 - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove VIRTUAL_ENV_PROMPT altogether. - if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { - Remove-Item -Path env:VIRTUAL_ENV_PROMPT - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0, 1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} -else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} -else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } - $env:VIRTUAL_ENV_PROMPT = $Prompt -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/.venv/bin/activate b/.venv/bin/activate deleted file mode 100644 index 285e663..0000000 --- a/.venv/bin/activate +++ /dev/null @@ -1,70 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# You cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # Call hash to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - hash -r 2> /dev/null - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - unset VIRTUAL_ENV_PROMPT - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -# on Windows, a path can contain colons and backslashes and has to be converted: -if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then - # transform D:\path\to\venv to /d/path/to/venv on MSYS - # and to /cygdrive/d/path/to/venv on Cygwin - export VIRTUAL_ENV=$(cygpath /home/jvved/dev/testpks/.venv) -else - # use the path as-is - export VIRTUAL_ENV=/home/jvved/dev/testpks/.venv -fi - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/"bin":$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - PS1='(.venv) '"${PS1:-}" - export PS1 - VIRTUAL_ENV_PROMPT='(.venv) ' - export VIRTUAL_ENV_PROMPT -fi - -# Call hash to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -hash -r 2> /dev/null diff --git a/.venv/bin/activate.csh b/.venv/bin/activate.csh deleted file mode 100644 index aed6eca..0000000 --- a/.venv/bin/activate.csh +++ /dev/null @@ -1,27 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. - -# Created by Davide Di Blasi . -# Ported to Python 3.3 venv by Andrew Svetlov - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV /home/jvved/dev/testpks/.venv - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/"bin":$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = '(.venv) '"$prompt" - setenv VIRTUAL_ENV_PROMPT '(.venv) ' -endif - -alias pydoc python -m pydoc - -rehash diff --git a/.venv/bin/activate.fish b/.venv/bin/activate.fish deleted file mode 100644 index 5666715..0000000 --- a/.venv/bin/activate.fish +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/). You cannot run it directly. - -function deactivate -d "Exit virtual environment and return to normal shell environment" - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - set -e _OLD_FISH_PROMPT_OVERRIDE - # prevents error when using nested fish instances (Issue #93858) - if functions -q _old_fish_prompt - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - end - - set -e VIRTUAL_ENV - set -e VIRTUAL_ENV_PROMPT - if test "$argv[1]" != "nondestructive" - # Self-destruct! - functions -e deactivate - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV /home/jvved/dev/testpks/.venv - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/"bin $PATH - -# Unset PYTHONHOME if set. -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # fish uses a function instead of an env var to generate the prompt. - - # Save the current fish_prompt function as the function _old_fish_prompt. - functions -c fish_prompt _old_fish_prompt - - # With the original prompt function renamed, we can override with our own. - function fish_prompt - # Save the return status of the last command. - set -l old_status $status - - # Output the venv prompt; color taken from the blue of the Python logo. - printf "%s%s%s" (set_color 4B8BBE) '(.venv) ' (set_color normal) - - # Restore the return status of the previous command. - echo "exit $old_status" | . - # Output the original/"old" prompt. - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT '(.venv) ' -end diff --git a/.venv/bin/ipython b/.venv/bin/ipython deleted file mode 100755 index 0f53eb3..0000000 --- a/.venv/bin/ipython +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/jvved/dev/testpks/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from IPython import start_ipython -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(start_ipython()) diff --git a/.venv/bin/ipython3 b/.venv/bin/ipython3 deleted file mode 100755 index 0f53eb3..0000000 --- a/.venv/bin/ipython3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/jvved/dev/testpks/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from IPython import start_ipython -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(start_ipython()) diff --git a/.venv/bin/markdown-it b/.venv/bin/markdown-it deleted file mode 100755 index 0fa5488..0000000 --- a/.venv/bin/markdown-it +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/jvved/dev/testpks/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from markdown_it.cli.parse import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pip b/.venv/bin/pip deleted file mode 100755 index 063c294..0000000 --- a/.venv/bin/pip +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/jvved/dev/testpks/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pip3 b/.venv/bin/pip3 deleted file mode 100755 index 063c294..0000000 --- a/.venv/bin/pip3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/jvved/dev/testpks/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pip3.12 b/.venv/bin/pip3.12 deleted file mode 100755 index 063c294..0000000 --- a/.venv/bin/pip3.12 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/jvved/dev/testpks/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pygmentize b/.venv/bin/pygmentize deleted file mode 100755 index 860e239..0000000 --- a/.venv/bin/pygmentize +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/jvved/dev/testpks/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pygments.cmdline import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/python b/.venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/bin/python3 b/.venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/.venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/.venv/bin/python3.12 b/.venv/bin/python3.12 deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python3.12 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/bin/uwsgi b/.venv/bin/uwsgi deleted file mode 100755 index 64f1994ef2d1f52fd5f1eb7b623423b13e0b5443..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1455200 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�JBe03AMR^G?Nv`}ox%`yKS~#2G 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�?I`S4D!6@QB9nrHuySo4xS|VQ=ytQTvg2ww627 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 CXE^3mM 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 ?>&`e(lj*{v1e%e8#bw$cvmh)E-RW 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%0DS!g;Z!O56r;?eGHP`)5kx2eNJ3d}7-{oIs zA;nWHXL}iDxSsrf`S+*k<@fO4?~UHR`TP8r{P}0%dj8O}?Y}?IAAgYlvi)b#K7ZbB zALjQT8~pt#f4A-5MEm^t(}U-K|KRUugZ6(b+UL(t2G0-M|26LauiyEd%N+l&NBjKw zKVt%aAo>}Of5!Dc!hhNR*Y5d)`SX|mjsLAVYVET9H~sQt#ZSF5+u#1*ej|VWlYbBo z#*g9pe~;_G(~SS$|2=;qf4=*MH_Y+pd-CVs;P(G*+8_QiZ=XMNU>g4);=dff_d1#U zZGO?3W`Bpj7VYEbZ~T`3o$t@~Isd;O?H@#kKlV3$1M=sjS^uBnnPK~X#5KJk`=9*l z*ueNH`fmRX_x~Sqvu*!Lw9B90_@r$;nZ$CIpZ|Q&{`PcD8{@@q2YxQ5Y%PaqiU)uTq@E8B6-O8W-S3d1~UH_U)MBZwj z`#<@mXc0dbe>e6c8hsK!^T)sAm$v=l$A8>z<u&w`N&VG+`zda#uN?m;-~N+!{hPP_ z=MTT`8+_9LIr+2k{@a7=+5RsLuIFg-=U<5SgU2Qh{OJwt=g~g-T0TE) z|KNu9|1{eFY&MLa!}f -# Copyright (c) 2001, Janko Hauser -# Copyright (c) 2001, Nathaniel Gray -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -import sys - -#----------------------------------------------------------------------------- -# Setup everything -#----------------------------------------------------------------------------- - -# Don't forget to also update setup.py when this changes! -if sys.version_info < (3, 10): - raise ImportError( - """ -IPython 8.19+ supports Python 3.10 and above, following SPEC0. -IPython 8.13+ supports Python 3.9 and above, following NEP 29. -IPython 8.0-8.12 supports Python 3.8 and above, following NEP 29. -When using Python 2.7, please install IPython 5.x LTS Long Term Support version. -Python 3.3 and 3.4 were supported up to IPython 6.x. -Python 3.5 was supported with IPython 7.0 to 7.9. -Python 3.6 was supported with IPython up to 7.16. -Python 3.7 was still supported with the 7.x branch. - -See IPython `README.rst` file for more information: - - https://github.com/ipython/ipython/blob/main/README.rst - -""" - ) - -#----------------------------------------------------------------------------- -# Setup the top level names -#----------------------------------------------------------------------------- - -from .core.getipython import get_ipython -from .core import release -from .core.application import Application -from .terminal.embed import embed - -from .core.interactiveshell import InteractiveShell -from .utils.sysinfo import sys_info -from .utils.frame import extract_module_locals - -__all__ = ["start_ipython", "embed", "start_kernel", "embed_kernel"] - -# Release data -__author__ = '%s <%s>' % (release.author, release.author_email) -__license__ = release.license -__version__ = release.version -version_info = release.version_info -# list of CVEs that should have been patched in this release. -# this is informational and should not be relied upon. -__patched_cves__ = {"CVE-2022-21699", "CVE-2023-24816"} - - -def embed_kernel(module=None, local_ns=None, **kwargs): - """Embed and start an IPython kernel in a given scope. - - If you don't want the kernel to initialize the namespace - from the scope of the surrounding function, - and/or you want to load full IPython configuration, - you probably want `IPython.start_kernel()` instead. - - Parameters - ---------- - module : types.ModuleType, optional - The module to load into IPython globals (default: caller) - local_ns : dict, optional - The namespace to load into IPython user namespace (default: caller) - **kwargs : various, optional - Further keyword args are relayed to the IPKernelApp constructor, - such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`), - allowing configuration of the kernel (see :ref:`kernel_options`). Will only have an effect - on the first embed_kernel call for a given process. - """ - - (caller_module, caller_locals) = extract_module_locals(1) - if module is None: - module = caller_module - if local_ns is None: - local_ns = caller_locals - - # Only import .zmq when we really need it - from ipykernel.embed import embed_kernel as real_embed_kernel - real_embed_kernel(module=module, local_ns=local_ns, **kwargs) - -def start_ipython(argv=None, **kwargs): - """Launch a normal IPython instance (as opposed to embedded) - - `IPython.embed()` puts a shell in a particular calling scope, - such as a function or method for debugging purposes, - which is often not desirable. - - `start_ipython()` does full, regular IPython initialization, - including loading startup files, configuration, etc. - much of which is skipped by `embed()`. - - This is a public API method, and will survive implementation changes. - - Parameters - ---------- - argv : list or None, optional - If unspecified or None, IPython will parse command-line options from sys.argv. - To prevent any command-line parsing, pass an empty list: `argv=[]`. - user_ns : dict, optional - specify this dictionary to initialize the IPython user namespace with particular values. - **kwargs : various, optional - Any other kwargs will be passed to the Application constructor, - such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`), - allowing configuration of the instance (see :ref:`terminal_options`). - """ - from IPython.terminal.ipapp import launch_new_instance - return launch_new_instance(argv=argv, **kwargs) - -def start_kernel(argv=None, **kwargs): - """Launch a normal IPython kernel instance (as opposed to embedded) - - `IPython.embed_kernel()` puts a shell in a particular calling scope, - such as a function or method for debugging purposes, - which is often not desirable. - - `start_kernel()` does full, regular IPython initialization, - including loading startup files, configuration, etc. - much of which is skipped by `embed_kernel()`. - - Parameters - ---------- - argv : list or None, optional - If unspecified or None, IPython will parse command-line options from sys.argv. - To prevent any command-line parsing, pass an empty list: `argv=[]`. - user_ns : dict, optional - specify this dictionary to initialize the IPython user namespace with particular values. - **kwargs : various, optional - Any other kwargs will be passed to the Application constructor, - such as `config`, a traitlets :class:`Config` object (see :ref:`configure_start_ipython`), - allowing configuration of the kernel (see :ref:`kernel_options`). - """ - import warnings - - warnings.warn( - "start_kernel is deprecated since IPython 8.0, use from `ipykernel.kernelapp.launch_new_instance`", - DeprecationWarning, - stacklevel=2, - ) - from ipykernel.kernelapp import launch_new_instance - return launch_new_instance(argv=argv, **kwargs) diff --git a/.venv/lib/python3.12/site-packages/IPython/__main__.py b/.venv/lib/python3.12/site-packages/IPython/__main__.py deleted file mode 100644 index 3b46056..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/__main__.py +++ /dev/null @@ -1,15 +0,0 @@ -# PYTHON_ARGCOMPLETE_OK -# encoding: utf-8 -"""Terminal-based IPython entry point. -""" -# ----------------------------------------------------------------------------- -# Copyright (c) 2012, IPython Development Team. -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# ----------------------------------------------------------------------------- - -from IPython import start_ipython - -start_ipython() diff --git a/.venv/lib/python3.12/site-packages/IPython/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 4d0925bc07208c14c9303b61df078f1c1c0ed0d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5892 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 RUOcLv`Skpg>KP&be*yZJ52^qF diff --git a/.venv/lib/python3.12/site-packages/IPython/__pycache__/__main__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/__pycache__/__main__.cpython-312.pyc deleted file mode 100644 index 6e662e75c28bac1d58ef1c74daac622afa867f91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmXw!u};G<5QguZia@1^r4LXlmJE#rtcabZVqofGx%H_vO`OO!k;2Y1Ff$?^g*V8C zm|y}`ES+#5{KM%#-T(d4y(GyHf{yTU^??9y-SRKio9!f+2T(8vg^J}^usK6uK||dG_B-vBUj{j x-^Yb0q&7liRkPbaFG_Wr(}g_<_2GGNqcA=rMEu%A9DI)eC$Es)AKEw^egMq*Q8xep diff --git a/.venv/lib/python3.12/site-packages/IPython/__pycache__/conftest.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/__pycache__/conftest.cpython-312.pyc deleted file mode 100644 index 38638843529a97486e8797c1ece77105f7ca6f2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3978 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 T_v^h8Y2T}UBq=xB#Hs!Z)#r66 diff --git a/.venv/lib/python3.12/site-packages/IPython/__pycache__/consoleapp.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/__pycache__/consoleapp.cpython-312.pyc deleted file mode 100644 index 01c106398dc8dc728219bf6be3c73551d7e855b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 552 zcmZ{hv2GMG5Qgo&<#IZ>2Y_m5P%cu|5GWB6B?ZYzq)D2MZ#~>P@!Hnfx6!7`Tckvk zi0~x50J;vPN*5GelZsj8q9{UGvNfamHQztupQF)`(Rt3l&c1NQF1qCIq^sb1i-I$z z*gjKSC5BhYe!^M8Fi|~~oQ>iP64l1c_qzhA7939JA z1t?tQWzVM sK;O*53wo}4obx|P!qepw#-IIW=@sMs_x#t#?Io2aeA#Dwy?#v6ziS|>OaK4? diff --git a/.venv/lib/python3.12/site-packages/IPython/__pycache__/display.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/__pycache__/display.cpython-312.pyc deleted file mode 100644 index bda6164ef946e27da61b36cdee2be56adacf6615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 952 zcmaKqKX21O6u^Csouo;e=3mn`Nvi;22vTDK0}KcWgj8BJZKPHmZiyWGnmG0IS-xv% z_zdjKj0}7dJ^{Bfv4IMz)QP(^RtrL$K@W=nLWE zofO_{o`y9Kd3u08=}1YbK!+4gfq@M$u?cCMh78U?7H44zFF_9HAdmAEt$98@*ie~gM#p^H z>7NY)-)+C>@3c>7-1dAH1H>bm-a;e@zcl#j?c|MM!{zpmGKebn0%*m z6q&)mqwZiJHj_cSG$!4o)04B%@%R=SwNo0 o_hob>KlVi8dkP`+Lr2K?+0xL~rQSsPrS?Dkda9wj@jdDL8xV~gfB*mh diff --git a/.venv/lib/python3.12/site-packages/IPython/__pycache__/paths.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/__pycache__/paths.cpython-312.pyc deleted file mode 100644 index db4be62280184a98b9f2cdbf03945677aabdbce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5767 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/conftest.py b/.venv/lib/python3.12/site-packages/IPython/conftest.py deleted file mode 100644 index abf6131..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/conftest.py +++ /dev/null @@ -1,87 +0,0 @@ -import builtins -import inspect -import os -import pathlib -import shutil -import sys -import types - -import pytest - -# Must register before it gets imported -pytest.register_assert_rewrite("IPython.testing.tools") - -from .testing import tools - - -def pytest_collection_modifyitems(items): - """This function is automatically run by pytest passing all collected test - functions. - - We use it to add asyncio marker to all async tests and assert we don't use - test functions that are async generators which wouldn't make sense. - """ - for item in items: - if inspect.iscoroutinefunction(item.obj): - item.add_marker("asyncio") - assert not inspect.isasyncgenfunction(item.obj) - - -def get_ipython(): - from .terminal.interactiveshell import TerminalInteractiveShell - if TerminalInteractiveShell._instance: - return TerminalInteractiveShell.instance() - - config = tools.default_config() - config.TerminalInteractiveShell.simple_prompt = True - - # Create and initialize our test-friendly IPython instance. - shell = TerminalInteractiveShell.instance(config=config) - return shell - - -@pytest.fixture(scope='session', autouse=True) -def work_path(): - path = pathlib.Path("./tmp-ipython-pytest-profiledir") - os.environ["IPYTHONDIR"] = str(path.absolute()) - if path.exists(): - raise ValueError('IPython dir temporary path already exists ! Did previous test run exit successfully ?') - path.mkdir() - yield - shutil.rmtree(str(path.resolve())) - - -def nopage(strng, start=0, screen_lines=0, pager_cmd=None): - if isinstance(strng, dict): - strng = strng.get("text/plain", "") - print(strng) - - -def xsys(self, cmd): - """Replace the default system call with a capturing one for doctest. - """ - # We use getoutput, but we need to strip it because pexpect captures - # the trailing newline differently from commands.getoutput - print(self.getoutput(cmd, split=False, depth=1).rstrip(), end="", file=sys.stdout) - sys.stdout.flush() - - -# for things to work correctly we would need this as a session fixture; -# unfortunately this will fail on some test that get executed as _collection_ -# time (before the fixture run), in particular parametrized test that contain -# yields. so for now execute at import time. -#@pytest.fixture(autouse=True, scope='session') -def inject(): - - builtins.get_ipython = get_ipython - builtins._ip = get_ipython() - builtins.ip = get_ipython() - builtins.ip.system = types.MethodType(xsys, ip) - builtins.ip.builtin_trap.activate() - from .core import page - - page.pager_page = nopage - # yield - - -inject() diff --git a/.venv/lib/python3.12/site-packages/IPython/consoleapp.py b/.venv/lib/python3.12/site-packages/IPython/consoleapp.py deleted file mode 100644 index c2bbe18..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/consoleapp.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -Shim to maintain backwards compatibility with old IPython.consoleapp imports. -""" -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - -from warnings import warn - -warn("The `IPython.consoleapp` package has been deprecated since IPython 4.0." - "You should import from jupyter_client.consoleapp instead.", stacklevel=2) - -from jupyter_client.consoleapp import * diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__init__.py b/.venv/lib/python3.12/site-packages/IPython/core/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c98e21cb77f7ea9169fbae06bc5881a6c9ebf681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmX@j%ge<81d5Cc(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!3f9la&rQ|ODl1D( z(N9S&(=SOaE-A<^*4Hab%`4N-$xPBOs4U6I&okCDG}155EJ@WZNKDR7OiwM=_Y45b y=qKkFrRvAWXXa&=#K-FuRQ}?y$<0qG%}KQ@Vg=g42*kx8#z$sGM#ds$APWGR(Ji+C diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/alias.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/alias.cpython-312.pyc deleted file mode 100644 index 307e267592bd692a55c94c28ed70f63ef666b045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10522 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 {b2$x9a%J zFU0!-UunB^;&%>7lGm!7Qs7<#u~mJ{^U|Sp0ZR9E1h-ZvNS|4A@zN7( z4pHh^bMw+;zjxRq6N}j%{XR3I(+1l#c&gIJu+Xf7k)X#_&?07ZA^$LcD@O6;DH?Gs z1ZOx4qbWNF!zU1e&->5w QPjg()%#q&_d@@M*AELYjrT_o{ diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/application.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/application.cpython-312.pyc deleted file mode 100644 index 1306fcc4ebed20574bbd0ce61a841ff812be14f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22883 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 N#aDk#;V4Xdl`)Su&8V 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/autocall.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/autocall.cpython-312.pyc deleted file mode 100644 index 4e8bea4fd34d37950bee7174b0d10f0719843f83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2359 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/compilerop.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/compilerop.cpython-312.pyc deleted file mode 100644 index d2707d39488224b1e94d616961a63fdc1352dd41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7038 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/completerlib.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/completerlib.cpython-312.pyc deleted file mode 100644 index 548ed2dbdb9a9dcd0aaebd1b600310176597356f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14274 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/crashhandler.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/crashhandler.cpython-312.pyc deleted file mode 100644 index 9f3e8d863750d3c13c35104aa6c32280b001a8fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9227 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/debugger.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/debugger.cpython-312.pyc deleted file mode 100644 index 070f704967ed11df5f79bfb3a095549e192a166b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44322 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�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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/display.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/display.cpython-312.pyc deleted file mode 100644 index bbebd0461983508b4bd7e8aea52132bbd5d56a6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52324 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/display_functions.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/display_functions.cpython-312.pyc deleted file mode 100644 index c19e4e52e0cf0c3b5ff7004befbb8969ea2dba50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13494 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/display_trap.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/display_trap.cpython-312.pyc deleted file mode 100644 index 3a6358226324f08bfcc8e9b2eb0564595caa1e62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2294 zcmcIl&u`pB6rS;qjkCMSwrUC`Y7@6AQrtGXP@o3{Eg=ytp(KbFA^9?L?AgSL*Is74 ztL!R=93qj5jf#*^n^W5pROO1q|G?dC*)iP?{E#k&dd2dsS<3Ws!1OuGcRbgh)p> hX-< zt1%Y@3&m`9tQO7%jK7)9p3pxIW+)5w4=D3t^)7QQUq8<*AKYXgii@TU9OcIYzwFM| zm^I^3Sj%I6!%m_|WEv9MnS}M{kQ7Cb3^FALo3ezcawk1)s!q=;Dnq&}y=KOdSCHA` zC?GYFp4sbUKxS9bA~tiEkfBAni6r#P%&IoOpPregcBqFzn(7|O=`b$Oxm>rc3f0Rj zsOay1)PRKjq8%_=T!2ie*G7a0NKWZ9wNM8W?pCUvTXw0F6>diS0K9nKjAbuy9WVu4 zD^?g%#tpsZhpwkrz@;9P^>B{DE5IDQFj}_k5Ef1`c4JFjP$@7MXzg4C@io4N!p>&c zIk$w?atJK}g5TjgsTK%Z&B1si0xUN6T-#Sy1xAM)6!f} zp{4nHojN6l)=ME+R~LAxSf_rym#aB<4xEs>ZDj*2V4=%1RQ# z+ZL-0205eVK-Ys8+rb*J!$&|oSw{D@zShF^*Ecld+wg~ppEToVZEW+<;Z>#8x0OLd z!>h_K+TaeHMK%^P9U}S|cpoO$0LuCHPS@AL3vdhD2fH1hcemRl#$dgO_q3OqeQ>Wt zIz~$fXe>{~Pw`O1V@M2+ph)I4yp35u%(>9(Y@bjA-V}~{u~|5zSqV=t@(h4p~PrJO4z8wKqLVIv(tn{I$p zZ4I-NyH&oo-ELj)?PJ%TbfRnE1~!0jmnd{Z=s$6HpE4AnR)a^mw7P^gE@hU7c-TP@ zU3_B$ux=K*nFcTMwm6i4_j|7Y>bWcDZXW-}xMghQPToH}d}DfjdUc}p;pWh>8}7Q> z8ef~J`t?wPEAg77y@r>ScvDdIRwh){_bpIW{rcI zi>g~j4+e*BjINKiilymK0Un&ZB(c zi#L`h9xJLk{HR}12Oi~B^`MxI{FRr~kvQ(y*yv%$!ITL=q9af#Zs^gF!;en1|MZjm zwV5DsTusTDBn$CNxQ!BrqWwJ8-b%7R%S6i+RO3fMY{?koZKVe*J0l3^{y=AbMKAr? P|1uu=^3-DlpV-CU5aRl_ diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/displayhook.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/displayhook.cpython-312.pyc deleted file mode 100644 index b35f5efb4a6022f764d3a9cfe6fc4981ff71f762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15104 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 XpK|nk`a@rUKh7`g{1=X%?2G>|{&8A0 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/displaypub.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/displaypub.cpython-312.pyc deleted file mode 100644 index d494d707009007d0ca82b93ac4f8ea45a8068a9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6065 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 QcDFLPN*}yI;9rXVFC7C)4*&oF diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/error.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/error.cpython-312.pyc deleted file mode 100644 index 30b610349d7738d1f4dcea2807a9f9bbda15d3fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1794 zcmb7E&5j#I5S|&^YwzrjLO_C3=x{+sSx-U^AcTwhuK`)!j8!UwzfT@9cyguABZZ zgWonh?@uyT3vIW~r}%l|rQWd@c>7-JpLuBj{;UV3ZJ+d%Ke1#jJX zo9Jyp0F7t$WsD8y-$Z|SA#$_aYH!b`;l5CPE*MM`$Ze)1O9VFt3_DSpbq`8ARI-yO z4V^IjvOr6l&%*E{_La`KWc!-S0cf=EgO*&TiXDK489KhtBs=5-F896#A)pMyp0Z%V zJz8N>C09v*X`FAP^27u0*hfTy(r*XzYs(zI#uV;pt#q$lo44Xv@)5-GJdER!N(({y zb{sz{xTtoXdgm1N#X&SwBZwZ3$B;%Tj3dm!=BFm=j6segk@ch86?wOF=i|s^7WQ(U zobmyfX!+}i%8!74-pNZ%y>a3ODyD(r%=@F>(yf*M^|f8Y?R9Obe_SgAET#ECmpz!; z*^j6&i5eR!b-Hc{;?8g#^2`9U!^|)Qwp4|#&Ycu8aecE2H_|NOmX2|Y0xrZGVsiv` ziej0eDn!cqzzPE?!<*HvyP|T?oFaDI+1}H-CMIbrR1}AH$r7w1Y&k+D z2Ne>zMvnJI$tFsEXxW5oq^)HfqX@yQ<_Yw%=eJnDuuE`U?GnbI5k>)qP`5~dBBy&J zo@m7)*5@`EvXe~UbP%vTO$>e&7wWtw(I#b=gaeISR|4d{Bb#Ot$EZ8X1yI$HR`C3+ z`6SL{j`>fxVHzG4NOSBh0>)XQ@FWszGQ`F&7Kvxy0A{XVj%D}t{m+OQCiQA;CaUs{0aM|fn<%jSP z5-eu+lQS`e%4YqNaf9=KO*i57q~1HZD(9muSFoD>%n+COf|$Y- zlERH3I9NpHx`6q;35s_J0TQ2FhJswZc1!QzcfNUV^+;E5kefFm(fsY#aKa($V!p!1 z7p>2$C-V#aE?%a`*L;WKubS`sf7iGC`r=dH-+WvyJp3$L4Zrn#_r}7*?_!sXw{BiA T-jAN&`DSfD?*2;$9l`$tUn|aN diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/events.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/events.cpython-312.pyc deleted file mode 100644 index 8a8e239f06dbd3697a3bd10aac5426ae841cb9ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6279 zcmdT|O>i7X74Dhcl~$`C%a&wIwv&vB?Pz0Z*FX8es+23jc0i<11>2;EsMKmS(<_a< zJG1GTl`KVexq>MIf5?eV?1$Si22gr%;PRV%0pZWKLX2tMoh0T+%tYnZNW6dhT$%u;E_v@ZIF=Ne|EQgSRaa8Tz9+ztF( zCi5M)<~;ABKRseB&N;G1bwL=z*ad9Z#>|qzF9qE7=}2Z3%Y~ma#tpYxp5cP%$236A zrFD^@u$tr+%yGjv%UlV>Sad+68W=9;Hi=U0WiAo}pys(8()F-NKy(+dwsCly7ad~H zaY5Aa4G6Rf>Cj5o8}%waMr3Y{$!rZq^*PP|TJfShB>W^TeNeU)__D+?%mK1-iOsP6t7q~yiOQqaIqvJevOiO}}>jx%w21)$6#`Lse zY4$t0`JJsd@mXan+6pV6rpk(bhJBE<;Eyc* zZOpu!TuIKdpXt}zljuQ<6`+D}ZUU`HvusJTbWP4#WLe$(0j5p3PT-g&Ktw_}lI!Wv zy@X1g1{8@&DsPwq_=ceUxN9^nahH^T+@f`4R1x_nRU6Q&R2EZ=O{<`E7Z1=@|qJ2hj*^GX~*DV9v>ImkyY&cUg{6_GhN z;~$;|wk+uZ|L`v^xf|tb&CnUiO<;d&Z^M|(Ch93Ev3f_uqF?XX&Qvy4Px`!66as=AJ9TTWPs5V%7vIj$d1aoTUs&LF-sTJWfcrt^qMy&fUKjEuXC_~f*TRY1vEz9k zA{(vXN`V#o`OvQNbYbL`h;x;tdb&_>fS5vId7$~wxu|OJeH4w+?|5T|x)o^_+$?Th0{1MuX&6@Ij0xQRxJOI4qf7)BG)|Z7Ha07< zgCPG(QxKmB4`?<66+}?r0u%89FIcL;)yB)unQ%m{ekC5gfXQdcKI0x@f1(Hn9-R>` z95TR_86UM_Wv}z4f3sQ&wXu|f0k{p~{G#hEHexE;j>__$NrVwlb|lXcV-{N;5|i0v zJsow{J7R_fV9DxjkOKm(I|-4dW=d{bPe;7_gk(?`oiv(`)Y@WcQTGTY`QOCnDtma4 z^$y-lf3oAi=ezc;?SJvN>DvBR@9i32>l)wa?7R8GFHU`Q>h_`9zN59yqZ?hlA58ve z^5%=Rt^?~`!?mvA+k>BW9p6l_u47xE#m?Qn#+66 zHpND{#=vP>^$mQkvOjnBeHg4>xpCzduk9JBb&hQG?O8o_--H5tnR%hn|6|?Pm()p1R=_qwIiyYMRKs*zs(%NUh-o8HGB{>bg_Y< z)yW%^w_dFEXYU+X>mPZ*G95?WKeMTKbRYRsZ~uq(TJNEo#e2Pn?x!&D_lIq4;OS4E zIl9(&>;Y@qc)-{H^uhc*VM)(6enpt-T%xOM1u|LujXgg&(QVIn!Odo#m! z4y8<{r)aV0aAa&wFE|uciR!?v0h+0U~tvC!qgF5Jci>?E*@c_T7z#e03jrtgS1=SUH zo@KSktS-nj#X)?sT774PszQ7r(N5uY)Ll?%unM=u5sXkq;?vo#vW*jGK1uek4IEw{ z$k*_fJi5`je=WIRIVDWlRwTnobgjavz<=L)%@Ih(W;mb>d+=h(Pios+6-!zFKmyIQ<%xqmEnj5bQl>vUN5R0Un<` zl^`Psp&ZJana6t$Hpd$SqJE??M42u<2u!`xD8CmfEf%KoT1r?zR+5(aO z60JA}S@`&mB(^J-7)hzQv;yb0l9*Y9l>QHK(^c{OAO_A0IO!Gq3re4!2r=sX{{>)R zUe!|YA3)}uT-X531%%8YYE*g>J!}b%rzd(u3p0WkD#%`F?-ssgE1`H*#^65k284>?uTFfJ_O55B|?8xE=%+TWmrUi&Bc8)Ry-lG;U5fHn zq8mm!Q|TWBS%)B{OJXe^_>1%_>NY+l=zb$l{$rgdy3P}`*1X0Pl^$9<@6_CL|Q&T#F09W`ms{{#W4 Br_2BV diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/excolors.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/excolors.cpython-312.pyc deleted file mode 100644 index c207aafcd8d2f943d7724d0eb7eff055548022f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5315 zcmeI0&2QVt8OBLjlqETGEPsC~rsFiSc5Nxn$1W1IX*WSOP1kEIk^qaiC=5m%+q5N8 zC22bfE{`Xof9^%hm0O1iWx>9U@v$;&d8UA08L zYq_hQTu#=NWkr_sFH%kK-u-wTG{*B;iGpS{oQdeG|lJtv}7vB;pv(03R8 zwZ^ITRC47g_)Jtjk=$rk(kJq+w4p>j+NIka)pgmB^u(^bk&as0pwH1P&RF9Rr7q#zx?fcy4gWc& zwsJPB(&zp<6JrcV)l53bIj&|_nQE=7Ck|-A@hwan9S1dCXF3jrL7w6g+j4EKR-99d zi-x)ND6FilyEkqZDY32=m#iRRsA3m)e5PDAYBi<@i48hY29;Znw0fh)oNJ-He*L=2 zs_GBgN79vmfHPYPx`*+yR&|YSwh}IS#nkF7TyF8WQ^Ph)ca~M7u3?ri$&zKVaJnUH zN8Mp+kWO={B6x?1uN`NjJPvbLUYU0Gc2=KYLU+V zK@XIs6}6aF7!AjS=};G~!4kuI!?x;;U}D#5M9H?JdAGxzP(i(a7G46sTafX)#SlLo zt+qA9%~yg%eix1R6Rhs1O);~djYiy})^H5fQsEkD947R;1pz;a9=;MV@>3yU zKNT*$l<@oCMCuQmXp89k$|7zFzkAULZV1{*c(?co(=83zc-yg)^yO#it`cUo@m6Ew zHO5Z|ELv&s^8qJtXp+f+1TD@dPQg3 z6_+_~W7DaWx0$(JsTmI|jo^LoQhDKG#i5Dj8(MW!TVqZ|yeU?ymdz@J8b4f4xzY6d zj$bdug!Tf>mZv}GF41@_y}T^tr$6sI`}oewl$05G{N9UX?s;;1BCY=7b4s&|zuqfhr|3IcpvZ)=+Tg2&8zV-Xu){V zTjUea#2E9>d-J>iO^h+$gg3#bpou9MV*NAF=i2N09`yOJ|A;rji_pXz`DVRYUVV>7odd?aSf-Sg%7dk zX=vd?%r^rqe2Ddzpos~tvEnIw9-4dy=A+&yuRvdDGhBeCTNMn?d*}HT=yzUYc$FGk ziVB8jV|+*q$6sMcD)J#1W}t-+!LSEf_z(v{Rh9_IVx117cL(aF8}$#=Y=1B zk^a$_J%gVm2V3;hDwVqZ?v)kYs;;cqbEN%|=wEqTu2FN!!SAzXI!60B6+WBrBCmiO2|XO G_-_GXCR2X^ diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/extensions.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/extensions.cpython-312.pyc deleted file mode 100644 index 62a4bf9197fc7fbade40ca08f04ce528d2eea204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6298 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/formatters.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/formatters.cpython-312.pyc deleted file mode 100644 index c1c56db3e750b367abb4fb2ce147ce548403455b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40842 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/guarded_eval.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/guarded_eval.cpython-312.pyc deleted file mode 100644 index 65aee41412e2db7372ad6e5addcbb45d182bfb10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34278 zcmcJ&349w@dM8)~6fOcJK!W!Pink6@_kEZaDOndKi?TyhnaH!AnPfJ*3ya!u+xy%7 z?f-jKg^Q58v)PoySFgTzU*G$#_wX0Fxj7u3TK@gPFJzAUU+6=B$~Di*GY*b>mpj9W zoX8Jx!@QRtHh2xgMz4`4m|;j5HhE3MX0LhJ;s8F zJDlgu8+Lk~!!ECDINzH;T;MGjc6;5!h2Fy9B5%=fvA3AzXB;Z=mLOl_P^q_+z0161 z>|O3HXYUGc1>V9?<#3g^ils3PRS(yAYlb~u5BoL`)ef)mt{JZL*0FEPQ2lU&w}I!R ziVMf}1}5L4^`e2}WE*m|4K)ondz*(_ye&L8Vr38^33*KV9G2dK*mk5}>s^bqX7(kh zUs8jCJIslWYn+%X<$h>X%l=TSf_I%3o`-N}mhkmjxC`O=S;9AH;ROhHX9;hW+|mZA zb-+-D61{C=p=1$@0JDfj6*eG<#n%MyMyWxnVKps5PNg5BSLo5}slUCO#4>5KSS~rG z&6FcjS0MG4bf{P4h>qA z!yj9>r>JghRUE;pIGR{jXBq4mV8;`%K88s!f_e)RIK?2Iz`8jnb^+6rT=;e2E?Z&F%lHdQFMr6Zx#;gi$dnGz-;;>x z{T9Ms@o}^K1ub1_9dvA}r|@3IiZ4T4AvKoj2h_Y8s@3@$Y+YQFzAgRcd87BW^PDvN z7LSszNW*&GKjNh!4K^fA=ra+}tH{~4I_I}|X+(=ZB2A{me_4aREPX2lI;BAqy?~sr zBah7*d~-@YMm5-I3hXt+f31UilY5izHx6?Bh8OcWZVKy3x)S8{cpcn}=$R=#$lox& zVHUVI+yd8coZ_cAq|Q2`m_ka!Bw3YQDtt_Pb9x&RQX!|Dd zn_{o}4_`0qE0`d+&wglC%SFg`>9TZD`kvS)o;z=l-b5<=lfHYq|3h0M4&{~d@3#1% zMGX_B9~ix}gPb_ zy0@i3v9*tkj0XAwlBk&5M<%)hvSK~hH#F3DZb(vu4qtyju^jgWB)M-$$?57Fmc*X% zF$7t$?&0x1 zSyW7CMvzjm4oZREK6%iu8$eW1L>;|~0@83-zn(zPfvU1XIQ?C2g1g0c-QsScPJXJB z@uD>0r}!SvSI@ScA03w3E?l}KiEW~EsVyM+17jEcZLOE2kxOkuzH@D36X<}EEv=h2 zxA`%08^-$jFZK;e{nZ|_UveM4%9yaB1?W^yPm zc|AD|x};gJ!4pbyi}|5V>4N$Ylb z6J?jV%Q^u}biLe!FIL4Cqr4V=MPPH&eDN~9{WMM^=0Wr($~` zApeS~nCuU^g{q*=L$&$poasX*$vHz=s&ht#??R$v)8&o$Y!Nb>e}E!ow0s}I$YEWu zjlS5NAy8U-_2FEhRhpa;SaJrXpkq|>cZ~+LIl$VBan0!cjFQ`_EOH31`_&2gK(MOC z6I>An#z*>BPbP{=^J9hhyLY*OUNbHT5szrlS>P!?K(W{pQQ$$(FvFLg zfl=8r=mQe*q=H*>axmFFr`aO+d%8wPB#&>v)89wCh6e~EBb)UeWTWNi^LzS+WT{V_ z&?B|7%xKjRUhD1cVgo_ngyegBF<=(tNfSpA0)(qg@{{N$#WZ?(M3NOdd-bXqUm%pC zl=!q|u4XZMNs?usDEZm2QPs7Tn%9f=`bNZFwQ}-tWZQ{9e;=G_?okexTR7VhT0193 z9qXn$mkWw#$KPHzeQeoYFuOHWKGzequbu8#u5Or<=Dl|cqt*MvLd64XZrECO-{Jby z)pXz0G~W^4c`~y8 zy#syyARQ)@Towo0B;j#?e`4993u$q)#ZCg=i1++rl*mmw)e>| zz>f_O3-U4bq@b^~5rK9j+27hv+jj?WA2i; zk#lH$N?V`)Q2(;gzXZ?MRX50EW~8Rna=64%V*)xJ;8Hh&paF>7@O9}XKqSf{vcf=} z!ApLQ971aP$T7U>P!Xnz^U_DqN*zP9da^8QuTYST{QL*uXkAis&t8Krd0=t-CE+Dk&m=R20x?~mYr<$kpTs}9WURd-J!u3Abn_Fu(<4Pdmt zw^u%iU`04L3Le7Q+sif?b+IDs6vEgll4*j<-Q>^|P}@(7P%-+YfZ7vI3b2y%A~}TQ zWe5u>N64agCe6`BFmk;3^IwPaZSHe3XIl5b(-0O)LWNPGAy(TM7D_|)QK2zb zT^AOLW&=^7F4eoHDJ+zQwnl}f)VP(k(9X#kzgdCuX=~JAEwXs(8rprcE=#a&cAY;{4WV@y6@+xDlWS_TsQm%to6E zC0>@XRcXjFF}7BqO<*7X>qi#^A#jb2OBqu>XwZqmDIuWA6gcc+Iz=#L$_5Pz7eOo| zH_QpqsQLMTCa<9MK|#+~t_=`t&7PnM@wo&+YfcFf(n2gjOVF&BL0GPi3lLq;o&aX1 z`V1KAIT?D==eY^~GIz!JJa-u!cGsaE#l`ql+IQHj08wd`{YWHJ7qM}X55uSA`20HQ z$VOYqOP@)KRiBQ?fVRQpWRNe@=QzuSO@B5k6tg;7O0G6lG^|Tli1s6TRJN(A_k5pU zlXLV9^{U%pZ({CDBf%T^^Z)m7rn$I-v$}s!_ujgj>mrth2hPH{!D%X5F0Pw9wonl* z-Zx`kE-DK(y#2yV&N2|Q>GeIKb@v!rj$ta5ufJzsA2)M_Wy|)WSt<0wqP=Cgs50c8 zuUHVHMSErrEmyLf?ugOKgEJ>$&dNFSJ!fOAqyjsit0`{b9BY3`|D5CD_9yl?M5I~9_RMK`(%GZrtiw#< zwY`zzvIj6Bb@l|!(;x$a=Ac2188iZG6>{7+`6yT$-pLnJPluqO(l5}bRTgcI;jXUP#aUlrPGCpQDbvriZc5aISI_+r?tTb zKRE#kvrPc`+lcrR{P`s~j3ogRBE4NPeH7zoEtq{VVp#)1?=vte-noi-F`Bz&`p^SQ z?)0|+#e23UV)2l-VcSF6Hp1508T;(TWqb2{(SrTX3!kj}x&4{@plD18j9WQJKEpEo zC@t~m!?kjkAr@VXb%q!Qqa@r;aI0RhCz6FR3|7&gu@vbsY>1H~*>z=<7MC$Gt8#N7 zZmt%CF*d7W%@PC?%{S zBMgQGiFB1|IhLT5DzIf`iW5RjY;xf1Rjy2a2JO%|A53R(8pLR{Dy8~-)*uONlopq; zYFbnRB%>DSnWQjT6{}&11cxAAeU|DY5TB@&CYdvRoq<4w%r}kgN+1yj#wZPmJciH) z8Lch<#4Lvg&@8Glk-u&DP+J2afruwz&*O-A%8%5KU zX#~=nE4&OLe$a>zlYBL0i%hJ#DRUrKFO1NiK2QDpgegEYFMCo$rYr%XdsVn4P@wzu zlvCEAm8DK@)rr#3j>j=BrtED58m?n#*fx~|a-&EuEociS*3^_erKa{|8>SpU)(+bG zNtMyf0Z9wk{EPKG0ttl;+x!LE{DI7c#P)CQk|z-PmLR{1m;4*#TqB2}W)d+T>S@Vk zXjc9XzLX-G|4B+g!|n3x6z0;y^r@&)4HoR<SGxCMl*>S4gPDMG!FgWjH8`v8If6 zI7=~$)3*IY!AkxrxMC(6b}XRSRr*4ec;&HIFI#kgD|VDm_b;+as0R zV^y_FRl6fqyJMwmAKA@oa>CYXP{CE3R>j^Fsoazjy8*GQ5W6hy;tEP;%-H)JRbhL5 zq~$=YsO1#}D{2p~Yo9svsXZUUwu+k2`1jY%99wpmhxW`1i|!4eUOua;pL=1U zK3cV7rfa#pe(syU|6H_u|ID#Z-PH(vWaV6ivz@QM91@qRH%IW_xtT~FGuOI#X~WUT zhNBNTb8b5ycD2mfLl@%)A-{IHVe`VCyY^_q@!78B)@=(Tcg1Myv2fu!q$+I;w>%Lk zdE%byiFht0MD1NgzkFol%4$Do4VP>J-IQOeRCqu)<=1}Yr*-&e&eDS$4S%-L*!9ipU#z29CP6SjPI2BTidpJU7vNn2L;0X1x33 zXCmcb!6fu=M4D;tGiTkeGq+qhan5YZVWdwNlN+URR>WaY9abK|0cT|x{SUeC8DT)SMlS0-E5cPz~(~n)I>|o})vP z@1P0fnYMYs_F)HXANDib2lG@SWj8~vu!jH)dSXMD%tprygfliKjfjd7qpS`Uu^@>( zc~sWf6n)6Pi{KVZQu-!K0LTNB$f9!Ae#NY^Hi{7dKW*HEWbmk?I|#sJMK(O6N#ycr zaB0Rs{Nyg2t(&pL?2egzF^BujuIpW)O^c4IWoJRWfU9ZzB0ncL4{NTdB37~Hp_@Jm zxT4ZW`CNWOtgs}urg3S_uE?5QvHIqv`u0eD``yN9{gGHh%ThyUq@gqBY5Z??bACbG zNGT2Qt&nfU=%DH1u;qNYV!*ebNQU>@`S!Ir@{i$FH9)C*qyQ+JKHr0f7;_92e3=gz z@)m?p%!~(6$|K`}a8N5HdwxNlDDcOH5$&oAqK)#K_)_wF{e1%xlUe8kO5+WJjO|&} zxKvG_{38G+n={8sBiL3=4j2b>{v$|2a>M*k;ZoW52>#o*$F}ZV+Ilpy^=Qmhxa4Yz zKxb0CVl-^ao9S3`v_u>&^NkV5Cg4*9JJ&~?>*t?|IJbtaTUAa)TWZLd;}Si+8y`#n zn;OcZupUVr9StfbdK0J*OMvvwX!$%|3_;!ESugl0Lv60U2k)e3Rr_^nS?fcXCvz(m zh&s(Z&?WM7;!@-8NaOB1C!)@yVe8R<(3TL9b4zQ+J;5q?2WvQB@{|$kOHEy!o7N7bcS{=Ygwu zxnj-S_W7*~h0%)bv*!EGqK6hP*S%syXq+<SPkc>=JzD&zarnxH9R8UuDGx^%cSx?Suy7M!5{1SSDiRw4+xa(isbPS^Q?r_Bk2rYM5uncR$6w+>_p@ikg;!FYP0DN%wSna87#|*<=t>xn zP3}G8XJn+RG8mfh1V$n0htyWOBxx1|exf=_$su|IWOSAwI$OKI_E_1S97lbsH_YZ*vbEuHQKRAUFRvPGDBqApYe{&RI*i^i;(4G@Hcn z9Im`(`uJ@9qEM}NFy)Ze!HG#iJbki*Rf`8$5~zk-1-(bm6_86!bn6Y8+^ZX)1kOty zSi^za@WX<{bNM{%RfrGpFg+3M4HeV$$wTkPZUa}w}s2yj)jK*55w((*!lrqfh?>{3LIZsngG&a|``@*3WCFw_9>N(QYc^npI2unPPE`H29%wv|9rzO&S!7yWTN9Pri zGmwpjOv*S>?NVkOh~-Gp{HdlJK<(1-SfI5_{wF9ivmyVAVB~z08e)Zq8q%JyouVK` z=pPkfKiaP@hqS?=PBh|gW|K>aJX0Illk64jq_qBc73SdC6jZF4$Fns;h^?R?DHogNCG9im349muMsbQII276v&<8lF~TQ=Hqk6zA?dC?R!`1l|5AMoGf$*4VR%Ty`ig(yEB;0KpQ6L%KZT{Sln(cq4{Qi)#GWPiciiy=%u~GS~O%UyTLQ(!TMX_kMT-cqijLDD-0kdRi${nee z$MSuo5;0l)e+dsrSr_Lleskpd$n@a{mb@iPS;SHndf}d>c{#5#T(u#Z*BZ9AVym$_ zmn;?cEES*UfK^;}m%a@tU#y_)-Ss!tzuh`xS+3tcV_9^0BG%evXU$w4ETiTHVkiBO z^FireP!}oa4mX~jFZrnER!y{JH~e?5d{PqL|1^9Eo3UgR?{vdDu<5rT39xUT>@7Jb3cNsq|ve z(h+G;ulU#~;-O5m)HedVPAV5M;MZfoA_OqknT!Vfop!|hBg4Q9ew<){#o%Dac>l%8 z=h{6YQL7%trFm$z6Qb#dEo(s1%tjb($`-sD3sxqVeK6J-55PEfXow`Jzy>}U=!vTA zLq*S?&Aw}XL48EdZCVE;z`KU^eNNr^37*y-qFd-$xdi96Ofo80G)OQVB{VLAR#kmC zXe&S)X%FmzgNC?-Y_G);fxiPzx6`s+>G#DjXgSxC~1UEqWT_$p!!*bfcz&o8^<>s1`eeoAAIBPJ9SZzJ9je%XjObt# zOwn0mrd87%;1?u7Lvr=5WuJdajUd6^FR5Q!-*LZl=I!#Zvo$2XH+pjv9_&i$dR>P| z*?ZZ8kY9J`X_BrwZo%Y~$sX2akG=mKm1BIjI_8ttCqs4DUxB{uYli&Su8f?6+*ehF zwk(V=t<#J_S3&=R64}Wi?lJAaO=2l*|C;{DCK=ahVqKDLU`tsM=x|h~1W_sL^{L08 zdJ&9mXBgrG;&S}GlQr7NJ}$y1sJ3ngj3tEbq-7L!dcsx@YYs%lT_CnHIP8lwWVz%p zUi<$cACr#JN+nY@$h^p53}7z#TyT_JZ65YZbc_gA%}k?(5bg<8&h;fFC+Bwo^uGYl zFNvu-{kdQ;)z0ml?|6TI973epyQQDh|E!u=@!GhRH#N)|S0Kx2h{LF~N%c29g1?Ob zH6cF*)};FX8{oC-9H!FJ<}mF^Y+XJF&%2z+3`Mi4!}Kvy&9T0Lv7R!*ypYne2j+o^ zvnVjeat8$%loqQ7rK%)S9aVV}(OXQ4g@|To8JM1qsazDp=$PVy?Xu{@;Xg^!N@d7U zL27_F$9YR;XfEUa6Yk$o@9jjcSR}dm(}!Z7rk~`#pZg;xnMyTAtd%o{u%nV}l@+&S>G%|b@&=^R?-yndRA_YkUV%;4km1= z=HFaE-`TU;l;~WST%2MT!d*ykp~zHwuBUKfNnSXZnm=lq`6TiWrR7gzgp4PdKR7_U z9tccap!<{Wl(<4FcbbhiP1<+pbzycer@)C5=FND>pcICE+RT!R3|tyFY7!09&w5UX zNlOY3c-$J*M-)=f^nGyVzikZE>ae6jS2SfGKcq1Kwoxzn)yIwD8a>D4Td&P5FP}~8 zxnI%CqGie~T4Bl4py!3&Zq)tBH=xbQFWsk?+JOrOUi5GrTa{L<%H-GyspBN_Q?`_` zvIc0sWRIQ`jf;OcWo}th=I(kucJi&KlgpBMrKD(0#?*amjhN7G%VSC*GBD#wlwuHV zXaV6Y_5@RFM@T#4Nu(1f9hDih`7N-(LMzo-G-V6g0yuPVEN@@zH95}RT$3(%~(ar{!PU!gkdutz5cQT^K*Ab zAU+?P7YWlco$-8Dn?oVi-lvhXclBFaD$X@p+Q<7=kM0xd(%l*yV zegnIT0yuRlH)T!bCfC#rc4(sCFqQk*ws!n~Et}~pzou+xDRE%qYs)_LHDx~^IHHH9 zVV|QqH2H=GH7}(v@>2RDFH2wKp+}D=Q|mtD;!MfKnUae$OD;}*g!K9O*dFfEOGv); zwDOU_(>gSzJnq729h!V6>yQ?+CmBQcJtpQedU*1kjHzRW$F_n9u#6|sis`f(c{8Hn zGg;1*D+R-IS$E@a=;`(R*>2qRSiI)aI3VevSdjy|Klx6!>anx(d@{D~OXNTFcj;mD+C@Ew%K%8 z#VNGkuZWx0*ZEod`tL{gjp(&Yz7zHANb8HSWDMPx?CYt5V8P#!)=!pK=6(dSKUdH2Z20WMn#3y!z!jxU1 zFr_Yq$#T_wcB*I!7%1ot7JZLa)+>5$DW$IuTunkRysG0#rr z(GM0Q-`8|VGG9Pb@=eR5Bv_J>M+ssl@n1pE{cB^nBz5La9?{EoC1Ub0pFWDO^6Z)* zP$HK>6X3$2R9{{K=1lksVI*4E_a?fcQ?)jbNKpk1o2tl5(d?zF@Y=`5hJ28Sla5F` z^ABARWW7x3?Dyc5y>A3Ubxjqh>;F6l$7LC+e;9)#j%`A6N5?f&vw~3wDdm_rhY8)u zBH%LgB_3SRGLFmS0)9=ENSA-G!=GA3B-l5r$pYv50x)R4+&AG@1=4;fC_U1^04cn8 ztCwDE(B%KDw(K4Qzo+@^Syd_E51ilaX>Dyid$uKqbdDPmby8cGjF04=)v+)2$v(Pc z$paZAu47`grrfW1_IWlXGwmB6q#*Rws(9RkMt&c0VPBELc%kup!%g|uQq%PAPS*(vgW>F8aEc8dQ+3oh|8lx z9_YC)YrU=Jg#eLt9j<<$JfW$*vKyJ=)Gpa6FjXtF7?LMEM+Q2tjIk<_LidVC8uCk? zb9xQb{Gdl0V;Mp9d-g1y8-_v#Z61=+?jIX3^Qx?mmw$mAAfz|6Zd7=Q zX^=Hdj4F=*%C>h9cSAyxynnJXp>S^9t16lIwrY$n2MYO(Obxh5P4UdguAj zOLI+2MQbC4`@dv5=-((V<0tDARz>=O^k(g-0~2OzJ?LWXPwB$R`gUDem647VS5WS$ zJ8i~wQFmQKap`AqxqGwnS`PImR4I(hua!6TjB@?BJ#Njv35_>>$> zX-#d;I)^Sp5GNGVlfIFYV~Q{&4L}2r3)0R9m{e0PM0d;oh4L6AhgdmP_kWmjv#5hA zDaJ|P7_9Ke{ED4q;eD7gqq1NAKPZx^Ycz0VL@}^GDBq6IeMyQ{#Sx>jlJg8*R>Dr# z<7zly0hmSv)DzLn1oYohCW15+@GHV`91c;9MVXN&lY~1_Ma4`z0S?ldx-qG7Bb;A- z(F}!p1~?us0k&IXisj5mpFDxaT38K6MEU=u0&Iz4V+Ny&K&FJaBqA{@*dckv;1hAB zojy|RC==72p;?42aH|mZA;pXf(10uy;UGqs-7v&%gHWv6M&g%up-h%0qR3W0&)gu z&gIq4l`Pe6iQs?kRtVTF_URyWkjs|*+4>(C-^;t1w`gfvc9w<;-z&RWHg`DcTpzZs z*Mn_0ZHtyQ>A^76aFvDX-&=cg?c8A0)jDHZE~pL#-n)GB@?!I@Xu<9o%YA!6%vrSL ztc^Hp=bB*lT(s!i5i8mF&gD>G?%DaL-}gpKHZBxJOLl}^J3cF}j}@<(+cDQNzdc;I zdASgEdHZOrxM6N^sc~ndac8(;*PWtp;ei#4P*M=*g!}>=e8svns!8*c0|i|u5h)sg6l_So}4u;7gmL&xo4w=8)iCj zjt$4|QIpLdyb>+mF?0C7yL{PQ6*~7p-A`KHZ&`G&U#{M8yZ@tsTLY2mZL^1QI&Sum z9-;C5#zl8atZGdXq^4mY7WKZn?B-ys%rlpNvz(cL$C_IgTJJSK5i*4WH>U0eJ~?xD z_=Ygc&u)sj%R*<~I`IDBLgUirj>zVYyU%{o7k>Km;^yvH)%G7e`@wVbm!ehM7hbwk z8?D+qd+2^iRjgs%TzSZRzoIr)*Br9ODm*tjJ}YmIl{d|s=dR3O3YTtQE=6B_KPOh+ zGT*ecc5h_u-f+vlJ7>bB2hp(C8K*u$95)?{mIhL4LnDXdfjV5DIEB%|{Rrt#Xt&5i0 zSlgD5CT>mq!ntd{_8nWOHuUVzT@Ck~yTaC8dPK`j%OZ}@|LTZpj?0+c4rgrR)}Puw zw*A7jdw$b9WuZ->!Jp?h-gE6Hxcy`MFI;=m;Cok0Mmkxf+vB4jv>BFY$+DwpR($uu zjSF*4QODYBU%neYSQ$B5(4Az~FW7R@Ch8(4DqA`0Z?2!WL|q%xR?g07!LC&+XWOE4 zQ>rdoy>@(zt3F=a+}JzPJ14?zzj+ z{I(f04hb#Ut0VSm6h5$M-w<<`hKg_O3p+e8`-(X>FFRbbMXw)={)NBe@ zZ(e8!J9eT2oS7Y<4~~W^&;ibkVe3YHkh51QwF=@-eDC`f?HlPl>9)CgT9Z-t`mket zMs2D>gG<#LBh?$jRht%y!j2u;YNL;8D&CtB?%SQqZbBH(-+UewbZ-nhHh#tcFWh`# zzA5V797eM>)TuWpJqy(M%>&mDgtji)J@bVhRsBv?Y{#CTPJBG^3wQg1@tq?$>agSI zh3mrZ_L&YixcDJdIJ+n8sAgB%y|E87rg6tY;HSZlgLivA*%58%4m)taM8oYDBhKBi zk_}z3k}!xhW> z`Yy2-g^L`&Sl(AAKvDvppt(D%xpzXYP#r=YpXW(^#$>T$CjuN*H}C&85bGhN5JPCnb! z+kND4S9{Ny)16AbMl&R@=#r_qiixblClogb4FBlRB`M_&FZmGi(k^sNA%l!ye-#^9 z^0A~DntU0%0LL6$lFs=_lnW!#9HR-Cp(G@{K00HBHE2E#6E;L#4Y!~FsP|TH*tK{1 z$bE}z*|}zJ%TnFWNZrmmb$0@6k~_P@*6w9{DQ@ukZ!~HDB*~NK;3H@RU)a&WcFFAoG{Y!5b8wsd|)dz8&$u<%YaN6H=Xy?Ui z!ARQ!>-01MG8tk|&`yYj89r$9NpAys4eON@!`iL)bpq6pQ}!uGpiNI5NGQ!O5c{6- z1atMgZYO2}P}ep+T5{IN7k=G5Q`)de&qwbUy)^v|!7s@ZGM=xSF{E&Wve4**81uy< zZO-IPIfHpAJ?6~pv9}Fxl(1u)&Z)fH7JY@HrFOk&9CJtl-{<~9>t7F zD9JG!siiC-hj4$&EP6 zj3*Mgn4H+vKs+>ZSoP9rgoNs-<$&qURhg5r!C2mG_>- zRt6E>S^bhg66^Jk`vbUxP`i4dRqjCj{)T#p3Ca|%OEq8pzX5@Hn0j*xyRE)ujVgZ` zrMP>MLMFT>d&qf*9Lh;OF^5S8hI&XEk+DQMnea9aLX1G>41tQI*VlL-x} zvIVOi%p@wRHT4O~t_zMI(myU!WS|NRSlh_KZzFL2YjAM6St0h`*$W@kE!rC&897^N zC}-~QqILa)+!EY4XL5o#%>yi&TStECSKnkditKdItGIJ=^J~)jvBhewdR4%{mxXxRv&Zb$Kbsb zu~p$30h}JyukTcqfub-T0zaE@5&Yp=maUnrX#98yf z_Iu8jSZUd;>AtHdZb2k=lUmqbIahSsJ>T=u^S7S=u=-x@js$r>Hy)|lFn>Af-T@8) z6Afx?EbZSlPB4Ap=FzU_UH$e zMO*W-vu^I_QvKdY{oXs`U5Jm4hpore;M_%9s}{U7Qor*~{ax^UPlc^d;ZB&jqYJ_U zG9!V&mn)mlHD9h2pu&DyN`Kzac(mC3FAtO-t#oL{ram#vyp#4>M(6zy6FAklGy73I zqL*OYX~<@lE>{s_kd5)cEr!^qvW2Mkva;id3FZVvXpfd-j{co|YdK~KNy(9VAmfoe z$;-I{w4~XC9Sy6N9@&+osM2 za?BHVfKGZyH0;N(UXZ$vt`yId<;!Il%gJ>N%r2BAMWm`zSnttJWv@r5tnyCK>$EuJ z8l;i$qF8oGv3k_*6n*|7Io;&YZlPH9%g2+#c*RCFViI(mJh@02kpx&i0$#9@xYpZzmR3wfN&I2 ztO?RAVUzdKY1Ra$DFN05V5gWhL6Y}Run*eZABHL1M5pStEGd)a0%|KCq#@r$K1Ki> z#%GHeXZcA@K$~ik9cFVvKBdQJ7Y?brs=AkwB2Fe}nI_1K$a3`r!BwEIy>j)H*$D_e z=j%V(@H-n~TXy_(*T=hl;oLWW5Tehz(B+@In!?U~GXk9Z7`OVcvnFh<`OMxh=Zo4m zhJ}q^;@S|`e#VXesk^;ipfVGW03Sn&WFVKy{OZL06fPSkWY?QWMF;I6`=FHUf$Rgv zA)ZgM9qr~)Bp=^Bs2;Y%ea&y!b_EcP#1cdRl!C}7757L3p_}9%wqJ9 zjt{A~OrMjq!+xSB4H4M+Ja#riVLxER7PBhRFvw$QB`!F@Xr>;Fl4+Qk^Pg#~h>>EK zx;m<&_Uh@5xWQz~eNeUr2gve3(9GC>xoj^aX+&QE&VaTC72VjI;P)*|k=Y>mbr z^Nq&+LqA@WX=ag7H30-gLaIYG(*q;X2Hfdwn(ZVC5t_)!SOR%{*k*`-57>MG7B&m1|9 ziwJrTcj8!a=ZUnvGa-!gqQZ1&52iExNKPu>qH{=Cl7^HeX-GRVl29Wj3~6!yxMsd$ z0O!C@?mGlz4gP@i=)U3M@cBw0B z5UwuskB-azl1v0{8jc2?O;_OQ_YcW4h>(xP;IC%`{OQK+?+^U(!Mnykdg>SULv#Ea zhi4Cl^1plXp8Zf*IP@i6Ocni>yIH`&=`hmBq#%{)9wYs1B7>d>KrvxXjs$=y=;u+0 zA4u!)_MV>8xWm}0?mj0eFSa8+O+H$h>RtF}$k#*8t5nD|99$4GLxAh#e21LZ$$5hu zwv{C_Ba2hq^OgZ+xwCQ-xnpblV@glEmi#A_%EV50t2pmp5%dl@$H^fvNy}UKd9o2d zen>08RIRGSkubet#*)VPs5}o%BlW%@rc@@HMz)hf^ox4riUh2x-q}UId~yoNag)Q? zEaKf%&W^EEi}X26eGH8_j^e9!LGlLbAwR-!D+}2e;g<;f>`EfVp7^aXT;fFg61yV_ z$LoQ7{4$+Tkt-=(srD;dtuWRY^0(r&(5R+uucBZF4l>iBc$_F57*+DscCs6BN7z|; z*+V(il2b=c135d$*+))0IloH|>&7nfF~;>0`KHPFHaV}6^9SUxKL0cFMaa2FP7k%) ztS%3R#1vcN9uU=h;69=$#&!`G0z&bw2q&OyR*W6KON#XnolPg7@x&;CPmNwy%*VUw zB)Vcgt-fKd5I89-X1tz*1p&R=akrr5L|=e1QVkY}sZ|V}FEIlIybQ-t!tp?-VmJ)X z;XtQM*QseX3jMGqg7*FltIQdym-z@g6RsFxt)Q9+SjNe60EflCpf-L<4xRi$GrD`! zN%$mX$Rx^)CuPh&+ffNsE9Kp1PMtb=x~H?FxAVE4&eL7($91%(a^?iTNYO*AD5X^e;JnVu_^o=RjGZ0^>F!GV5gpxzPZrH_P zs$ZkJ5i(KA*lHia93ezTr_yy~qm(h!lPyTStczp`n7Q)kq%?x-F_cm`xTIlqPU^Mi z4D)=4(ir>B^|KrA{m=NM%Pe)YOE;zTxXWaQ9S*1fnH0l(|FU;ayEi2pE10Ko@Q zKF|LZx9J|Y=?jCKH+;dZc2=4>-u~}6=fC3$n49zOxrV>un*WO1{GYhBV1)(ClF=P8 zx@QOP8LR$E*cKMH{TE^F1EV8OL44{U%z4m05@~->meIZ zgZ6}A48Zey5^}M+`WWlU>bDAlM;3hc5}?ZZW(TO7GNtT(v^pczG#b z^dP@5Zo(VwD<}`u-KdIN=*!9#6s_3cd$_%X&yR0ai+E(1;Q5?zapMZ^*XMIm%c1W_ zS1=@p`Ps=w=!L`lBdeXS3FSQE@cN=s;N6f}z{%r^o1;Z7VXh$NUKi$E_Y14uJ{IQk z@4JfMwod0hG8=i@?DLN}yyA{pe(fwOj#sz=_o(3=Kgx3^>uZOv9-jF|Ot2(9PhEX# zW=MmCbF0XA{Oa*=L0wv`M7pC_kIp(NDB(GB^~lW2I>eFYId=8fY)!l(Z;t^L#ZQF^ zq3-v-aq}CI(zWxQ3w5`S!W<&v-m${v@rL*ss@|cihoC@3?#MKZJ8R(s2)b_ap$_5P z+OLIG#htc2hH2+);j9?i^4_kSyKaomjYDcuH~-xGuY`-YNAgje4aJpGaf!Aw&jYnp zxYk%JZRQ(syLmtA?wYNi4TKK9ckJe|NJ;a2!-8?4d%=3EEnKoIQm}i4Gh-PQ@O(f2 zIYzLb|H4ti*M82yiElOW1(m83k;W%+OC4VjcMTf&9kZRGy7!uH zHqC7fZHN>$$2kIqw{)y9PrS#J$CrhkildXt<_~`K)GgH;K5&Zqtt`G~7k}UZOhQa} zV>a5|aSQpZoIUT&=IhOI8+}1yShHd$-xWTOf0_?DUArF z46@o&9udl8LSalOj#oKbX~^8+qLxVh+7-^p8&>KKSP7_h)f0S}D~nZbhkL)G`lf$w z%lEH*f8VVwxBLscKKxd6-Tp|${xDaHA0pbYX`$e!CBIwpdu1Pjd*`*Dwy3CHI>Cp_&_I`Y;g;GpIbSz zdv4C!Zj72X z#oZKEhGbqK)O0%DK#>}8*`+#a@g~Zx znR45+%)x)qNXR}EfjApi${YRUq|uQYw^}XE*W0m88sb>Z=iUs$#`uPZ{zBC zn<(C97LTSxd<(_fs>N%HxSPT)Pex4#^CF%^|S%e%qVW2eI;Dfgv|gG-{px_ zuZdOG!pJRFUW5Pli_6}YVx?68Jj%DZ%%2x>u9{dWesOCLTvREyKIZVmEy9`{)TOeO zCHKHQE>>Lks3H#usySy(5?Wr3JM3{)Ct^HuTAk+4x7C#ZAGjYL=goG*Rm+zvPa8OM PH_s$8_o|AYYq0*mwY^Wb diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/history.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/history.cpython-312.pyc deleted file mode 100644 index 8cf0ca72619ea67ec889f8121701c2cf55e90788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41405 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 G`u_oDjC9Zd diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/historyapp.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/historyapp.cpython-312.pyc deleted file mode 100644 index cd59e16d6a9dff6677fcf564f1a22eb4779c2a48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7625 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 ISw;l^7u>gtsQ>@~ diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer2.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/inputtransformer2.cpython-312.pyc deleted file mode 100644 index b556a35b9fb9ab91998771f70bd9051091170183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35719 zcmdVD3v?UTnI>3;2k|5Uz8~VFNQx#QQlvz^DC$Xx)WepjrxTl&LP11{1Vs{50klL0 zj2XAn0b})uinDE~lZ>J6o-sZ4naHy_6K5wg?PRi>oij6i08wtjXzgjaCwor&oY`IK z(Vetb?ZL<`@ipB|2{w8F5svaZw_w>3c`P)AKKwo zFCIpWg7CKB69xpI=rfFo10v4GF~hiVz&LIiFo`_hJYZ(`^9J(R*)m|k*)(Pyw+-0F z?F064$ADwpIp9>w=MUuLzIm)*+%@151%n`)M9a5IeUbkfDD+w05C)2TR;0xS z;h^BNy&?GQ?;F(nC8&e`a@XU~>UnAjr&i*Fe7(-nXVzJOceSP4s$FSMYxND3`&?*q zh0iTJwNb3 z4{TxeZ9;vUGwR#w+alZKZR$L1#Rzx#wjswds${mGU#q3MP^#OvUEYS->c;gB-;RNu ztoEI#eV0BjyL`JbCcD|4J-D-1HtDmohvoJlcb{z3bN9;P=<83ucVHiSy;t7%!G0Zz z_D>r;z1}TY4u>Zur$SOl@lFIU1e9@Ek;c74BmN0lnU+EUDL6Gb8Bjvf;p5Yxk-&r$ zoRo+B-Z3dSJrVL=X}8-?kNAUa6p*k(U>u0A*&49Vk}xhOg!k4^4D-lZwD%0DsOCQT}V@yU=B3@QG} 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ⅈ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 Bp}+tD diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/interactiveshell.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/interactiveshell.cpython-312.pyc deleted file mode 100644 index 67ca9b00cb4b3d06f6ddce8887cceee42bc3be65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151879 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�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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/magic.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/magic.cpython-312.pyc deleted file mode 100644 index 8306380d1fd8daa797a23f11fdb7caf9e33f71ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28119 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

4p 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 cc5e#wve{B4HY`0)9}N#%#9;H=J|@~ diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/oinspect.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/oinspect.cpython-312.pyc deleted file mode 100644 index 352d26c477f7fef7407288bf39ebc0bfecb4088e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43670 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%0DaZhZ*oYH+Pj|H&3HXpn-y6E~1mJjQi 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 aM(raGKfibouSNIAN$T>$T_s0aP5&PNRn2z* diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/page.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/page.cpython-312.pyc deleted file mode 100644 index 58a3cdae58268ced23fd94dbe214b6740b206941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12704 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 SSpLxFv)4RqvfJy}xBVB~bBHwn diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/payload.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/payload.cpython-312.pyc deleted file mode 100644 index 049723ec30daf47f64486159542977afb5314194..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1826 zcmZ`(%}*Og6rZuz9~c`NLL#tDJ0XO|X=*DpZKa4r{U8ZQg`$>9m6di`cE|R@de@y< zo7yrGs)$6SR)O{aN01`55tsfMm3jfus$`WOs+@YGadOG2Z+2}HP&?ATc{6X`d%yj? zH}h*O7C|u1;qCmBAVN>XqBR0drST3Z8%RT0q+!ix;G!?NRw8O z7NEWzzvq_?RD-EdZG2j(8kV9FUgb6|lAOiJ#B|jzSY|pBdA|$_GWhLsT0S${&T2S+?;A~Lyub^y5{7N=l4WvR&R}=oEVk&^b3Ckt# zf7DhM5ln(ltQ)`!WVD+Z5UOL_Ck}|Q)6{sE-J%vqtm7IG-@^0_uKU=S=BwihV(-;~ z?tbuG^4lRd1c*AC54ZHAx#d5GzBrH29mupKEd?M>pn^F5wzCeph*bA4Tts50w~qfi zQe6^!U{v)>|C4LJ^C)jitK${|;hB7A+~ty{*p%1>N_dH?dQPVrnT0)N zmNeNUy6M`FvkeVGnqwkI6jEZeqFZI&_FB~Kf)`gQLU60hR7&XA&=8zJE0I~Qn|XuI z5}lJ7R;HKR@pPLk>V`q)0AYo)MW)*}HDRwA(4>pRGHJT)P`h+fQ42?z!GV%uncE_S zLNr~qFO$4wUn3Wo6ZD`=rGidG2MpX+OqDv4IOTNAR7>orM`AUUq8I4vlHsy9{foIYc zYF09aK9?!E_wB9pm5~ew+;5f?bphI$XPP%Lqgsq+nzcxms!mK0LR-CFOP;99G3#pp zh2I6SjGlF&SK^yP52W9^FFfu^>?X&5xw@D9c)w?QH#+@S=c%>A*3jPB;e#{%n-|x= zT)p+Ue{k#SkJq=a@AqGMiu|#}dSDH&jU1d#Y_jifY|Z`Dw{85K+aDf1c>RsFv5m>~ z$*psHy+eN1K=J)Vm1Arj4eF0%1boX+`LD>*Z4fDzI zDSC*f9%8o)Fm;2S3rE6wK{`=J6|GH2;shNp8%Km^6vQ$*=staa>E6(#1q~x*`b*7Y%Y3J%XYS{_y$o_^P%q4K$=vf%8v?abTbk#DRq8E8N7L3CXf% zseom`W{Peb)aGf`ef67@_xLkGpwrPlWL=hB(a&f0SQ+t#BVa<%4 zII!qImJ^({YHvYlTn;y+Bw4`Z)-RtC<_%*6Uk?_7AcpX>&eQGt+>zUx)^4t#E@FfoiXZD7+{Wu34CnwhpryR9}D zuokLOt1*zf?NFcBDQqRFk{Vnk(}9vQX+~iJ2Rsq^t!5Al##O5u%f#g8T`jc@b!W@g zb48!Cp!?d$n1u-_E{cp>T=7^MpvK->I~V&2paJVU2%e>i#bGShL>L%rw1DM9!%S-7 ztfC9golL(Y*{Yu@Zg``}!icY&KkeP!SGgo8eO|O!bWByPf z(OE6jSQnmHFF>5l7tPy@d4ddO^*t3D*({E|D#n58C~S^wZknKM)^dvMfKyvWk;4AU zs>NN6Usyemr=R%kG?xBOuP22sWY0HJo6fHG8$Fry{3yKd=acbP_8s;q`Bqeyv_T zo?rUP`D5YAH{D<6uYc*BTzuhp{>9_^rQ?f>XH{pucJTgbjkvWZ&hlet`H8dg*jf3$ z`kV8{7-EwEmx*9W@i*RrWqNLRCeO*l6SSbC^QjS~{7D%SIyJQe(!^+1`i|%Bi`(m4 zAFjW5>+bsPRR$f;bUWQ^h6#`ZOtE&F?&kA!2RV%*=#{CtD&8N)H7g3(zydb%%0Yy@ zo%R#k5m7Xu+(u^*NXU+o0f!dOJwFBn_rgv?!!w4tUt4(&56nCU z+rA#PoNaneHnYbSKxpaA!Cf{t4c2a64F}%haGPMY6w)B6%)hl4aM_gZn1$qIv ztbeib*~Td;EzX>gk~{lvg}9BArI!yr_J5hQ6Va^|jjb))doq0D-MK_W+)m1PdW{p0lWlHIv9W21A8(Ao>;M1& diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/prefilter.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/prefilter.cpython-312.pyc deleted file mode 100644 index e4403a17414d7ec6cc776bf99c64c99297694d13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28502 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 QNbk7H>MUuYnql<+1FVf>vj6}9 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/profileapp.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/profileapp.cpython-312.pyc deleted file mode 100644 index c9c13310043ff0356a608971b7098a6edf2a5f2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13228 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 O^NZCjeYpnNHO$RG|F+O+FZOGqW3c zvj+}21ho_phoq;1RH;JwQ+f#k31o5OAAl@eIPsqC-Go(nTL0$b=lAB#?>+B-2M?AB z*g5)S`L;pG8(fU7R7^%^VX{d$sS|_TAe^ofZV0+<=6u~qOwSq|x-O#5vMWV9?h9TH z$5C*k#bR_3CYwZ%I)!Kkr*)GX>!faR6R^ZBK%18UXA;|+NoRiw2FVZopw$bs7;OC7 zh?EPzo)X+$iX}enKx;f#X$gaJS0mkU(L*R#Hv;W;1iY+ccTu>#E{8b0?1BN4(K>32 zuU*v(8*YFe!VP;;iVo1gxNyj7ESq=&kE957ER$LYN=*#sRd_}L)Ka3gByET!XAm3!WdUIFA8+}MxGnsZ zK1l6z(f74by4zHKtuH!#zZEU|-9$Iy&V23LE53@f_@*0#&0tw5|Hq#*#t&mD{H~1K zU9D=}By|{zI+12M%Lz<4-*dc(R`839GY$z@@I4OD?= zvsxAM}Nd*;k-Exd5fzp9?x(D#$O z$<~Fxy}!Jj>ilE<@7j~KXVv)~XI{>N+h?NTRZ)`Bd4Nr#CxW67+pvc=mS=n=nwszd zcr?3!LYE@-8ODHs%#TjhG~4|OUQ~ww?vU5jBM+}WTKIi!$C=BMnlvi#lcX-d;!88=`I4!w2-SXx%ZwEi8=RO*bxa(`Y!4UN9(%|iEp0WQS1;{2m$HO! zdJa~q6SM_mDFkfCyw}3{EMvd*f>yzRBs>lolh~RPYbTE&VECsb3zd~!VihvLK2xUw z*2z1AmcFOEwplu}TQ*8pcO6pmeez5R?z>xWU0<)Vy9{>OV diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/pylabtools.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/pylabtools.cpython-312.pyc deleted file mode 100644 index 71a46fd327b8968bc774a9719da9faae4797a15e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17176 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 ZQ`6}3$u}pBrgQJ^`|*YQ)WnGL{{q(TL@odT diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/release.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/release.cpython-312.pyc deleted file mode 100644 index c33494ff649ea34765ec9ec54669730dc3c9d018..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/splitinput.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/splitinput.cpython-312.pyc deleted file mode 100644 index aac67dbfc885a7ac1db662471a1190ca68f0f4a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4967 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 Gss1+u^!M8U diff --git a/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/usage.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/core/__pycache__/usage.cpython-312.pyc deleted file mode 100644 index 72829a94283380e98dd478c3602bf2523f4c28d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13506 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 ZeC4-4`-h)>`C8-amz#h0QuYd1`CnOL9Bu#r diff --git a/.venv/lib/python3.12/site-packages/IPython/core/alias.py b/.venv/lib/python3.12/site-packages/IPython/core/alias.py deleted file mode 100644 index 845e6b7..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/alias.py +++ /dev/null @@ -1,267 +0,0 @@ -# encoding: utf-8 -""" -System command aliases. - -Authors: - -* Fernando Perez -* Brian Granger -""" - -#----------------------------------------------------------------------------- -# Copyright (C) 2008-2011 The IPython Development Team -# -# Distributed under the terms of the BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -import os -import re -import sys - -from traitlets.config.configurable import Configurable -from .error import UsageError - -from traitlets import List, Instance -from logging import error - -import typing as t - - -#----------------------------------------------------------------------------- -# Utilities -#----------------------------------------------------------------------------- - -# This is used as the pattern for calls to split_user_input. -shell_line_split = re.compile(r'^(\s*)()(\S+)(.*$)') - -def default_aliases() -> t.List[t.Tuple[str, str]]: - """Return list of shell aliases to auto-define. - """ - # Note: the aliases defined here should be safe to use on a kernel - # regardless of what frontend it is attached to. Frontends that use a - # kernel in-process can define additional aliases that will only work in - # their case. For example, things like 'less' or 'clear' that manipulate - # the terminal should NOT be declared here, as they will only work if the - # kernel is running inside a true terminal, and not over the network. - - if os.name == 'posix': - default_aliases = [('mkdir', 'mkdir'), ('rmdir', 'rmdir'), - ('mv', 'mv'), ('rm', 'rm'), ('cp', 'cp'), - ('cat', 'cat'), - ] - # Useful set of ls aliases. The GNU and BSD options are a little - # different, so we make aliases that provide as similar as possible - # behavior in ipython, by passing the right flags for each platform - if sys.platform.startswith('linux'): - ls_aliases = [('ls', 'ls -F --color'), - # long ls - ('ll', 'ls -F -o --color'), - # ls normal files only - ('lf', 'ls -F -o --color %l | grep ^-'), - # ls symbolic links - ('lk', 'ls -F -o --color %l | grep ^l'), - # directories or links to directories, - ('ldir', 'ls -F -o --color %l | grep /$'), - # things which are executable - ('lx', 'ls -F -o --color %l | grep ^-..x'), - ] - elif sys.platform.startswith('openbsd') or sys.platform.startswith('netbsd'): - # OpenBSD, NetBSD. The ls implementation on these platforms do not support - # the -G switch and lack the ability to use colorized output. - ls_aliases = [('ls', 'ls -F'), - # long ls - ('ll', 'ls -F -l'), - # ls normal files only - ('lf', 'ls -F -l %l | grep ^-'), - # ls symbolic links - ('lk', 'ls -F -l %l | grep ^l'), - # directories or links to directories, - ('ldir', 'ls -F -l %l | grep /$'), - # things which are executable - ('lx', 'ls -F -l %l | grep ^-..x'), - ] - else: - # BSD, OSX, etc. - ls_aliases = [('ls', 'ls -F -G'), - # long ls - ('ll', 'ls -F -l -G'), - # ls normal files only - ('lf', 'ls -F -l -G %l | grep ^-'), - # ls symbolic links - ('lk', 'ls -F -l -G %l | grep ^l'), - # directories or links to directories, - ('ldir', 'ls -F -G -l %l | grep /$'), - # things which are executable - ('lx', 'ls -F -l -G %l | grep ^-..x'), - ] - default_aliases = default_aliases + ls_aliases - elif os.name in ['nt', 'dos']: - default_aliases = [('ls', 'dir /on'), - ('ddir', 'dir /ad /on'), ('ldir', 'dir /ad /on'), - ('mkdir', 'mkdir'), ('rmdir', 'rmdir'), - ('echo', 'echo'), ('ren', 'ren'), ('copy', 'copy'), - ] - else: - default_aliases = [] - - return default_aliases - - -class AliasError(Exception): - pass - - -class InvalidAliasError(AliasError): - pass - -class Alias(object): - """Callable object storing the details of one alias. - - Instances are registered as magic functions to allow use of aliases. - """ - - # Prepare blacklist - blacklist = {'cd','popd','pushd','dhist','alias','unalias'} - - def __init__(self, shell, name, cmd): - self.shell = shell - self.name = name - self.cmd = cmd - self.__doc__ = "Alias for `!{}`".format(cmd) - self.nargs = self.validate() - - def validate(self): - """Validate the alias, and return the number of arguments.""" - if self.name in self.blacklist: - raise InvalidAliasError("The name %s can't be aliased " - "because it is a keyword or builtin." % self.name) - try: - caller = self.shell.magics_manager.magics['line'][self.name] - except KeyError: - pass - else: - if not isinstance(caller, Alias): - raise InvalidAliasError("The name %s can't be aliased " - "because it is another magic command." % self.name) - - if not (isinstance(self.cmd, str)): - raise InvalidAliasError("An alias command must be a string, " - "got: %r" % self.cmd) - - nargs = self.cmd.count('%s') - self.cmd.count('%%s') - - if (nargs > 0) and (self.cmd.find('%l') >= 0): - raise InvalidAliasError('The %s and %l specifiers are mutually ' - 'exclusive in alias definitions.') - - return nargs - - def __repr__(self): - return "".format(self.name, self.cmd) - - def __call__(self, rest=''): - cmd = self.cmd - nargs = self.nargs - # Expand the %l special to be the user's input line - if cmd.find('%l') >= 0: - cmd = cmd.replace('%l', rest) - rest = '' - - if nargs==0: - if cmd.find('%%s') >= 1: - cmd = cmd.replace('%%s', '%s') - # Simple, argument-less aliases - cmd = '%s %s' % (cmd, rest) - else: - # Handle aliases with positional arguments - args = rest.split(None, nargs) - if len(args) < nargs: - raise UsageError('Alias <%s> requires %s arguments, %s given.' % - (self.name, nargs, len(args))) - cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:])) - - self.shell.system(cmd) - -#----------------------------------------------------------------------------- -# Main AliasManager class -#----------------------------------------------------------------------------- - -class AliasManager(Configurable): - default_aliases: List = List(default_aliases()).tag(config=True) - user_aliases: List = List(default_value=[]).tag(config=True) - shell = Instance( - "IPython.core.interactiveshell.InteractiveShellABC", allow_none=True - ) - - def __init__(self, shell=None, **kwargs): - super(AliasManager, self).__init__(shell=shell, **kwargs) - # For convenient access - if self.shell is not None: - self.linemagics = self.shell.magics_manager.magics["line"] - self.init_aliases() - - def init_aliases(self): - # Load default & user aliases - for name, cmd in self.default_aliases + self.user_aliases: - if ( - cmd.startswith("ls ") - and self.shell is not None - and self.shell.colors == "NoColor" - ): - cmd = cmd.replace(" --color", "") - self.soft_define_alias(name, cmd) - - @property - def aliases(self): - return [(n, func.cmd) for (n, func) in self.linemagics.items() - if isinstance(func, Alias)] - - def soft_define_alias(self, name, cmd): - """Define an alias, but don't raise on an AliasError.""" - try: - self.define_alias(name, cmd) - except AliasError as e: - error("Invalid alias: %s" % e) - - def define_alias(self, name, cmd): - """Define a new alias after validating it. - - This will raise an :exc:`AliasError` if there are validation - problems. - """ - caller = Alias(shell=self.shell, name=name, cmd=cmd) - self.shell.magics_manager.register_function(caller, magic_kind='line', - magic_name=name) - - def get_alias(self, name): - """Return an alias, or None if no alias by that name exists.""" - aname = self.linemagics.get(name, None) - return aname if isinstance(aname, Alias) else None - - def is_alias(self, name): - """Return whether or not a given name has been defined as an alias""" - return self.get_alias(name) is not None - - def undefine_alias(self, name): - if self.is_alias(name): - del self.linemagics[name] - else: - raise ValueError('%s is not an alias' % name) - - def clear_aliases(self): - for name, _ in self.aliases: - self.undefine_alias(name) - - def retrieve_alias(self, name): - """Retrieve the command to which an alias expands.""" - caller = self.get_alias(name) - if caller: - return caller.cmd - else: - raise ValueError('%s is not an alias' % name) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/application.py b/.venv/lib/python3.12/site-packages/IPython/core/application.py deleted file mode 100644 index 841e867..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/application.py +++ /dev/null @@ -1,492 +0,0 @@ -# encoding: utf-8 -""" -An application for IPython. - -All top-level applications should use the classes in this module for -handling configuration and creating configurables. - -The job of an :class:`Application` is to create the master configuration -object and then create the configurable objects, passing the config to them. -""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - -import atexit -from copy import deepcopy -import logging -import os -import shutil -import sys - -from pathlib import Path - -from traitlets.config.application import Application, catch_config_error -from traitlets.config.loader import ConfigFileNotFound, PyFileConfigLoader -from IPython.core import release, crashhandler -from IPython.core.profiledir import ProfileDir, ProfileDirError -from IPython.paths import get_ipython_dir, get_ipython_package_dir -from IPython.utils.path import ensure_dir_exists -from traitlets import ( - List, Unicode, Type, Bool, Set, Instance, Undefined, - default, observe, -) - -if os.name == "nt": - programdata = os.environ.get("PROGRAMDATA", None) - if programdata is not None: - SYSTEM_CONFIG_DIRS = [str(Path(programdata) / "ipython")] - else: # PROGRAMDATA is not defined by default on XP. - SYSTEM_CONFIG_DIRS = [] -else: - SYSTEM_CONFIG_DIRS = [ - "/usr/local/etc/ipython", - "/etc/ipython", - ] - - -ENV_CONFIG_DIRS = [] -_env_config_dir = os.path.join(sys.prefix, 'etc', 'ipython') -if _env_config_dir not in SYSTEM_CONFIG_DIRS: - # only add ENV_CONFIG if sys.prefix is not already included - ENV_CONFIG_DIRS.append(_env_config_dir) - - -_envvar = os.environ.get('IPYTHON_SUPPRESS_CONFIG_ERRORS') -if _envvar in {None, ''}: - IPYTHON_SUPPRESS_CONFIG_ERRORS = None -else: - if _envvar.lower() in {'1','true'}: - IPYTHON_SUPPRESS_CONFIG_ERRORS = True - elif _envvar.lower() in {'0','false'} : - IPYTHON_SUPPRESS_CONFIG_ERRORS = False - else: - sys.exit("Unsupported value for environment variable: 'IPYTHON_SUPPRESS_CONFIG_ERRORS' is set to '%s' which is none of {'0', '1', 'false', 'true', ''}."% _envvar ) - -# aliases and flags - -base_aliases = {} -if isinstance(Application.aliases, dict): - # traitlets 5 - base_aliases.update(Application.aliases) -base_aliases.update( - { - "profile-dir": "ProfileDir.location", - "profile": "BaseIPythonApplication.profile", - "ipython-dir": "BaseIPythonApplication.ipython_dir", - "log-level": "Application.log_level", - "config": "BaseIPythonApplication.extra_config_file", - } -) - -base_flags = dict() -if isinstance(Application.flags, dict): - # traitlets 5 - base_flags.update(Application.flags) -base_flags.update( - dict( - debug=( - {"Application": {"log_level": logging.DEBUG}}, - "set log level to logging.DEBUG (maximize logging output)", - ), - quiet=( - {"Application": {"log_level": logging.CRITICAL}}, - "set log level to logging.CRITICAL (minimize logging output)", - ), - init=( - { - "BaseIPythonApplication": { - "copy_config_files": True, - "auto_create": True, - } - }, - """Initialize profile with default config files. This is equivalent - to running `ipython profile create ` prior to startup. - """, - ), - ) -) - - -class ProfileAwareConfigLoader(PyFileConfigLoader): - """A Python file config loader that is aware of IPython profiles.""" - def load_subconfig(self, fname, path=None, profile=None): - if profile is not None: - try: - profile_dir = ProfileDir.find_profile_dir_by_name( - get_ipython_dir(), - profile, - ) - except ProfileDirError: - return - path = profile_dir.location - return super(ProfileAwareConfigLoader, self).load_subconfig(fname, path=path) - -class BaseIPythonApplication(Application): - name = "ipython" - description = "IPython: an enhanced interactive Python shell." - version = Unicode(release.version) - - aliases = base_aliases - flags = base_flags - classes = List([ProfileDir]) - - # enable `load_subconfig('cfg.py', profile='name')` - python_config_loader_class = ProfileAwareConfigLoader - - # Track whether the config_file has changed, - # because some logic happens only if we aren't using the default. - config_file_specified = Set() - - config_file_name = Unicode() - @default('config_file_name') - def _config_file_name_default(self): - return self.name.replace('-','_') + u'_config.py' - @observe('config_file_name') - def _config_file_name_changed(self, change): - if change['new'] != change['old']: - self.config_file_specified.add(change['new']) - - # The directory that contains IPython's builtin profiles. - builtin_profile_dir = Unicode( - os.path.join(get_ipython_package_dir(), u'config', u'profile', u'default') - ) - - config_file_paths = List(Unicode()) - @default('config_file_paths') - def _config_file_paths_default(self): - return [] - - extra_config_file = Unicode( - help="""Path to an extra config file to load. - - If specified, load this config file in addition to any other IPython config. - """).tag(config=True) - @observe('extra_config_file') - def _extra_config_file_changed(self, change): - old = change['old'] - new = change['new'] - try: - self.config_files.remove(old) - except ValueError: - pass - self.config_file_specified.add(new) - self.config_files.append(new) - - profile = Unicode(u'default', - help="""The IPython profile to use.""" - ).tag(config=True) - - @observe('profile') - def _profile_changed(self, change): - self.builtin_profile_dir = os.path.join( - get_ipython_package_dir(), u'config', u'profile', change['new'] - ) - - add_ipython_dir_to_sys_path = Bool( - False, - """Should the IPython profile directory be added to sys path ? - - This option was non-existing before IPython 8.0, and ipython_dir was added to - sys path to allow import of extensions present there. This was historical - baggage from when pip did not exist. This now default to false, - but can be set to true for legacy reasons. - """, - ).tag(config=True) - - ipython_dir = Unicode( - help=""" - The name of the IPython directory. This directory is used for logging - configuration (through profiles), history storage, etc. The default - is usually $HOME/.ipython. This option can also be specified through - the environment variable IPYTHONDIR. - """ - ).tag(config=True) - @default('ipython_dir') - def _ipython_dir_default(self): - d = get_ipython_dir() - self._ipython_dir_changed({ - 'name': 'ipython_dir', - 'old': d, - 'new': d, - }) - return d - - _in_init_profile_dir = False - - profile_dir = Instance(ProfileDir, allow_none=True) - - @default('profile_dir') - def _profile_dir_default(self): - # avoid recursion - if self._in_init_profile_dir: - return - # profile_dir requested early, force initialization - self.init_profile_dir() - return self.profile_dir - - overwrite = Bool(False, - help="""Whether to overwrite existing config files when copying""" - ).tag(config=True) - - auto_create = Bool(False, - help="""Whether to create profile dir if it doesn't exist""" - ).tag(config=True) - - config_files = List(Unicode()) - - @default('config_files') - def _config_files_default(self): - return [self.config_file_name] - - copy_config_files = Bool(False, - help="""Whether to install the default config files into the profile dir. - If a new profile is being created, and IPython contains config files for that - profile, then they will be staged into the new directory. Otherwise, - default config files will be automatically generated. - """).tag(config=True) - - verbose_crash = Bool(False, - help="""Create a massive crash report when IPython encounters what may be an - internal error. The default is to append a short message to the - usual traceback""").tag(config=True) - - # The class to use as the crash handler. - crash_handler_class = Type(crashhandler.CrashHandler) - - @catch_config_error - def __init__(self, **kwargs): - super(BaseIPythonApplication, self).__init__(**kwargs) - # ensure current working directory exists - try: - os.getcwd() - except: - # exit if cwd doesn't exist - self.log.error("Current working directory doesn't exist.") - self.exit(1) - - #------------------------------------------------------------------------- - # Various stages of Application creation - #------------------------------------------------------------------------- - - def init_crash_handler(self): - """Create a crash handler, typically setting sys.excepthook to it.""" - self.crash_handler = self.crash_handler_class(self) - sys.excepthook = self.excepthook - def unset_crashhandler(): - sys.excepthook = sys.__excepthook__ - atexit.register(unset_crashhandler) - - def excepthook(self, etype, evalue, tb): - """this is sys.excepthook after init_crashhandler - - set self.verbose_crash=True to use our full crashhandler, instead of - a regular traceback with a short message (crash_handler_lite) - """ - - if self.verbose_crash: - return self.crash_handler(etype, evalue, tb) - else: - return crashhandler.crash_handler_lite(etype, evalue, tb) - - @observe('ipython_dir') - def _ipython_dir_changed(self, change): - old = change['old'] - new = change['new'] - if old is not Undefined: - str_old = os.path.abspath(old) - if str_old in sys.path: - sys.path.remove(str_old) - if self.add_ipython_dir_to_sys_path: - str_path = os.path.abspath(new) - sys.path.append(str_path) - ensure_dir_exists(new) - readme = os.path.join(new, "README") - readme_src = os.path.join( - get_ipython_package_dir(), "config", "profile", "README" - ) - if not os.path.exists(readme) and os.path.exists(readme_src): - shutil.copy(readme_src, readme) - for d in ("extensions", "nbextensions"): - path = os.path.join(new, d) - try: - ensure_dir_exists(path) - except OSError as e: - # this will not be EEXIST - self.log.error("couldn't create path %s: %s", path, e) - self.log.debug("IPYTHONDIR set to: %s", new) - - def load_config_file(self, suppress_errors=IPYTHON_SUPPRESS_CONFIG_ERRORS): - """Load the config file. - - By default, errors in loading config are handled, and a warning - printed on screen. For testing, the suppress_errors option is set - to False, so errors will make tests fail. - - `suppress_errors` default value is to be `None` in which case the - behavior default to the one of `traitlets.Application`. - - The default value can be set : - - to `False` by setting 'IPYTHON_SUPPRESS_CONFIG_ERRORS' environment variable to '0', or 'false' (case insensitive). - - to `True` by setting 'IPYTHON_SUPPRESS_CONFIG_ERRORS' environment variable to '1' or 'true' (case insensitive). - - to `None` by setting 'IPYTHON_SUPPRESS_CONFIG_ERRORS' environment variable to '' (empty string) or leaving it unset. - - Any other value are invalid, and will make IPython exit with a non-zero return code. - """ - - - self.log.debug("Searching path %s for config files", self.config_file_paths) - base_config = 'ipython_config.py' - self.log.debug("Attempting to load config file: %s" % - base_config) - try: - if suppress_errors is not None: - old_value = Application.raise_config_file_errors - Application.raise_config_file_errors = not suppress_errors; - Application.load_config_file( - self, - base_config, - path=self.config_file_paths - ) - except ConfigFileNotFound: - # ignore errors loading parent - self.log.debug("Config file %s not found", base_config) - pass - if suppress_errors is not None: - Application.raise_config_file_errors = old_value - - for config_file_name in self.config_files: - if not config_file_name or config_file_name == base_config: - continue - self.log.debug("Attempting to load config file: %s" % - self.config_file_name) - try: - Application.load_config_file( - self, - config_file_name, - path=self.config_file_paths - ) - except ConfigFileNotFound: - # Only warn if the default config file was NOT being used. - if config_file_name in self.config_file_specified: - msg = self.log.warning - else: - msg = self.log.debug - msg("Config file not found, skipping: %s", config_file_name) - except Exception: - # For testing purposes. - if not suppress_errors: - raise - self.log.warning("Error loading config file: %s" % - self.config_file_name, exc_info=True) - - def init_profile_dir(self): - """initialize the profile dir""" - self._in_init_profile_dir = True - if self.profile_dir is not None: - # already ran - return - if 'ProfileDir.location' not in self.config: - # location not specified, find by profile name - try: - p = ProfileDir.find_profile_dir_by_name(self.ipython_dir, self.profile, self.config) - except ProfileDirError: - # not found, maybe create it (always create default profile) - if self.auto_create or self.profile == 'default': - try: - p = ProfileDir.create_profile_dir_by_name(self.ipython_dir, self.profile, self.config) - except ProfileDirError: - self.log.fatal("Could not create profile: %r"%self.profile) - self.exit(1) - else: - self.log.info("Created profile dir: %r"%p.location) - else: - self.log.fatal("Profile %r not found."%self.profile) - self.exit(1) - else: - self.log.debug("Using existing profile dir: %r", p.location) - else: - location = self.config.ProfileDir.location - # location is fully specified - try: - p = ProfileDir.find_profile_dir(location, self.config) - except ProfileDirError: - # not found, maybe create it - if self.auto_create: - try: - p = ProfileDir.create_profile_dir(location, self.config) - except ProfileDirError: - self.log.fatal("Could not create profile directory: %r"%location) - self.exit(1) - else: - self.log.debug("Creating new profile dir: %r"%location) - else: - self.log.fatal("Profile directory %r not found."%location) - self.exit(1) - else: - self.log.debug("Using existing profile dir: %r", p.location) - # if profile_dir is specified explicitly, set profile name - dir_name = os.path.basename(p.location) - if dir_name.startswith('profile_'): - self.profile = dir_name[8:] - - self.profile_dir = p - self.config_file_paths.append(p.location) - self._in_init_profile_dir = False - - def init_config_files(self): - """[optionally] copy default config files into profile dir.""" - self.config_file_paths.extend(ENV_CONFIG_DIRS) - self.config_file_paths.extend(SYSTEM_CONFIG_DIRS) - # copy config files - path = Path(self.builtin_profile_dir) - if self.copy_config_files: - src = self.profile - - cfg = self.config_file_name - if path and (path / cfg).exists(): - self.log.warning( - "Staging %r from %s into %r [overwrite=%s]" - % (cfg, src, self.profile_dir.location, self.overwrite) - ) - self.profile_dir.copy_config_file(cfg, path=path, overwrite=self.overwrite) - else: - self.stage_default_config_file() - else: - # Still stage *bundled* config files, but not generated ones - # This is necessary for `ipython profile=sympy` to load the profile - # on the first go - files = path.glob("*.py") - for fullpath in files: - cfg = fullpath.name - if self.profile_dir.copy_config_file(cfg, path=path, overwrite=False): - # file was copied - self.log.warning("Staging bundled %s from %s into %r"%( - cfg, self.profile, self.profile_dir.location) - ) - - - def stage_default_config_file(self): - """auto generate default config file, and stage it into the profile.""" - s = self.generate_config_file() - config_file = Path(self.profile_dir.location) / self.config_file_name - if self.overwrite or not config_file.exists(): - self.log.warning("Generating default config file: %r", (config_file)) - config_file.write_text(s, encoding="utf-8") - - @catch_config_error - def initialize(self, argv=None): - # don't hook up crash handler before parsing command-line - self.parse_command_line(argv) - self.init_crash_handler() - if self.subapp is not None: - # stop here if subapp is taking over - return - # save a copy of CLI config to re-load after config files - # so that it has highest priority - cl_config = deepcopy(self.config) - self.init_profile_dir() - self.init_config_files() - self.load_config_file() - # enforce cl-opts override configfile opts: - self.update_config(cl_config) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/async_helpers.py b/.venv/lib/python3.12/site-packages/IPython/core/async_helpers.py deleted file mode 100644 index 4dfac54..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/async_helpers.py +++ /dev/null @@ -1,155 +0,0 @@ -""" -Async helper function that are invalid syntax on Python 3.5 and below. - -This code is best effort, and may have edge cases not behaving as expected. In -particular it contain a number of heuristics to detect whether code is -effectively async and need to run in an event loop or not. - -Some constructs (like top-level `return`, or `yield`) are taken care of -explicitly to actually raise a SyntaxError and stay as close as possible to -Python semantics. -""" - -import ast -import asyncio -import inspect -from functools import wraps - -_asyncio_event_loop = None - - -def get_asyncio_loop(): - """asyncio has deprecated get_event_loop - - Replicate it here, with our desired semantics: - - - always returns a valid, not-closed loop - - not thread-local like asyncio's, - because we only want one loop for IPython - - if called from inside a coroutine (e.g. in ipykernel), - return the running loop - - .. versionadded:: 8.0 - """ - try: - return asyncio.get_running_loop() - except RuntimeError: - # not inside a coroutine, - # track our own global - pass - - # not thread-local like asyncio's, - # because we only track one event loop to run for IPython itself, - # always in the main thread. - global _asyncio_event_loop - if _asyncio_event_loop is None or _asyncio_event_loop.is_closed(): - _asyncio_event_loop = asyncio.new_event_loop() - return _asyncio_event_loop - - -class _AsyncIORunner: - def __call__(self, coro): - """ - Handler for asyncio autoawait - """ - return get_asyncio_loop().run_until_complete(coro) - - def __str__(self): - return "asyncio" - - -_asyncio_runner = _AsyncIORunner() - - -class _AsyncIOProxy: - """Proxy-object for an asyncio - - Any coroutine methods will be wrapped in event_loop.run_ - """ - - def __init__(self, obj, event_loop): - self._obj = obj - self._event_loop = event_loop - - def __repr__(self): - return f"<_AsyncIOProxy({self._obj!r})>" - - def __getattr__(self, key): - attr = getattr(self._obj, key) - if inspect.iscoroutinefunction(attr): - # if it's a coroutine method, - # return a threadsafe wrapper onto the _current_ asyncio loop - @wraps(attr) - def _wrapped(*args, **kwargs): - concurrent_future = asyncio.run_coroutine_threadsafe( - attr(*args, **kwargs), self._event_loop - ) - return asyncio.wrap_future(concurrent_future) - - return _wrapped - else: - return attr - - def __dir__(self): - return dir(self._obj) - - -def _curio_runner(coroutine): - """ - handler for curio autoawait - """ - import curio - - return curio.run(coroutine) - - -def _trio_runner(async_fn): - import trio - - async def loc(coro): - """ - We need the dummy no-op async def to protect from - trio's internal. See https://github.com/python-trio/trio/issues/89 - """ - return await coro - - return trio.run(loc, async_fn) - - -def _pseudo_sync_runner(coro): - """ - A runner that does not really allow async execution, and just advance the coroutine. - - See discussion in https://github.com/python-trio/trio/issues/608, - - Credit to Nathaniel Smith - """ - try: - coro.send(None) - except StopIteration as exc: - return exc.value - else: - # TODO: do not raise but return an execution result with the right info. - raise RuntimeError( - "{coro_name!r} needs a real async loop".format(coro_name=coro.__name__) - ) - - -def _should_be_async(cell: str) -> bool: - """Detect if a block of code need to be wrapped in an `async def` - - Attempt to parse the block of code, it it compile we're fine. - Otherwise we wrap if and try to compile. - - If it works, assume it should be async. Otherwise Return False. - - Not handled yet: If the block of code has a return statement as the top - level, it will be seen as async. This is a know limitation. - """ - try: - code = compile( - cell, "<>", "exec", flags=getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0) - ) - return inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE - except (SyntaxError, MemoryError): - return False diff --git a/.venv/lib/python3.12/site-packages/IPython/core/autocall.py b/.venv/lib/python3.12/site-packages/IPython/core/autocall.py deleted file mode 100644 index 54beec3..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/autocall.py +++ /dev/null @@ -1,70 +0,0 @@ -# encoding: utf-8 -""" -Autocall capabilities for IPython.core. - -Authors: - -* Brian Granger -* Fernando Perez -* Thomas Kluyver - -Notes ------ -""" - -#----------------------------------------------------------------------------- -# Copyright (C) 2008-2011 The IPython Development Team -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - - -#----------------------------------------------------------------------------- -# Code -#----------------------------------------------------------------------------- - -class IPyAutocall(object): - """ Instances of this class are always autocalled - - This happens regardless of 'autocall' variable state. Use this to - develop macro-like mechanisms. - """ - _ip = None - rewrite = True - def __init__(self, ip=None): - self._ip = ip - - def set_ip(self, ip): - """Will be used to set _ip point to current ipython instance b/f call - - Override this method if you don't want this to happen. - - """ - self._ip = ip - - -class ExitAutocall(IPyAutocall): - """An autocallable object which will be added to the user namespace so that - exit, exit(), quit or quit() are all valid ways to close the shell.""" - rewrite = False - - def __call__(self): - self._ip.ask_exit() - -class ZMQExitAutocall(ExitAutocall): - """Exit IPython. Autocallable, so it needn't be explicitly called. - - Parameters - ---------- - keep_kernel : bool - If True, leave the kernel alive. Otherwise, tell the kernel to exit too - (default). - """ - def __call__(self, keep_kernel=False): - self._ip.keepkernel_on_exit = keep_kernel - self._ip.ask_exit() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/builtin_trap.py b/.venv/lib/python3.12/site-packages/IPython/core/builtin_trap.py deleted file mode 100644 index a8ea4ab..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/builtin_trap.py +++ /dev/null @@ -1,86 +0,0 @@ -""" -A context manager for managing things injected into :mod:`builtins`. -""" -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. -import builtins as builtin_mod - -from traitlets.config.configurable import Configurable - -from traitlets import Instance - - -class __BuiltinUndefined(object): pass -BuiltinUndefined = __BuiltinUndefined() - -class __HideBuiltin(object): pass -HideBuiltin = __HideBuiltin() - - -class BuiltinTrap(Configurable): - - shell = Instance('IPython.core.interactiveshell.InteractiveShellABC', - allow_none=True) - - def __init__(self, shell=None): - super(BuiltinTrap, self).__init__(shell=shell, config=None) - self._orig_builtins = {} - # We define this to track if a single BuiltinTrap is nested. - # Only turn off the trap when the outermost call to __exit__ is made. - self._nested_level = 0 - self.shell = shell - # builtins we always add - if set to HideBuiltin, they will just - # be removed instead of being replaced by something else - self.auto_builtins = {'exit': HideBuiltin, - 'quit': HideBuiltin, - 'get_ipython': self.shell.get_ipython, - } - - def __enter__(self): - if self._nested_level == 0: - self.activate() - self._nested_level += 1 - # I return self, so callers can use add_builtin in a with clause. - return self - - def __exit__(self, type, value, traceback): - if self._nested_level == 1: - self.deactivate() - self._nested_level -= 1 - # Returning False will cause exceptions to propagate - return False - - def add_builtin(self, key, value): - """Add a builtin and save the original.""" - bdict = builtin_mod.__dict__ - orig = bdict.get(key, BuiltinUndefined) - if value is HideBuiltin: - if orig is not BuiltinUndefined: #same as 'key in bdict' - self._orig_builtins[key] = orig - del bdict[key] - else: - self._orig_builtins[key] = orig - bdict[key] = value - - def remove_builtin(self, key, orig): - """Remove an added builtin and re-set the original.""" - if orig is BuiltinUndefined: - del builtin_mod.__dict__[key] - else: - builtin_mod.__dict__[key] = orig - - def activate(self): - """Store ipython references in the __builtin__ namespace.""" - - add_builtin = self.add_builtin - for name, func in self.auto_builtins.items(): - add_builtin(name, func) - - def deactivate(self): - """Remove any builtins which might have been added by add_builtins, or - restore overwritten ones to their previous values.""" - remove_builtin = self.remove_builtin - for key, val in self._orig_builtins.items(): - remove_builtin(key, val) - self._orig_builtins.clear() - self._builtins_added = False diff --git a/.venv/lib/python3.12/site-packages/IPython/core/compilerop.py b/.venv/lib/python3.12/site-packages/IPython/core/compilerop.py deleted file mode 100644 index 7799a4f..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/compilerop.py +++ /dev/null @@ -1,214 +0,0 @@ -"""Compiler tools with improved interactive support. - -Provides compilation machinery similar to codeop, but with caching support so -we can provide interactive tracebacks. - -Authors -------- -* Robert Kern -* Fernando Perez -* Thomas Kluyver -""" - -# Note: though it might be more natural to name this module 'compiler', that -# name is in the stdlib and name collisions with the stdlib tend to produce -# weird problems (often with third-party tools). - -#----------------------------------------------------------------------------- -# Copyright (C) 2010-2011 The IPython Development Team. -# -# Distributed under the terms of the BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -# Stdlib imports -import __future__ -from ast import PyCF_ONLY_AST -import codeop -import functools -import hashlib -import linecache -import operator -import time -from contextlib import contextmanager - -#----------------------------------------------------------------------------- -# Constants -#----------------------------------------------------------------------------- - -# Roughly equal to PyCF_MASK | PyCF_MASK_OBSOLETE as defined in pythonrun.h, -# this is used as a bitmask to extract future-related code flags. -PyCF_MASK = functools.reduce(operator.or_, - (getattr(__future__, fname).compiler_flag - for fname in __future__.all_feature_names)) - -#----------------------------------------------------------------------------- -# Local utilities -#----------------------------------------------------------------------------- - -def code_name(code, number=0): - """ Compute a (probably) unique name for code for caching. - - This now expects code to be unicode. - """ - hash_digest = hashlib.sha1(code.encode("utf-8")).hexdigest() - # Include the number and 12 characters of the hash in the name. It's - # pretty much impossible that in a single session we'll have collisions - # even with truncated hashes, and the full one makes tracebacks too long - return ''.format(number, hash_digest[:12]) - -#----------------------------------------------------------------------------- -# Classes and functions -#----------------------------------------------------------------------------- - -class CachingCompiler(codeop.Compile): - """A compiler that caches code compiled from interactive statements. - """ - - def __init__(self): - codeop.Compile.__init__(self) - - # Caching a dictionary { filename: execution_count } for nicely - # rendered tracebacks. The filename corresponds to the filename - # argument used for the builtins.compile function. - self._filename_map = {} - - def ast_parse(self, source, filename='', symbol='exec'): - """Parse code to an AST with the current compiler flags active. - - Arguments are exactly the same as ast.parse (in the standard library), - and are passed to the built-in compile function.""" - return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1) - - def reset_compiler_flags(self): - """Reset compiler flags to default state.""" - # This value is copied from codeop.Compile.__init__, so if that ever - # changes, it will need to be updated. - self.flags = codeop.PyCF_DONT_IMPLY_DEDENT - - @property - def compiler_flags(self): - """Flags currently active in the compilation process. - """ - return self.flags - - def get_code_name(self, raw_code, transformed_code, number): - """Compute filename given the code, and the cell number. - - Parameters - ---------- - raw_code : str - The raw cell code. - transformed_code : str - The executable Python source code to cache and compile. - number : int - A number which forms part of the code's name. Used for the execution - counter. - - Returns - ------- - The computed filename. - """ - return code_name(transformed_code, number) - - def format_code_name(self, name): - """Return a user-friendly label and name for a code block. - - Parameters - ---------- - name : str - The name for the code block returned from get_code_name - - Returns - ------- - A (label, name) pair that can be used in tracebacks, or None if the default formatting should be used. - """ - if name in self._filename_map: - return "Cell", "In[%s]" % self._filename_map[name] - - def cache(self, transformed_code, number=0, raw_code=None): - """Make a name for a block of code, and cache the code. - - Parameters - ---------- - transformed_code : str - The executable Python source code to cache and compile. - number : int - A number which forms part of the code's name. Used for the execution - counter. - raw_code : str - The raw code before transformation, if None, set to `transformed_code`. - - Returns - ------- - The name of the cached code (as a string). Pass this as the filename - argument to compilation, so that tracebacks are correctly hooked up. - """ - if raw_code is None: - raw_code = transformed_code - - name = self.get_code_name(raw_code, transformed_code, number) - - # Save the execution count - self._filename_map[name] = number - - # Since Python 2.5, setting mtime to `None` means the lines will - # never be removed by `linecache.checkcache`. This means all the - # monkeypatching has *never* been necessary, since this code was - # only added in 2010, at which point IPython had already stopped - # supporting Python 2.4. - # - # Note that `linecache.clearcache` and `linecache.updatecache` may - # still remove our code from the cache, but those show explicit - # intent, and we should not try to interfere. Normally the former - # is never called except when out of memory, and the latter is only - # called for lines *not* in the cache. - entry = ( - len(transformed_code), - None, - [line + "\n" for line in transformed_code.splitlines()], - name, - ) - linecache.cache[name] = entry - return name - - @contextmanager - def extra_flags(self, flags): - ## bits that we'll set to 1 - turn_on_bits = ~self.flags & flags - - - self.flags = self.flags | flags - try: - yield - finally: - # turn off only the bits we turned on so that something like - # __future__ that set flags stays. - self.flags &= ~turn_on_bits - - -def check_linecache_ipython(*args): - """Deprecated since IPython 8.6. Call linecache.checkcache() directly. - - It was already not necessary to call this function directly. If no - CachingCompiler had been created, this function would fail badly. If - an instance had been created, this function would've been monkeypatched - into place. - - As of IPython 8.6, the monkeypatching has gone away entirely. But there - were still internal callers of this function, so maybe external callers - also existed? - """ - import warnings - - warnings.warn( - "Deprecated Since IPython 8.6, Just call linecache.checkcache() directly.", - DeprecationWarning, - stacklevel=2, - ) - linecache.checkcache() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/completer.py b/.venv/lib/python3.12/site-packages/IPython/core/completer.py deleted file mode 100644 index b39a922..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/completer.py +++ /dev/null @@ -1,3421 +0,0 @@ -"""Completion for IPython. - -This module started as fork of the rlcompleter module in the Python standard -library. The original enhancements made to rlcompleter have been sent -upstream and were accepted as of Python 2.3, - -This module now support a wide variety of completion mechanism both available -for normal classic Python code, as well as completer for IPython specific -Syntax like magics. - -Latex and Unicode completion -============================ - -IPython and compatible frontends not only can complete your code, but can help -you to input a wide range of characters. In particular we allow you to insert -a unicode character using the tab completion mechanism. - -Forward latex/unicode completion --------------------------------- - -Forward completion allows you to easily type a unicode character using its latex -name, or unicode long description. To do so type a backslash follow by the -relevant name and press tab: - - -Using latex completion: - -.. code:: - - \\alpha - α - -or using unicode completion: - - -.. code:: - - \\GREEK SMALL LETTER ALPHA - α - - -Only valid Python identifiers will complete. Combining characters (like arrow or -dots) are also available, unlike latex they need to be put after the their -counterpart that is to say, ``F\\\\vec`` is correct, not ``\\\\vecF``. - -Some browsers are known to display combining characters incorrectly. - -Backward latex completion -------------------------- - -It is sometime challenging to know how to type a character, if you are using -IPython, or any compatible frontend you can prepend backslash to the character -and press :kbd:`Tab` to expand it to its latex form. - -.. code:: - - \\α - \\alpha - - -Both forward and backward completions can be deactivated by setting the -:std:configtrait:`Completer.backslash_combining_completions` option to -``False``. - - -Experimental -============ - -Starting with IPython 6.0, this module can make use of the Jedi library to -generate completions both using static analysis of the code, and dynamically -inspecting multiple namespaces. Jedi is an autocompletion and static analysis -for Python. The APIs attached to this new mechanism is unstable and will -raise unless use in an :any:`provisionalcompleter` context manager. - -You will find that the following are experimental: - - - :any:`provisionalcompleter` - - :any:`IPCompleter.completions` - - :any:`Completion` - - :any:`rectify_completions` - -.. note:: - - better name for :any:`rectify_completions` ? - -We welcome any feedback on these new API, and we also encourage you to try this -module in debug mode (start IPython with ``--Completer.debug=True``) in order -to have extra logging information if :any:`jedi` is crashing, or if current -IPython completer pending deprecations are returning results not yet handled -by :any:`jedi` - -Using Jedi for tab completion allow snippets like the following to work without -having to execute any code: - - >>> myvar = ['hello', 42] - ... myvar[1].bi - -Tab completion will be able to infer that ``myvar[1]`` is a real number without -executing almost any code unlike the deprecated :any:`IPCompleter.greedy` -option. - -Be sure to update :any:`jedi` to the latest stable version or to try the -current development version to get better completions. - -Matchers -======== - -All completions routines are implemented using unified *Matchers* API. -The matchers API is provisional and subject to change without notice. - -The built-in matchers include: - -- :any:`IPCompleter.dict_key_matcher`: dictionary key completions, -- :any:`IPCompleter.magic_matcher`: completions for magics, -- :any:`IPCompleter.unicode_name_matcher`, - :any:`IPCompleter.fwd_unicode_matcher` - and :any:`IPCompleter.latex_name_matcher`: see `Forward latex/unicode completion`_, -- :any:`back_unicode_name_matcher` and :any:`back_latex_name_matcher`: see `Backward latex completion`_, -- :any:`IPCompleter.file_matcher`: paths to files and directories, -- :any:`IPCompleter.python_func_kw_matcher` - function keywords, -- :any:`IPCompleter.python_matches` - globals and attributes (v1 API), -- ``IPCompleter.jedi_matcher`` - static analysis with Jedi, -- :any:`IPCompleter.custom_completer_matcher` - pluggable completer with a default - implementation in :any:`InteractiveShell` which uses IPython hooks system - (`complete_command`) with string dispatch (including regular expressions). - Differently to other matchers, ``custom_completer_matcher`` will not suppress - Jedi results to match behaviour in earlier IPython versions. - -Custom matchers can be added by appending to ``IPCompleter.custom_matchers`` list. - -Matcher API ------------ - -Simplifying some details, the ``Matcher`` interface can described as - -.. code-block:: - - MatcherAPIv1 = Callable[[str], list[str]] - MatcherAPIv2 = Callable[[CompletionContext], SimpleMatcherResult] - - Matcher = MatcherAPIv1 | MatcherAPIv2 - -The ``MatcherAPIv1`` reflects the matcher API as available prior to IPython 8.6.0 -and remains supported as a simplest way for generating completions. This is also -currently the only API supported by the IPython hooks system `complete_command`. - -To distinguish between matcher versions ``matcher_api_version`` attribute is used. -More precisely, the API allows to omit ``matcher_api_version`` for v1 Matchers, -and requires a literal ``2`` for v2 Matchers. - -Once the API stabilises future versions may relax the requirement for specifying -``matcher_api_version`` by switching to :any:`functools.singledispatch`, therefore -please do not rely on the presence of ``matcher_api_version`` for any purposes. - -Suppression of competing matchers ---------------------------------- - -By default results from all matchers are combined, in the order determined by -their priority. Matchers can request to suppress results from subsequent -matchers by setting ``suppress`` to ``True`` in the ``MatcherResult``. - -When multiple matchers simultaneously request suppression, the results from of -the matcher with higher priority will be returned. - -Sometimes it is desirable to suppress most but not all other matchers; -this can be achieved by adding a set of identifiers of matchers which -should not be suppressed to ``MatcherResult`` under ``do_not_suppress`` key. - -The suppression behaviour can is user-configurable via -:std:configtrait:`IPCompleter.suppress_competing_matchers`. -""" - - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. -# -# Some of this code originated from rlcompleter in the Python standard library -# Copyright (C) 2001 Python Software Foundation, www.python.org - -from __future__ import annotations -import builtins as builtin_mod -import enum -import glob -import inspect -import itertools -import keyword -import ast -import os -import re -import string -import sys -import tokenize -import time -import unicodedata -import uuid -import warnings -from ast import literal_eval -from collections import defaultdict -from contextlib import contextmanager -from dataclasses import dataclass -from functools import cached_property, partial -from types import SimpleNamespace -from typing import ( - Iterable, - Iterator, - List, - Tuple, - Union, - Any, - Sequence, - Dict, - Optional, - TYPE_CHECKING, - Set, - Sized, - TypeVar, - Literal, -) - -from IPython.core.guarded_eval import guarded_eval, EvaluationContext -from IPython.core.error import TryNext -from IPython.core.inputtransformer2 import ESC_MAGIC -from IPython.core.latex_symbols import latex_symbols, reverse_latex_symbol -from IPython.core.oinspect import InspectColors -from IPython.testing.skipdoctest import skip_doctest -from IPython.utils import generics -from IPython.utils.decorators import sphinx_options -from IPython.utils.dir2 import dir2, get_real_method -from IPython.utils.docs import GENERATING_DOCUMENTATION -from IPython.utils.path import ensure_dir_exists -from IPython.utils.process import arg_split -from traitlets import ( - Bool, - Enum, - Int, - List as ListTrait, - Unicode, - Dict as DictTrait, - Union as UnionTrait, - observe, -) -from traitlets.config.configurable import Configurable - -import __main__ - -# skip module docstests -__skip_doctest__ = True - - -try: - import jedi - jedi.settings.case_insensitive_completion = False - import jedi.api.helpers - import jedi.api.classes - JEDI_INSTALLED = True -except ImportError: - JEDI_INSTALLED = False - - -if TYPE_CHECKING or GENERATING_DOCUMENTATION and sys.version_info >= (3, 11): - from typing import cast - from typing_extensions import TypedDict, NotRequired, Protocol, TypeAlias, TypeGuard -else: - from typing import Generic - - def cast(type_, obj): - """Workaround for `TypeError: MatcherAPIv2() takes no arguments`""" - return obj - - # do not require on runtime - NotRequired = Tuple # requires Python >=3.11 - TypedDict = Dict # by extension of `NotRequired` requires 3.11 too - Protocol = object # requires Python >=3.8 - TypeAlias = Any # requires Python >=3.10 - TypeGuard = Generic # requires Python >=3.10 -if GENERATING_DOCUMENTATION: - from typing import TypedDict - -# ----------------------------------------------------------------------------- -# Globals -#----------------------------------------------------------------------------- - -# ranges where we have most of the valid unicode names. We could be more finer -# grained but is it worth it for performance While unicode have character in the -# range 0, 0x110000, we seem to have name for about 10% of those. (131808 as I -# write this). With below range we cover them all, with a density of ~67% -# biggest next gap we consider only adds up about 1% density and there are 600 -# gaps that would need hard coding. -_UNICODE_RANGES = [(32, 0x323B0), (0xE0001, 0xE01F0)] - -# Public API -__all__ = ["Completer", "IPCompleter"] - -if sys.platform == 'win32': - PROTECTABLES = ' ' -else: - PROTECTABLES = ' ()[]{}?=\\|;:\'#*"^&' - -# Protect against returning an enormous number of completions which the frontend -# may have trouble processing. -MATCHES_LIMIT = 500 - -# Completion type reported when no type can be inferred. -_UNKNOWN_TYPE = "" - -# sentinel value to signal lack of a match -not_found = object() - -class ProvisionalCompleterWarning(FutureWarning): - """ - Exception raise by an experimental feature in this module. - - Wrap code in :any:`provisionalcompleter` context manager if you - are certain you want to use an unstable feature. - """ - pass - -warnings.filterwarnings('error', category=ProvisionalCompleterWarning) - - -@skip_doctest -@contextmanager -def provisionalcompleter(action='ignore'): - """ - This context manager has to be used in any place where unstable completer - behavior and API may be called. - - >>> with provisionalcompleter(): - ... completer.do_experimental_things() # works - - >>> completer.do_experimental_things() # raises. - - .. note:: - - Unstable - - By using this context manager you agree that the API in use may change - without warning, and that you won't complain if they do so. - - You also understand that, if the API is not to your liking, you should report - a bug to explain your use case upstream. - - We'll be happy to get your feedback, feature requests, and improvements on - any of the unstable APIs! - """ - with warnings.catch_warnings(): - warnings.filterwarnings(action, category=ProvisionalCompleterWarning) - yield - - -def has_open_quotes(s: str) -> Union[str, bool]: - """Return whether a string has open quotes. - - This simply counts whether the number of quote characters of either type in - the string is odd. - - Returns - ------- - If there is an open quote, the quote character is returned. Else, return - False. - """ - # We check " first, then ', so complex cases with nested quotes will get - # the " to take precedence. - if s.count('"') % 2: - return '"' - elif s.count("'") % 2: - return "'" - else: - return False - - -def protect_filename(s: str, protectables: str = PROTECTABLES) -> str: - """Escape a string to protect certain characters.""" - if set(s) & set(protectables): - if sys.platform == "win32": - return '"' + s + '"' - else: - return "".join(("\\" + c if c in protectables else c) for c in s) - else: - return s - - -def expand_user(path:str) -> Tuple[str, bool, str]: - """Expand ``~``-style usernames in strings. - - This is similar to :func:`os.path.expanduser`, but it computes and returns - extra information that will be useful if the input was being used in - computing completions, and you wish to return the completions with the - original '~' instead of its expanded value. - - Parameters - ---------- - path : str - String to be expanded. If no ~ is present, the output is the same as the - input. - - Returns - ------- - newpath : str - Result of ~ expansion in the input path. - tilde_expand : bool - Whether any expansion was performed or not. - tilde_val : str - The value that ~ was replaced with. - """ - # Default values - tilde_expand = False - tilde_val = '' - newpath = path - - if path.startswith('~'): - tilde_expand = True - rest = len(path)-1 - newpath = os.path.expanduser(path) - if rest: - tilde_val = newpath[:-rest] - else: - tilde_val = newpath - - return newpath, tilde_expand, tilde_val - - -def compress_user(path:str, tilde_expand:bool, tilde_val:str) -> str: - """Does the opposite of expand_user, with its outputs. - """ - if tilde_expand: - return path.replace(tilde_val, '~') - else: - return path - - -def completions_sorting_key(word): - """key for sorting completions - - This does several things: - - - Demote any completions starting with underscores to the end - - Insert any %magic and %%cellmagic completions in the alphabetical order - by their name - """ - prio1, prio2 = 0, 0 - - if word.startswith('__'): - prio1 = 2 - elif word.startswith('_'): - prio1 = 1 - - if word.endswith('='): - prio1 = -1 - - if word.startswith('%%'): - # If there's another % in there, this is something else, so leave it alone - if "%" not in word[2:]: - word = word[2:] - prio2 = 2 - elif word.startswith('%'): - if "%" not in word[1:]: - word = word[1:] - prio2 = 1 - - return prio1, word, prio2 - - -class _FakeJediCompletion: - """ - This is a workaround to communicate to the UI that Jedi has crashed and to - report a bug. Will be used only id :any:`IPCompleter.debug` is set to true. - - Added in IPython 6.0 so should likely be removed for 7.0 - - """ - - def __init__(self, name): - - self.name = name - self.complete = name - self.type = 'crashed' - self.name_with_symbols = name - self.signature = "" - self._origin = "fake" - self.text = "crashed" - - def __repr__(self): - return '' - - -_JediCompletionLike = Union["jedi.api.Completion", _FakeJediCompletion] - - -class Completion: - """ - Completion object used and returned by IPython completers. - - .. warning:: - - Unstable - - This function is unstable, API may change without warning. - It will also raise unless use in proper context manager. - - This act as a middle ground :any:`Completion` object between the - :any:`jedi.api.classes.Completion` object and the Prompt Toolkit completion - object. While Jedi need a lot of information about evaluator and how the - code should be ran/inspected, PromptToolkit (and other frontend) mostly - need user facing information. - - - Which range should be replaced replaced by what. - - Some metadata (like completion type), or meta information to displayed to - the use user. - - For debugging purpose we can also store the origin of the completion (``jedi``, - ``IPython.python_matches``, ``IPython.magics_matches``...). - """ - - __slots__ = ['start', 'end', 'text', 'type', 'signature', '_origin'] - - def __init__( - self, - start: int, - end: int, - text: str, - *, - type: Optional[str] = None, - _origin="", - signature="", - ) -> None: - warnings.warn( - "``Completion`` is a provisional API (as of IPython 6.0). " - "It may change without warnings. " - "Use in corresponding context manager.", - category=ProvisionalCompleterWarning, - stacklevel=2, - ) - - self.start = start - self.end = end - self.text = text - self.type = type - self.signature = signature - self._origin = _origin - - def __repr__(self): - return '' % \ - (self.start, self.end, self.text, self.type or '?', self.signature or '?') - - def __eq__(self, other) -> bool: - """ - Equality and hash do not hash the type (as some completer may not be - able to infer the type), but are use to (partially) de-duplicate - completion. - - Completely de-duplicating completion is a bit tricker that just - comparing as it depends on surrounding text, which Completions are not - aware of. - """ - return self.start == other.start and \ - self.end == other.end and \ - self.text == other.text - - def __hash__(self): - return hash((self.start, self.end, self.text)) - - -class SimpleCompletion: - """Completion item to be included in the dictionary returned by new-style Matcher (API v2). - - .. warning:: - - Provisional - - This class is used to describe the currently supported attributes of - simple completion items, and any additional implementation details - should not be relied on. Additional attributes may be included in - future versions, and meaning of text disambiguated from the current - dual meaning of "text to insert" and "text to used as a label". - """ - - __slots__ = ["text", "type"] - - def __init__(self, text: str, *, type: Optional[str] = None): - self.text = text - self.type = type - - def __repr__(self): - return f"" - - -class _MatcherResultBase(TypedDict): - """Definition of dictionary to be returned by new-style Matcher (API v2).""" - - #: Suffix of the provided ``CompletionContext.token``, if not given defaults to full token. - matched_fragment: NotRequired[str] - - #: Whether to suppress results from all other matchers (True), some - #: matchers (set of identifiers) or none (False); default is False. - suppress: NotRequired[Union[bool, Set[str]]] - - #: Identifiers of matchers which should NOT be suppressed when this matcher - #: requests to suppress all other matchers; defaults to an empty set. - do_not_suppress: NotRequired[Set[str]] - - #: Are completions already ordered and should be left as-is? default is False. - ordered: NotRequired[bool] - - -@sphinx_options(show_inherited_members=True, exclude_inherited_from=["dict"]) -class SimpleMatcherResult(_MatcherResultBase, TypedDict): - """Result of new-style completion matcher.""" - - # note: TypedDict is added again to the inheritance chain - # in order to get __orig_bases__ for documentation - - #: List of candidate completions - completions: Sequence[SimpleCompletion] | Iterator[SimpleCompletion] - - -class _JediMatcherResult(_MatcherResultBase): - """Matching result returned by Jedi (will be processed differently)""" - - #: list of candidate completions - completions: Iterator[_JediCompletionLike] - - -AnyMatcherCompletion = Union[_JediCompletionLike, SimpleCompletion] -AnyCompletion = TypeVar("AnyCompletion", AnyMatcherCompletion, Completion) - - -@dataclass -class CompletionContext: - """Completion context provided as an argument to matchers in the Matcher API v2.""" - - # rationale: many legacy matchers relied on completer state (`self.text_until_cursor`) - # which was not explicitly visible as an argument of the matcher, making any refactor - # prone to errors; by explicitly passing `cursor_position` we can decouple the matchers - # from the completer, and make substituting them in sub-classes easier. - - #: Relevant fragment of code directly preceding the cursor. - #: The extraction of token is implemented via splitter heuristic - #: (following readline behaviour for legacy reasons), which is user configurable - #: (by switching the greedy mode). - token: str - - #: The full available content of the editor or buffer - full_text: str - - #: Cursor position in the line (the same for ``full_text`` and ``text``). - cursor_position: int - - #: Cursor line in ``full_text``. - cursor_line: int - - #: The maximum number of completions that will be used downstream. - #: Matchers can use this information to abort early. - #: The built-in Jedi matcher is currently excepted from this limit. - # If not given, return all possible completions. - limit: Optional[int] - - @cached_property - def text_until_cursor(self) -> str: - return self.line_with_cursor[: self.cursor_position] - - @cached_property - def line_with_cursor(self) -> str: - return self.full_text.split("\n")[self.cursor_line] - - -#: Matcher results for API v2. -MatcherResult = Union[SimpleMatcherResult, _JediMatcherResult] - - -class _MatcherAPIv1Base(Protocol): - def __call__(self, text: str) -> List[str]: - """Call signature.""" - ... - - #: Used to construct the default matcher identifier - __qualname__: str - - -class _MatcherAPIv1Total(_MatcherAPIv1Base, Protocol): - #: API version - matcher_api_version: Optional[Literal[1]] - - def __call__(self, text: str) -> List[str]: - """Call signature.""" - ... - - -#: Protocol describing Matcher API v1. -MatcherAPIv1: TypeAlias = Union[_MatcherAPIv1Base, _MatcherAPIv1Total] - - -class MatcherAPIv2(Protocol): - """Protocol describing Matcher API v2.""" - - #: API version - matcher_api_version: Literal[2] = 2 - - def __call__(self, context: CompletionContext) -> MatcherResult: - """Call signature.""" - ... - - #: Used to construct the default matcher identifier - __qualname__: str - - -Matcher: TypeAlias = Union[MatcherAPIv1, MatcherAPIv2] - - -def _is_matcher_v1(matcher: Matcher) -> TypeGuard[MatcherAPIv1]: - api_version = _get_matcher_api_version(matcher) - return api_version == 1 - - -def _is_matcher_v2(matcher: Matcher) -> TypeGuard[MatcherAPIv2]: - api_version = _get_matcher_api_version(matcher) - return api_version == 2 - - -def _is_sizable(value: Any) -> TypeGuard[Sized]: - """Determines whether objects is sizable""" - return hasattr(value, "__len__") - - -def _is_iterator(value: Any) -> TypeGuard[Iterator]: - """Determines whether objects is sizable""" - return hasattr(value, "__next__") - - -def has_any_completions(result: MatcherResult) -> bool: - """Check if any result includes any completions.""" - completions = result["completions"] - if _is_sizable(completions): - return len(completions) != 0 - if _is_iterator(completions): - try: - old_iterator = completions - first = next(old_iterator) - result["completions"] = cast( - Iterator[SimpleCompletion], - itertools.chain([first], old_iterator), - ) - return True - except StopIteration: - return False - raise ValueError( - "Completions returned by matcher need to be an Iterator or a Sizable" - ) - - -def completion_matcher( - *, - priority: Optional[float] = None, - identifier: Optional[str] = None, - api_version: int = 1, -) -> Callable[[Matcher], Matcher]: - """Adds attributes describing the matcher. - - Parameters - ---------- - priority : Optional[float] - The priority of the matcher, determines the order of execution of matchers. - Higher priority means that the matcher will be executed first. Defaults to 0. - identifier : Optional[str] - identifier of the matcher allowing users to modify the behaviour via traitlets, - and also used to for debugging (will be passed as ``origin`` with the completions). - - Defaults to matcher function's ``__qualname__`` (for example, - ``IPCompleter.file_matcher`` for the built-in matched defined - as a ``file_matcher`` method of the ``IPCompleter`` class). - api_version: Optional[int] - version of the Matcher API used by this matcher. - Currently supported values are 1 and 2. - Defaults to 1. - """ - - def wrapper(func: Matcher): - func.matcher_priority = priority or 0 # type: ignore - func.matcher_identifier = identifier or func.__qualname__ # type: ignore - func.matcher_api_version = api_version # type: ignore - if TYPE_CHECKING: - if api_version == 1: - func = cast(MatcherAPIv1, func) - elif api_version == 2: - func = cast(MatcherAPIv2, func) - return func - - return wrapper - - -def _get_matcher_priority(matcher: Matcher): - return getattr(matcher, "matcher_priority", 0) - - -def _get_matcher_id(matcher: Matcher): - return getattr(matcher, "matcher_identifier", matcher.__qualname__) - - -def _get_matcher_api_version(matcher): - return getattr(matcher, "matcher_api_version", 1) - - -context_matcher = partial(completion_matcher, api_version=2) - - -_IC = Iterable[Completion] - - -def _deduplicate_completions(text: str, completions: _IC)-> _IC: - """ - Deduplicate a set of completions. - - .. warning:: - - Unstable - - This function is unstable, API may change without warning. - - Parameters - ---------- - text : str - text that should be completed. - completions : Iterator[Completion] - iterator over the completions to deduplicate - - Yields - ------ - `Completions` objects - Completions coming from multiple sources, may be different but end up having - the same effect when applied to ``text``. If this is the case, this will - consider completions as equal and only emit the first encountered. - Not folded in `completions()` yet for debugging purpose, and to detect when - the IPython completer does return things that Jedi does not, but should be - at some point. - """ - completions = list(completions) - if not completions: - return - - new_start = min(c.start for c in completions) - new_end = max(c.end for c in completions) - - seen = set() - for c in completions: - new_text = text[new_start:c.start] + c.text + text[c.end:new_end] - if new_text not in seen: - yield c - seen.add(new_text) - - -def rectify_completions(text: str, completions: _IC, *, _debug: bool = False) -> _IC: - """ - Rectify a set of completions to all have the same ``start`` and ``end`` - - .. warning:: - - Unstable - - This function is unstable, API may change without warning. - It will also raise unless use in proper context manager. - - Parameters - ---------- - text : str - text that should be completed. - completions : Iterator[Completion] - iterator over the completions to rectify - _debug : bool - Log failed completion - - Notes - ----- - :any:`jedi.api.classes.Completion` s returned by Jedi may not have the same start and end, though - the Jupyter Protocol requires them to behave like so. This will readjust - the completion to have the same ``start`` and ``end`` by padding both - extremities with surrounding text. - - During stabilisation should support a ``_debug`` option to log which - completion are return by the IPython completer and not found in Jedi in - order to make upstream bug report. - """ - warnings.warn("`rectify_completions` is a provisional API (as of IPython 6.0). " - "It may change without warnings. " - "Use in corresponding context manager.", - category=ProvisionalCompleterWarning, stacklevel=2) - - completions = list(completions) - if not completions: - return - starts = (c.start for c in completions) - ends = (c.end for c in completions) - - new_start = min(starts) - new_end = max(ends) - - seen_jedi = set() - seen_python_matches = set() - for c in completions: - new_text = text[new_start:c.start] + c.text + text[c.end:new_end] - if c._origin == 'jedi': - seen_jedi.add(new_text) - elif c._origin == "IPCompleter.python_matcher": - seen_python_matches.add(new_text) - yield Completion(new_start, new_end, new_text, type=c.type, _origin=c._origin, signature=c.signature) - diff = seen_python_matches.difference(seen_jedi) - if diff and _debug: - print('IPython.python matches have extras:', diff) - - -if sys.platform == 'win32': - DELIMS = ' \t\n`!@#$^&*()=+[{]}|;\'",<>?' -else: - DELIMS = ' \t\n`!@#$^&*()=+[{]}\\|;:\'",<>?' - -GREEDY_DELIMS = ' =\r\n' - - -class CompletionSplitter(object): - """An object to split an input line in a manner similar to readline. - - By having our own implementation, we can expose readline-like completion in - a uniform manner to all frontends. This object only needs to be given the - line of text to be split and the cursor position on said line, and it - returns the 'word' to be completed on at the cursor after splitting the - entire line. - - What characters are used as splitting delimiters can be controlled by - setting the ``delims`` attribute (this is a property that internally - automatically builds the necessary regular expression)""" - - # Private interface - - # A string of delimiter characters. The default value makes sense for - # IPython's most typical usage patterns. - _delims = DELIMS - - # The expression (a normal string) to be compiled into a regular expression - # for actual splitting. We store it as an attribute mostly for ease of - # debugging, since this type of code can be so tricky to debug. - _delim_expr = None - - # The regular expression that does the actual splitting - _delim_re = None - - def __init__(self, delims=None): - delims = CompletionSplitter._delims if delims is None else delims - self.delims = delims - - @property - def delims(self): - """Return the string of delimiter characters.""" - return self._delims - - @delims.setter - def delims(self, delims): - """Set the delimiters for line splitting.""" - expr = '[' + ''.join('\\'+ c for c in delims) + ']' - self._delim_re = re.compile(expr) - self._delims = delims - self._delim_expr = expr - - def split_line(self, line, cursor_pos=None): - """Split a line of text with a cursor at the given position. - """ - cut_line = line if cursor_pos is None else line[:cursor_pos] - return self._delim_re.split(cut_line)[-1] - - - -class Completer(Configurable): - - greedy = Bool( - False, - help="""Activate greedy completion. - - .. deprecated:: 8.8 - Use :std:configtrait:`Completer.evaluation` and :std:configtrait:`Completer.auto_close_dict_keys` instead. - - When enabled in IPython 8.8 or newer, changes configuration as follows: - - - ``Completer.evaluation = 'unsafe'`` - - ``Completer.auto_close_dict_keys = True`` - """, - ).tag(config=True) - - evaluation = Enum( - ("forbidden", "minimal", "limited", "unsafe", "dangerous"), - default_value="limited", - help="""Policy for code evaluation under completion. - - Successive options allow to enable more eager evaluation for better - completion suggestions, including for nested dictionaries, nested lists, - or even results of function calls. - Setting ``unsafe`` or higher can lead to evaluation of arbitrary user - code on :kbd:`Tab` with potentially unwanted or dangerous side effects. - - Allowed values are: - - - ``forbidden``: no evaluation of code is permitted, - - ``minimal``: evaluation of literals and access to built-in namespace; - no item/attribute evaluationm no access to locals/globals, - no evaluation of any operations or comparisons. - - ``limited``: access to all namespaces, evaluation of hard-coded methods - (for example: :any:`dict.keys`, :any:`object.__getattr__`, - :any:`object.__getitem__`) on allow-listed objects (for example: - :any:`dict`, :any:`list`, :any:`tuple`, ``pandas.Series``), - - ``unsafe``: evaluation of all methods and function calls but not of - syntax with side-effects like `del x`, - - ``dangerous``: completely arbitrary evaluation. - """, - ).tag(config=True) - - use_jedi = Bool(default_value=JEDI_INSTALLED, - help="Experimental: Use Jedi to generate autocompletions. " - "Default to True if jedi is installed.").tag(config=True) - - jedi_compute_type_timeout = Int(default_value=400, - help="""Experimental: restrict time (in milliseconds) during which Jedi can compute types. - Set to 0 to stop computing types. Non-zero value lower than 100ms may hurt - performance by preventing jedi to build its cache. - """).tag(config=True) - - debug = Bool(default_value=False, - help='Enable debug for the Completer. Mostly print extra ' - 'information for experimental jedi integration.')\ - .tag(config=True) - - backslash_combining_completions = Bool(True, - help="Enable unicode completions, e.g. \\alpha . " - "Includes completion of latex commands, unicode names, and expanding " - "unicode characters back to latex commands.").tag(config=True) - - auto_close_dict_keys = Bool( - False, - help=""" - Enable auto-closing dictionary keys. - - When enabled string keys will be suffixed with a final quote - (matching the opening quote), tuple keys will also receive a - separating comma if needed, and keys which are final will - receive a closing bracket (``]``). - """, - ).tag(config=True) - - def __init__(self, namespace=None, global_namespace=None, **kwargs): - """Create a new completer for the command line. - - Completer(namespace=ns, global_namespace=ns2) -> completer instance. - - If unspecified, the default namespace where completions are performed - is __main__ (technically, __main__.__dict__). Namespaces should be - given as dictionaries. - - An optional second namespace can be given. This allows the completer - to handle cases where both the local and global scopes need to be - distinguished. - """ - - # Don't bind to namespace quite yet, but flag whether the user wants a - # specific namespace or to use __main__.__dict__. This will allow us - # to bind to __main__.__dict__ at completion time, not now. - if namespace is None: - self.use_main_ns = True - else: - self.use_main_ns = False - self.namespace = namespace - - # The global namespace, if given, can be bound directly - if global_namespace is None: - self.global_namespace = {} - else: - self.global_namespace = global_namespace - - self.custom_matchers = [] - - super(Completer, self).__init__(**kwargs) - - def complete(self, text, state): - """Return the next possible completion for 'text'. - - This is called successively with state == 0, 1, 2, ... until it - returns None. The completion should begin with 'text'. - - """ - if self.use_main_ns: - self.namespace = __main__.__dict__ - - if state == 0: - if "." in text: - self.matches = self.attr_matches(text) - else: - self.matches = self.global_matches(text) - try: - return self.matches[state] - except IndexError: - return None - - def global_matches(self, text): - """Compute matches when text is a simple name. - - Return a list of all keywords, built-in functions and names currently - defined in self.namespace or self.global_namespace that match. - - """ - matches = [] - match_append = matches.append - n = len(text) - for lst in [ - keyword.kwlist, - builtin_mod.__dict__.keys(), - list(self.namespace.keys()), - list(self.global_namespace.keys()), - ]: - for word in lst: - if word[:n] == text and word != "__builtins__": - match_append(word) - - snake_case_re = re.compile(r"[^_]+(_[^_]+)+?\Z") - for lst in [list(self.namespace.keys()), list(self.global_namespace.keys())]: - shortened = { - "_".join([sub[0] for sub in word.split("_")]): word - for word in lst - if snake_case_re.match(word) - } - for word in shortened.keys(): - if word[:n] == text and word != "__builtins__": - match_append(shortened[word]) - return matches - - def attr_matches(self, text): - """Compute matches when text contains a dot. - - Assuming the text is of the form NAME.NAME....[NAME], and is - evaluatable in self.namespace or self.global_namespace, it will be - evaluated and its attributes (as revealed by dir()) are used as - possible completions. (For class instances, class members are - also considered.) - - WARNING: this can still invoke arbitrary C code, if an object - with a __getattr__ hook is evaluated. - - """ - return self._attr_matches(text)[0] - - # we simple attribute matching with normal identifiers. - _ATTR_MATCH_RE = re.compile(r"(.+)\.(\w*)$") - - def _attr_matches( - self, text: str, include_prefix: bool = True - ) -> Tuple[Sequence[str], str]: - m2 = self._ATTR_MATCH_RE.match(self.line_buffer) - if not m2: - return [], "" - expr, attr = m2.group(1, 2) - - obj = self._evaluate_expr(expr) - - if obj is not_found: - return [], "" - - if self.limit_to__all__ and hasattr(obj, '__all__'): - words = get__all__entries(obj) - else: - words = dir2(obj) - - try: - words = generics.complete_object(obj, words) - except TryNext: - pass - except AssertionError: - raise - except Exception: - # Silence errors from completion function - pass - # Build match list to return - n = len(attr) - - # Note: ideally we would just return words here and the prefix - # reconciliator would know that we intend to append to rather than - # replace the input text; this requires refactoring to return range - # which ought to be replaced (as does jedi). - if include_prefix: - tokens = _parse_tokens(expr) - rev_tokens = reversed(tokens) - skip_over = {tokenize.ENDMARKER, tokenize.NEWLINE} - name_turn = True - - parts = [] - for token in rev_tokens: - if token.type in skip_over: - continue - if token.type == tokenize.NAME and name_turn: - parts.append(token.string) - name_turn = False - elif ( - token.type == tokenize.OP and token.string == "." and not name_turn - ): - parts.append(token.string) - name_turn = True - else: - # short-circuit if not empty nor name token - break - - prefix_after_space = "".join(reversed(parts)) - else: - prefix_after_space = "" - - return ( - ["%s.%s" % (prefix_after_space, w) for w in words if w[:n] == attr], - "." + attr, - ) - - def _trim_expr(self, code: str) -> str: - """ - Trim the code until it is a valid expression and not a tuple; - - return the trimmed expression for guarded_eval. - """ - while code: - code = code[1:] - try: - res = ast.parse(code) - except SyntaxError: - continue - - assert res is not None - if len(res.body) != 1: - continue - expr = res.body[0].value - if isinstance(expr, ast.Tuple) and not code[-1] == ")": - # we skip implicit tuple, like when trimming `fun(a,b` - # as `a,b` would be a tuple, and we actually expect to get only `b` - continue - return code - return "" - - def _evaluate_expr(self, expr): - obj = not_found - done = False - while not done and expr: - try: - obj = guarded_eval( - expr, - EvaluationContext( - globals=self.global_namespace, - locals=self.namespace, - evaluation=self.evaluation, - ), - ) - done = True - except Exception as e: - if self.debug: - print("Evaluation exception", e) - # trim the expression to remove any invalid prefix - # e.g. user starts `(d[`, so we get `expr = '(d'`, - # where parenthesis is not closed. - # TODO: make this faster by reusing parts of the computation? - expr = self._trim_expr(expr) - return obj - -def get__all__entries(obj): - """returns the strings in the __all__ attribute""" - try: - words = getattr(obj, '__all__') - except Exception: - return [] - - return [w for w in words if isinstance(w, str)] - - -class _DictKeyState(enum.Flag): - """Represent state of the key match in context of other possible matches. - - - given `d1 = {'a': 1}` completion on `d1['` will yield `{'a': END_OF_ITEM}` as there is no tuple. - - given `d2 = {('a', 'b'): 1}`: `d2['a', '` will yield `{'b': END_OF_TUPLE}` as there is no tuple members to add beyond `'b'`. - - given `d3 = {('a', 'b'): 1}`: `d3['` will yield `{'a': IN_TUPLE}` as `'a'` can be added. - - given `d4 = {'a': 1, ('a', 'b'): 2}`: `d4['` will yield `{'a': END_OF_ITEM & END_OF_TUPLE}` - """ - - BASELINE = 0 - END_OF_ITEM = enum.auto() - END_OF_TUPLE = enum.auto() - IN_TUPLE = enum.auto() - - -def _parse_tokens(c): - """Parse tokens even if there is an error.""" - tokens = [] - token_generator = tokenize.generate_tokens(iter(c.splitlines()).__next__) - while True: - try: - tokens.append(next(token_generator)) - except tokenize.TokenError: - return tokens - except StopIteration: - return tokens - - -def _match_number_in_dict_key_prefix(prefix: str) -> Union[str, None]: - """Match any valid Python numeric literal in a prefix of dictionary keys. - - References: - - https://docs.python.org/3/reference/lexical_analysis.html#numeric-literals - - https://docs.python.org/3/library/tokenize.html - """ - if prefix[-1].isspace(): - # if user typed a space we do not have anything to complete - # even if there was a valid number token before - return None - tokens = _parse_tokens(prefix) - rev_tokens = reversed(tokens) - skip_over = {tokenize.ENDMARKER, tokenize.NEWLINE} - number = None - for token in rev_tokens: - if token.type in skip_over: - continue - if number is None: - if token.type == tokenize.NUMBER: - number = token.string - continue - else: - # we did not match a number - return None - if token.type == tokenize.OP: - if token.string == ",": - break - if token.string in {"+", "-"}: - number = token.string + number - else: - return None - return number - - -_INT_FORMATS = { - "0b": bin, - "0o": oct, - "0x": hex, -} - - -def match_dict_keys( - keys: List[Union[str, bytes, Tuple[Union[str, bytes], ...]]], - prefix: str, - delims: str, - extra_prefix: Optional[Tuple[Union[str, bytes], ...]] = None, -) -> Tuple[str, int, Dict[str, _DictKeyState]]: - """Used by dict_key_matches, matching the prefix to a list of keys - - Parameters - ---------- - keys - list of keys in dictionary currently being completed. - prefix - Part of the text already typed by the user. E.g. `mydict[b'fo` - delims - String of delimiters to consider when finding the current key. - extra_prefix : optional - Part of the text already typed in multi-key index cases. E.g. for - `mydict['foo', "bar", 'b`, this would be `('foo', 'bar')`. - - Returns - ------- - A tuple of three elements: ``quote``, ``token_start``, ``matched``, with - ``quote`` being the quote that need to be used to close current string. - ``token_start`` the position where the replacement should start occurring, - ``matches`` a dictionary of replacement/completion keys on keys and values - indicating whether the state. - """ - prefix_tuple = extra_prefix if extra_prefix else () - - prefix_tuple_size = sum( - [ - # for pandas, do not count slices as taking space - not isinstance(k, slice) - for k in prefix_tuple - ] - ) - text_serializable_types = (str, bytes, int, float, slice) - - def filter_prefix_tuple(key): - # Reject too short keys - if len(key) <= prefix_tuple_size: - return False - # Reject keys which cannot be serialised to text - for k in key: - if not isinstance(k, text_serializable_types): - return False - # Reject keys that do not match the prefix - for k, pt in zip(key, prefix_tuple): - if k != pt and not isinstance(pt, slice): - return False - # All checks passed! - return True - - filtered_key_is_final: Dict[Union[str, bytes, int, float], _DictKeyState] = ( - defaultdict(lambda: _DictKeyState.BASELINE) - ) - - for k in keys: - # If at least one of the matches is not final, mark as undetermined. - # This can happen with `d = {111: 'b', (111, 222): 'a'}` where - # `111` appears final on first match but is not final on the second. - - if isinstance(k, tuple): - if filter_prefix_tuple(k): - key_fragment = k[prefix_tuple_size] - filtered_key_is_final[key_fragment] |= ( - _DictKeyState.END_OF_TUPLE - if len(k) == prefix_tuple_size + 1 - else _DictKeyState.IN_TUPLE - ) - elif prefix_tuple_size > 0: - # we are completing a tuple but this key is not a tuple, - # so we should ignore it - pass - else: - if isinstance(k, text_serializable_types): - filtered_key_is_final[k] |= _DictKeyState.END_OF_ITEM - - filtered_keys = filtered_key_is_final.keys() - - if not prefix: - return "", 0, {repr(k): v for k, v in filtered_key_is_final.items()} - - quote_match = re.search("(?:\"|')", prefix) - is_user_prefix_numeric = False - - if quote_match: - quote = quote_match.group() - valid_prefix = prefix + quote - try: - prefix_str = literal_eval(valid_prefix) - except Exception: - return "", 0, {} - else: - # If it does not look like a string, let's assume - # we are dealing with a number or variable. - number_match = _match_number_in_dict_key_prefix(prefix) - - # We do not want the key matcher to suggest variable names so we yield: - if number_match is None: - # The alternative would be to assume that user forgort the quote - # and if the substring matches, suggest adding it at the start. - return "", 0, {} - - prefix_str = number_match - is_user_prefix_numeric = True - quote = "" - - pattern = '[^' + ''.join('\\' + c for c in delims) + ']*$' - token_match = re.search(pattern, prefix, re.UNICODE) - assert token_match is not None # silence mypy - token_start = token_match.start() - token_prefix = token_match.group() - - matched: Dict[str, _DictKeyState] = {} - - str_key: Union[str, bytes] - - for key in filtered_keys: - if isinstance(key, (int, float)): - # User typed a number but this key is not a number. - if not is_user_prefix_numeric: - continue - str_key = str(key) - if isinstance(key, int): - int_base = prefix_str[:2].lower() - # if user typed integer using binary/oct/hex notation: - if int_base in _INT_FORMATS: - int_format = _INT_FORMATS[int_base] - str_key = int_format(key) - else: - # User typed a string but this key is a number. - if is_user_prefix_numeric: - continue - str_key = key - try: - if not str_key.startswith(prefix_str): - continue - except (AttributeError, TypeError, UnicodeError): - # Python 3+ TypeError on b'a'.startswith('a') or vice-versa - continue - - # reformat remainder of key to begin with prefix - rem = str_key[len(prefix_str) :] - # force repr wrapped in ' - rem_repr = repr(rem + '"') if isinstance(rem, str) else repr(rem + b'"') - rem_repr = rem_repr[1 + rem_repr.index("'"):-2] - if quote == '"': - # The entered prefix is quoted with ", - # but the match is quoted with '. - # A contained " hence needs escaping for comparison: - rem_repr = rem_repr.replace('"', '\\"') - - # then reinsert prefix from start of token - match = "%s%s" % (token_prefix, rem_repr) - - matched[match] = filtered_key_is_final[key] - return quote, token_start, matched - - -def cursor_to_position(text:str, line:int, column:int)->int: - """ - Convert the (line,column) position of the cursor in text to an offset in a - string. - - Parameters - ---------- - text : str - The text in which to calculate the cursor offset - line : int - Line of the cursor; 0-indexed - column : int - Column of the cursor 0-indexed - - Returns - ------- - Position of the cursor in ``text``, 0-indexed. - - See Also - -------- - position_to_cursor : reciprocal of this function - - """ - lines = text.split('\n') - assert line <= len(lines), '{} <= {}'.format(str(line), str(len(lines))) - - return sum(len(line) + 1 for line in lines[:line]) + column - -def position_to_cursor(text:str, offset:int)->Tuple[int, int]: - """ - Convert the position of the cursor in text (0 indexed) to a line - number(0-indexed) and a column number (0-indexed) pair - - Position should be a valid position in ``text``. - - Parameters - ---------- - text : str - The text in which to calculate the cursor offset - offset : int - Position of the cursor in ``text``, 0-indexed. - - Returns - ------- - (line, column) : (int, int) - Line of the cursor; 0-indexed, column of the cursor 0-indexed - - See Also - -------- - cursor_to_position : reciprocal of this function - - """ - - assert 0 <= offset <= len(text) , "0 <= %s <= %s" % (offset , len(text)) - - before = text[:offset] - blines = before.split('\n') # ! splitnes trim trailing \n - line = before.count('\n') - col = len(blines[-1]) - return line, col - - -def _safe_isinstance(obj, module, class_name, *attrs): - """Checks if obj is an instance of module.class_name if loaded - """ - if module in sys.modules: - m = sys.modules[module] - for attr in [class_name, *attrs]: - m = getattr(m, attr) - return isinstance(obj, m) - - -@context_matcher() -def back_unicode_name_matcher(context: CompletionContext): - """Match Unicode characters back to Unicode name - - Same as :any:`back_unicode_name_matches`, but adopted to new Matcher API. - """ - fragment, matches = back_unicode_name_matches(context.text_until_cursor) - return _convert_matcher_v1_result_to_v2( - matches, type="unicode", fragment=fragment, suppress_if_matches=True - ) - - -def back_unicode_name_matches(text: str) -> Tuple[str, Sequence[str]]: - """Match Unicode characters back to Unicode name - - This does ``☃`` -> ``\\snowman`` - - Note that snowman is not a valid python3 combining character but will be expanded. - Though it will not recombine back to the snowman character by the completion machinery. - - This will not either back-complete standard sequences like \\n, \\b ... - - .. deprecated:: 8.6 - You can use :meth:`back_unicode_name_matcher` instead. - - Returns - ======= - - Return a tuple with two elements: - - - The Unicode character that was matched (preceded with a backslash), or - empty string, - - a sequence (of 1), name for the match Unicode character, preceded by - backslash, or empty if no match. - """ - if len(text)<2: - return '', () - maybe_slash = text[-2] - if maybe_slash != '\\': - return '', () - - char = text[-1] - # no expand on quote for completion in strings. - # nor backcomplete standard ascii keys - if char in string.ascii_letters or char in ('"',"'"): - return '', () - try : - unic = unicodedata.name(char) - return '\\'+char,('\\'+unic,) - except KeyError: - pass - return '', () - - -@context_matcher() -def back_latex_name_matcher(context: CompletionContext): - """Match latex characters back to unicode name - - Same as :any:`back_latex_name_matches`, but adopted to new Matcher API. - """ - fragment, matches = back_latex_name_matches(context.text_until_cursor) - return _convert_matcher_v1_result_to_v2( - matches, type="latex", fragment=fragment, suppress_if_matches=True - ) - - -def back_latex_name_matches(text: str) -> Tuple[str, Sequence[str]]: - """Match latex characters back to unicode name - - This does ``\\ℵ`` -> ``\\aleph`` - - .. deprecated:: 8.6 - You can use :meth:`back_latex_name_matcher` instead. - """ - if len(text)<2: - return '', () - maybe_slash = text[-2] - if maybe_slash != '\\': - return '', () - - - char = text[-1] - # no expand on quote for completion in strings. - # nor backcomplete standard ascii keys - if char in string.ascii_letters or char in ('"',"'"): - return '', () - try : - latex = reverse_latex_symbol[char] - # '\\' replace the \ as well - return '\\'+char,[latex] - except KeyError: - pass - return '', () - - -def _formatparamchildren(parameter) -> str: - """ - Get parameter name and value from Jedi Private API - - Jedi does not expose a simple way to get `param=value` from its API. - - Parameters - ---------- - parameter - Jedi's function `Param` - - Returns - ------- - A string like 'a', 'b=1', '*args', '**kwargs' - - """ - description = parameter.description - if not description.startswith('param '): - raise ValueError('Jedi function parameter description have change format.' - 'Expected "param ...", found %r".' % description) - return description[6:] - -def _make_signature(completion)-> str: - """ - Make the signature from a jedi completion - - Parameters - ---------- - completion : jedi.Completion - object does not complete a function type - - Returns - ------- - a string consisting of the function signature, with the parenthesis but - without the function name. example: - `(a, *args, b=1, **kwargs)` - - """ - - # it looks like this might work on jedi 0.17 - if hasattr(completion, 'get_signatures'): - signatures = completion.get_signatures() - if not signatures: - return '(?)' - - c0 = completion.get_signatures()[0] - return '('+c0.to_string().split('(', maxsplit=1)[1] - - return '(%s)'% ', '.join([f for f in (_formatparamchildren(p) for signature in completion.get_signatures() - for p in signature.defined_names()) if f]) - - -_CompleteResult = Dict[str, MatcherResult] - - -DICT_MATCHER_REGEX = re.compile( - r"""(?x) -( # match dict-referring - or any get item object - expression - .+ -) -\[ # open bracket -\s* # and optional whitespace -# Capture any number of serializable objects (e.g. "a", "b", 'c') -# and slices -((?:(?: - (?: # closed string - [uUbB]? # string prefix (r not handled) - (?: - '(?:[^']|(? SimpleMatcherResult: - """Utility to help with transition""" - result = { - "completions": [SimpleCompletion(text=match, type=type) for match in matches], - "suppress": (True if matches else False) if suppress_if_matches else False, - } - if fragment is not None: - result["matched_fragment"] = fragment - return cast(SimpleMatcherResult, result) - - -class IPCompleter(Completer): - """Extension of the completer class with IPython-specific features""" - - @observe('greedy') - def _greedy_changed(self, change): - """update the splitter and readline delims when greedy is changed""" - if change["new"]: - self.evaluation = "unsafe" - self.auto_close_dict_keys = True - self.splitter.delims = GREEDY_DELIMS - else: - self.evaluation = "limited" - self.auto_close_dict_keys = False - self.splitter.delims = DELIMS - - dict_keys_only = Bool( - False, - help=""" - Whether to show dict key matches only. - - (disables all matchers except for `IPCompleter.dict_key_matcher`). - """, - ) - - suppress_competing_matchers = UnionTrait( - [Bool(allow_none=True), DictTrait(Bool(None, allow_none=True))], - default_value=None, - help=""" - Whether to suppress completions from other *Matchers*. - - When set to ``None`` (default) the matchers will attempt to auto-detect - whether suppression of other matchers is desirable. For example, at - the beginning of a line followed by `%` we expect a magic completion - to be the only applicable option, and after ``my_dict['`` we usually - expect a completion with an existing dictionary key. - - If you want to disable this heuristic and see completions from all matchers, - set ``IPCompleter.suppress_competing_matchers = False``. - To disable the heuristic for specific matchers provide a dictionary mapping: - ``IPCompleter.suppress_competing_matchers = {'IPCompleter.dict_key_matcher': False}``. - - Set ``IPCompleter.suppress_competing_matchers = True`` to limit - completions to the set of matchers with the highest priority; - this is equivalent to ``IPCompleter.merge_completions`` and - can be beneficial for performance, but will sometimes omit relevant - candidates from matchers further down the priority list. - """, - ).tag(config=True) - - merge_completions = Bool( - True, - help="""Whether to merge completion results into a single list - - If False, only the completion results from the first non-empty - completer will be returned. - - As of version 8.6.0, setting the value to ``False`` is an alias for: - ``IPCompleter.suppress_competing_matchers = True.``. - """, - ).tag(config=True) - - disable_matchers = ListTrait( - Unicode(), - help="""List of matchers to disable. - - The list should contain matcher identifiers (see :any:`completion_matcher`). - """, - ).tag(config=True) - - omit__names = Enum( - (0, 1, 2), - default_value=2, - help="""Instruct the completer to omit private method names - - Specifically, when completing on ``object.``. - - When 2 [default]: all names that start with '_' will be excluded. - - When 1: all 'magic' names (``__foo__``) will be excluded. - - When 0: nothing will be excluded. - """ - ).tag(config=True) - limit_to__all__ = Bool(False, - help=""" - DEPRECATED as of version 5.0. - - Instruct the completer to use __all__ for the completion - - Specifically, when completing on ``object.``. - - When True: only those names in obj.__all__ will be included. - - When False [default]: the __all__ attribute is ignored - """, - ).tag(config=True) - - profile_completions = Bool( - default_value=False, - help="If True, emit profiling data for completion subsystem using cProfile." - ).tag(config=True) - - profiler_output_dir = Unicode( - default_value=".completion_profiles", - help="Template for path at which to output profile data for completions." - ).tag(config=True) - - @observe('limit_to__all__') - def _limit_to_all_changed(self, change): - warnings.warn('`IPython.core.IPCompleter.limit_to__all__` configuration ' - 'value has been deprecated since IPython 5.0, will be made to have ' - 'no effects and then removed in future version of IPython.', - UserWarning) - - def __init__( - self, shell=None, namespace=None, global_namespace=None, config=None, **kwargs - ): - """IPCompleter() -> completer - - Return a completer object. - - Parameters - ---------- - shell - a pointer to the ipython shell itself. This is needed - because this completer knows about magic functions, and those can - only be accessed via the ipython instance. - namespace : dict, optional - an optional dict where completions are performed. - global_namespace : dict, optional - secondary optional dict for completions, to - handle cases (such as IPython embedded inside functions) where - both Python scopes are visible. - config : Config - traitlet's config object - **kwargs - passed to super class unmodified. - """ - - self.magic_escape = ESC_MAGIC - self.splitter = CompletionSplitter() - - # _greedy_changed() depends on splitter and readline being defined: - super().__init__( - namespace=namespace, - global_namespace=global_namespace, - config=config, - **kwargs, - ) - - # List where completion matches will be stored - self.matches = [] - self.shell = shell - # Regexp to split filenames with spaces in them - self.space_name_re = re.compile(r'([^\\] )') - # Hold a local ref. to glob.glob for speed - self.glob = glob.glob - - # Determine if we are running on 'dumb' terminals, like (X)Emacs - # buffers, to avoid completion problems. - term = os.environ.get('TERM','xterm') - self.dumb_terminal = term in ['dumb','emacs'] - - # Special handling of backslashes needed in win32 platforms - if sys.platform == "win32": - self.clean_glob = self._clean_glob_win32 - else: - self.clean_glob = self._clean_glob - - #regexp to parse docstring for function signature - self.docstring_sig_re = re.compile(r'^[\w|\s.]+\(([^)]*)\).*') - self.docstring_kwd_re = re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)') - #use this if positional argument name is also needed - #= re.compile(r'[\s|\[]*(\w+)(?:\s*=?\s*.*)') - - self.magic_arg_matchers = [ - self.magic_config_matcher, - self.magic_color_matcher, - ] - - # This is set externally by InteractiveShell - self.custom_completers = None - - # This is a list of names of unicode characters that can be completed - # into their corresponding unicode value. The list is large, so we - # lazily initialize it on first use. Consuming code should access this - # attribute through the `@unicode_names` property. - self._unicode_names = None - - self._backslash_combining_matchers = [ - self.latex_name_matcher, - self.unicode_name_matcher, - back_latex_name_matcher, - back_unicode_name_matcher, - self.fwd_unicode_matcher, - ] - - if not self.backslash_combining_completions: - for matcher in self._backslash_combining_matchers: - self.disable_matchers.append(_get_matcher_id(matcher)) - - if not self.merge_completions: - self.suppress_competing_matchers = True - - @property - def matchers(self) -> List[Matcher]: - """All active matcher routines for completion""" - if self.dict_keys_only: - return [self.dict_key_matcher] - - if self.use_jedi: - return [ - *self.custom_matchers, - *self._backslash_combining_matchers, - *self.magic_arg_matchers, - self.custom_completer_matcher, - self.magic_matcher, - self._jedi_matcher, - self.dict_key_matcher, - self.file_matcher, - ] - else: - return [ - *self.custom_matchers, - *self._backslash_combining_matchers, - *self.magic_arg_matchers, - self.custom_completer_matcher, - self.dict_key_matcher, - self.magic_matcher, - self.python_matcher, - self.file_matcher, - self.python_func_kw_matcher, - ] - - def all_completions(self, text:str) -> List[str]: - """ - Wrapper around the completion methods for the benefit of emacs. - """ - prefix = text.rpartition('.')[0] - with provisionalcompleter(): - return ['.'.join([prefix, c.text]) if prefix and self.use_jedi else c.text - for c in self.completions(text, len(text))] - - return self.complete(text)[1] - - def _clean_glob(self, text:str): - return self.glob("%s*" % text) - - def _clean_glob_win32(self, text:str): - return [f.replace("\\","/") - for f in self.glob("%s*" % text)] - - @context_matcher() - def file_matcher(self, context: CompletionContext) -> SimpleMatcherResult: - """Same as :any:`file_matches`, but adopted to new Matcher API.""" - matches = self.file_matches(context.token) - # TODO: add a heuristic for suppressing (e.g. if it has OS-specific delimiter, - # starts with `/home/`, `C:\`, etc) - return _convert_matcher_v1_result_to_v2(matches, type="path") - - def file_matches(self, text: str) -> List[str]: - """Match filenames, expanding ~USER type strings. - - Most of the seemingly convoluted logic in this completer is an - attempt to handle filenames with spaces in them. And yet it's not - quite perfect, because Python's readline doesn't expose all of the - GNU readline details needed for this to be done correctly. - - For a filename with a space in it, the printed completions will be - only the parts after what's already been typed (instead of the - full completions, as is normally done). I don't think with the - current (as of Python 2.3) Python readline it's possible to do - better. - - .. deprecated:: 8.6 - You can use :meth:`file_matcher` instead. - """ - - # chars that require escaping with backslash - i.e. chars - # that readline treats incorrectly as delimiters, but we - # don't want to treat as delimiters in filename matching - # when escaped with backslash - if text.startswith('!'): - text = text[1:] - text_prefix = u'!' - else: - text_prefix = u'' - - text_until_cursor = self.text_until_cursor - # track strings with open quotes - open_quotes = has_open_quotes(text_until_cursor) - - if '(' in text_until_cursor or '[' in text_until_cursor: - lsplit = text - else: - try: - # arg_split ~ shlex.split, but with unicode bugs fixed by us - lsplit = arg_split(text_until_cursor)[-1] - except ValueError: - # typically an unmatched ", or backslash without escaped char. - if open_quotes: - lsplit = text_until_cursor.split(open_quotes)[-1] - else: - return [] - except IndexError: - # tab pressed on empty line - lsplit = "" - - if not open_quotes and lsplit != protect_filename(lsplit): - # if protectables are found, do matching on the whole escaped name - has_protectables = True - text0,text = text,lsplit - else: - has_protectables = False - text = os.path.expanduser(text) - - if text == "": - return [text_prefix + protect_filename(f) for f in self.glob("*")] - - # Compute the matches from the filesystem - if sys.platform == 'win32': - m0 = self.clean_glob(text) - else: - m0 = self.clean_glob(text.replace('\\', '')) - - if has_protectables: - # If we had protectables, we need to revert our changes to the - # beginning of filename so that we don't double-write the part - # of the filename we have so far - len_lsplit = len(lsplit) - matches = [text_prefix + text0 + - protect_filename(f[len_lsplit:]) for f in m0] - else: - if open_quotes: - # if we have a string with an open quote, we don't need to - # protect the names beyond the quote (and we _shouldn't_, as - # it would cause bugs when the filesystem call is made). - matches = m0 if sys.platform == "win32" else\ - [protect_filename(f, open_quotes) for f in m0] - else: - matches = [text_prefix + - protect_filename(f) for f in m0] - - # Mark directories in input list by appending '/' to their names. - return [x+'/' if os.path.isdir(x) else x for x in matches] - - @context_matcher() - def magic_matcher(self, context: CompletionContext) -> SimpleMatcherResult: - """Match magics.""" - text = context.token - matches = self.magic_matches(text) - result = _convert_matcher_v1_result_to_v2(matches, type="magic") - is_magic_prefix = len(text) > 0 and text[0] == "%" - result["suppress"] = is_magic_prefix and bool(result["completions"]) - return result - - def magic_matches(self, text: str) -> List[str]: - """Match magics. - - .. deprecated:: 8.6 - You can use :meth:`magic_matcher` instead. - """ - # Get all shell magics now rather than statically, so magics loaded at - # runtime show up too. - lsm = self.shell.magics_manager.lsmagic() - line_magics = lsm['line'] - cell_magics = lsm['cell'] - pre = self.magic_escape - pre2 = pre+pre - - explicit_magic = text.startswith(pre) - - # Completion logic: - # - user gives %%: only do cell magics - # - user gives %: do both line and cell magics - # - no prefix: do both - # In other words, line magics are skipped if the user gives %% explicitly - # - # We also exclude magics that match any currently visible names: - # https://github.com/ipython/ipython/issues/4877, unless the user has - # typed a %: - # https://github.com/ipython/ipython/issues/10754 - bare_text = text.lstrip(pre) - global_matches = self.global_matches(bare_text) - if not explicit_magic: - def matches(magic): - """ - Filter magics, in particular remove magics that match - a name present in global namespace. - """ - return ( magic.startswith(bare_text) and - magic not in global_matches ) - else: - def matches(magic): - return magic.startswith(bare_text) - - comp = [ pre2+m for m in cell_magics if matches(m)] - if not text.startswith(pre2): - comp += [ pre+m for m in line_magics if matches(m)] - - return comp - - @context_matcher() - def magic_config_matcher(self, context: CompletionContext) -> SimpleMatcherResult: - """Match class names and attributes for %config magic.""" - # NOTE: uses `line_buffer` equivalent for compatibility - matches = self.magic_config_matches(context.line_with_cursor) - return _convert_matcher_v1_result_to_v2(matches, type="param") - - def magic_config_matches(self, text: str) -> List[str]: - """Match class names and attributes for %config magic. - - .. deprecated:: 8.6 - You can use :meth:`magic_config_matcher` instead. - """ - texts = text.strip().split() - - if len(texts) > 0 and (texts[0] == 'config' or texts[0] == '%config'): - # get all configuration classes - classes = sorted(set([ c for c in self.shell.configurables - if c.__class__.class_traits(config=True) - ]), key=lambda x: x.__class__.__name__) - classnames = [ c.__class__.__name__ for c in classes ] - - # return all classnames if config or %config is given - if len(texts) == 1: - return classnames - - # match classname - classname_texts = texts[1].split('.') - classname = classname_texts[0] - classname_matches = [ c for c in classnames - if c.startswith(classname) ] - - # return matched classes or the matched class with attributes - if texts[1].find('.') < 0: - return classname_matches - elif len(classname_matches) == 1 and \ - classname_matches[0] == classname: - cls = classes[classnames.index(classname)].__class__ - help = cls.class_get_help() - # strip leading '--' from cl-args: - help = re.sub(re.compile(r'^--', re.MULTILINE), '', help) - return [ attr.split('=')[0] - for attr in help.strip().splitlines() - if attr.startswith(texts[1]) ] - return [] - - @context_matcher() - def magic_color_matcher(self, context: CompletionContext) -> SimpleMatcherResult: - """Match color schemes for %colors magic.""" - # NOTE: uses `line_buffer` equivalent for compatibility - matches = self.magic_color_matches(context.line_with_cursor) - return _convert_matcher_v1_result_to_v2(matches, type="param") - - def magic_color_matches(self, text: str) -> List[str]: - """Match color schemes for %colors magic. - - .. deprecated:: 8.6 - You can use :meth:`magic_color_matcher` instead. - """ - texts = text.split() - if text.endswith(' '): - # .split() strips off the trailing whitespace. Add '' back - # so that: '%colors ' -> ['%colors', ''] - texts.append('') - - if len(texts) == 2 and (texts[0] == 'colors' or texts[0] == '%colors'): - prefix = texts[1] - return [ color for color in InspectColors.keys() - if color.startswith(prefix) ] - return [] - - @context_matcher(identifier="IPCompleter.jedi_matcher") - def _jedi_matcher(self, context: CompletionContext) -> _JediMatcherResult: - matches = self._jedi_matches( - cursor_column=context.cursor_position, - cursor_line=context.cursor_line, - text=context.full_text, - ) - return { - "completions": matches, - # static analysis should not suppress other matchers - "suppress": False, - } - - def _jedi_matches( - self, cursor_column: int, cursor_line: int, text: str - ) -> Iterator[_JediCompletionLike]: - """ - Return a list of :any:`jedi.api.Completion`\\s object from a ``text`` and - cursor position. - - Parameters - ---------- - cursor_column : int - column position of the cursor in ``text``, 0-indexed. - cursor_line : int - line position of the cursor in ``text``, 0-indexed - text : str - text to complete - - Notes - ----- - If ``IPCompleter.debug`` is ``True`` may return a :any:`_FakeJediCompletion` - object containing a string with the Jedi debug information attached. - - .. deprecated:: 8.6 - You can use :meth:`_jedi_matcher` instead. - """ - namespaces = [self.namespace] - if self.global_namespace is not None: - namespaces.append(self.global_namespace) - - completion_filter = lambda x:x - offset = cursor_to_position(text, cursor_line, cursor_column) - # filter output if we are completing for object members - if offset: - pre = text[offset-1] - if pre == '.': - if self.omit__names == 2: - completion_filter = lambda c:not c.name.startswith('_') - elif self.omit__names == 1: - completion_filter = lambda c:not (c.name.startswith('__') and c.name.endswith('__')) - elif self.omit__names == 0: - completion_filter = lambda x:x - else: - raise ValueError("Don't understand self.omit__names == {}".format(self.omit__names)) - - interpreter = jedi.Interpreter(text[:offset], namespaces) - try_jedi = True - - try: - # find the first token in the current tree -- if it is a ' or " then we are in a string - completing_string = False - try: - first_child = next(c for c in interpreter._get_module().tree_node.children if hasattr(c, 'value')) - except StopIteration: - pass - else: - # note the value may be ', ", or it may also be ''' or """, or - # in some cases, """what/you/typed..., but all of these are - # strings. - completing_string = len(first_child.value) > 0 and first_child.value[0] in {"'", '"'} - - # if we are in a string jedi is likely not the right candidate for - # now. Skip it. - try_jedi = not completing_string - except Exception as e: - # many of things can go wrong, we are using private API just don't crash. - if self.debug: - print("Error detecting if completing a non-finished string :", e, '|') - - if not try_jedi: - return iter([]) - try: - return filter(completion_filter, interpreter.complete(column=cursor_column, line=cursor_line + 1)) - except Exception as e: - if self.debug: - return iter( - [ - _FakeJediCompletion( - 'Oops Jedi has crashed, please report a bug with the following:\n"""\n%s\ns"""' - % (e) - ) - ] - ) - else: - return iter([]) - - @context_matcher() - def python_matcher(self, context: CompletionContext) -> SimpleMatcherResult: - """Match attributes or global python names""" - text = context.line_with_cursor - if "." in text: - try: - matches, fragment = self._attr_matches(text, include_prefix=False) - if text.endswith(".") and self.omit__names: - if self.omit__names == 1: - # true if txt is _not_ a __ name, false otherwise: - no__name = lambda txt: re.match(r".*\.__.*?__", txt) is None - else: - # true if txt is _not_ a _ name, false otherwise: - no__name = ( - lambda txt: re.match(r"\._.*?", txt[txt.rindex(".") :]) - is None - ) - matches = filter(no__name, matches) - return _convert_matcher_v1_result_to_v2( - matches, type="attribute", fragment=fragment - ) - except NameError: - # catches . - matches = [] - return _convert_matcher_v1_result_to_v2(matches, type="attribute") - else: - matches = self.global_matches(context.token) - # TODO: maybe distinguish between functions, modules and just "variables" - return _convert_matcher_v1_result_to_v2(matches, type="variable") - - @completion_matcher(api_version=1) - def python_matches(self, text: str) -> Iterable[str]: - """Match attributes or global python names. - - .. deprecated:: 8.27 - You can use :meth:`python_matcher` instead.""" - if "." in text: - try: - matches = self.attr_matches(text) - if text.endswith('.') and self.omit__names: - if self.omit__names == 1: - # true if txt is _not_ a __ name, false otherwise: - no__name = (lambda txt: - re.match(r'.*\.__.*?__',txt) is None) - else: - # true if txt is _not_ a _ name, false otherwise: - no__name = (lambda txt: - re.match(r'\._.*?',txt[txt.rindex('.'):]) is None) - matches = filter(no__name, matches) - except NameError: - # catches . - matches = [] - else: - matches = self.global_matches(text) - return matches - - def _default_arguments_from_docstring(self, doc): - """Parse the first line of docstring for call signature. - - Docstring should be of the form 'min(iterable[, key=func])\n'. - It can also parse cython docstring of the form - 'Minuit.migrad(self, int ncall=10000, resume=True, int nsplit=1)'. - """ - if doc is None: - return [] - - #care only the firstline - line = doc.lstrip().splitlines()[0] - - #p = re.compile(r'^[\w|\s.]+\(([^)]*)\).*') - #'min(iterable[, key=func])\n' -> 'iterable[, key=func]' - sig = self.docstring_sig_re.search(line) - if sig is None: - return [] - # iterable[, key=func]' -> ['iterable[' ,' key=func]'] - sig = sig.groups()[0].split(',') - ret = [] - for s in sig: - #re.compile(r'[\s|\[]*(\w+)(?:\s*=\s*.*)') - ret += self.docstring_kwd_re.findall(s) - return ret - - def _default_arguments(self, obj): - """Return the list of default arguments of obj if it is callable, - or empty list otherwise.""" - call_obj = obj - ret = [] - if inspect.isbuiltin(obj): - pass - elif not (inspect.isfunction(obj) or inspect.ismethod(obj)): - if inspect.isclass(obj): - #for cython embedsignature=True the constructor docstring - #belongs to the object itself not __init__ - ret += self._default_arguments_from_docstring( - getattr(obj, '__doc__', '')) - # for classes, check for __init__,__new__ - call_obj = (getattr(obj, '__init__', None) or - getattr(obj, '__new__', None)) - # for all others, check if they are __call__able - elif hasattr(obj, '__call__'): - call_obj = obj.__call__ - ret += self._default_arguments_from_docstring( - getattr(call_obj, '__doc__', '')) - - _keeps = (inspect.Parameter.KEYWORD_ONLY, - inspect.Parameter.POSITIONAL_OR_KEYWORD) - - try: - sig = inspect.signature(obj) - ret.extend(k for k, v in sig.parameters.items() if - v.kind in _keeps) - except ValueError: - pass - - return list(set(ret)) - - @context_matcher() - def python_func_kw_matcher(self, context: CompletionContext) -> SimpleMatcherResult: - """Match named parameters (kwargs) of the last open function.""" - matches = self.python_func_kw_matches(context.token) - return _convert_matcher_v1_result_to_v2(matches, type="param") - - def python_func_kw_matches(self, text): - """Match named parameters (kwargs) of the last open function. - - .. deprecated:: 8.6 - You can use :meth:`python_func_kw_matcher` instead. - """ - - if "." in text: # a parameter cannot be dotted - return [] - try: regexp = self.__funcParamsRegex - except AttributeError: - regexp = self.__funcParamsRegex = re.compile(r''' - '.*?(?,a=1)", the candidate is "foo" - tokens = regexp.findall(self.text_until_cursor) - iterTokens = reversed(tokens) - openPar = 0 - - for token in iterTokens: - if token == ')': - openPar -= 1 - elif token == '(': - openPar += 1 - if openPar > 0: - # found the last unclosed parenthesis - break - else: - return [] - # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" ) - ids = [] - isId = re.compile(r'\w+$').match - - while True: - try: - ids.append(next(iterTokens)) - if not isId(ids[-1]): - ids.pop() - break - if not next(iterTokens) == '.': - break - except StopIteration: - break - - # Find all named arguments already assigned to, as to avoid suggesting - # them again - usedNamedArgs = set() - par_level = -1 - for token, next_token in zip(tokens, tokens[1:]): - if token == '(': - par_level += 1 - elif token == ')': - par_level -= 1 - - if par_level != 0: - continue - - if next_token != '=': - continue - - usedNamedArgs.add(token) - - argMatches = [] - try: - callableObj = '.'.join(ids[::-1]) - namedArgs = self._default_arguments(eval(callableObj, - self.namespace)) - - # Remove used named arguments from the list, no need to show twice - for namedArg in set(namedArgs) - usedNamedArgs: - if namedArg.startswith(text): - argMatches.append("%s=" %namedArg) - except: - pass - - return argMatches - - @staticmethod - def _get_keys(obj: Any) -> List[Any]: - # Objects can define their own completions by defining an - # _ipy_key_completions_() method. - method = get_real_method(obj, '_ipython_key_completions_') - if method is not None: - return method() - - # Special case some common in-memory dict-like types - if isinstance(obj, dict) or _safe_isinstance(obj, "pandas", "DataFrame"): - try: - return list(obj.keys()) - except Exception: - return [] - elif _safe_isinstance(obj, "pandas", "core", "indexing", "_LocIndexer"): - try: - return list(obj.obj.keys()) - except Exception: - return [] - elif _safe_isinstance(obj, 'numpy', 'ndarray') or\ - _safe_isinstance(obj, 'numpy', 'void'): - return obj.dtype.names or [] - return [] - - @context_matcher() - def dict_key_matcher(self, context: CompletionContext) -> SimpleMatcherResult: - """Match string keys in a dictionary, after e.g. ``foo[``.""" - matches = self.dict_key_matches(context.token) - return _convert_matcher_v1_result_to_v2( - matches, type="dict key", suppress_if_matches=True - ) - - def dict_key_matches(self, text: str) -> List[str]: - """Match string keys in a dictionary, after e.g. ``foo[``. - - .. deprecated:: 8.6 - You can use :meth:`dict_key_matcher` instead. - """ - - # Short-circuit on closed dictionary (regular expression would - # not match anyway, but would take quite a while). - if self.text_until_cursor.strip().endswith("]"): - return [] - - match = DICT_MATCHER_REGEX.search(self.text_until_cursor) - - if match is None: - return [] - - expr, prior_tuple_keys, key_prefix = match.groups() - - obj = self._evaluate_expr(expr) - - if obj is not_found: - return [] - - keys = self._get_keys(obj) - if not keys: - return keys - - tuple_prefix = guarded_eval( - prior_tuple_keys, - EvaluationContext( - globals=self.global_namespace, - locals=self.namespace, - evaluation=self.evaluation, # type: ignore - in_subscript=True, - ), - ) - - closing_quote, token_offset, matches = match_dict_keys( - keys, key_prefix, self.splitter.delims, extra_prefix=tuple_prefix - ) - if not matches: - return [] - - # get the cursor position of - # - the text being completed - # - the start of the key text - # - the start of the completion - text_start = len(self.text_until_cursor) - len(text) - if key_prefix: - key_start = match.start(3) - completion_start = key_start + token_offset - else: - key_start = completion_start = match.end() - - # grab the leading prefix, to make sure all completions start with `text` - if text_start > key_start: - leading = '' - else: - leading = text[text_start:completion_start] - - # append closing quote and bracket as appropriate - # this is *not* appropriate if the opening quote or bracket is outside - # the text given to this method, e.g. `d["""a\nt - can_close_quote = False - can_close_bracket = False - - continuation = self.line_buffer[len(self.text_until_cursor) :].strip() - - if continuation.startswith(closing_quote): - # do not close if already closed, e.g. `d['a'` - continuation = continuation[len(closing_quote) :] - else: - can_close_quote = True - - continuation = continuation.strip() - - # e.g. `pandas.DataFrame` has different tuple indexer behaviour, - # handling it is out of scope, so let's avoid appending suffixes. - has_known_tuple_handling = isinstance(obj, dict) - - can_close_bracket = ( - not continuation.startswith("]") and self.auto_close_dict_keys - ) - can_close_tuple_item = ( - not continuation.startswith(",") - and has_known_tuple_handling - and self.auto_close_dict_keys - ) - can_close_quote = can_close_quote and self.auto_close_dict_keys - - # fast path if closing quote should be appended but not suffix is allowed - if not can_close_quote and not can_close_bracket and closing_quote: - return [leading + k for k in matches] - - results = [] - - end_of_tuple_or_item = _DictKeyState.END_OF_TUPLE | _DictKeyState.END_OF_ITEM - - for k, state_flag in matches.items(): - result = leading + k - if can_close_quote and closing_quote: - result += closing_quote - - if state_flag == end_of_tuple_or_item: - # We do not know which suffix to add, - # e.g. both tuple item and string - # match this item. - pass - - if state_flag in end_of_tuple_or_item and can_close_bracket: - result += "]" - if state_flag == _DictKeyState.IN_TUPLE and can_close_tuple_item: - result += ", " - results.append(result) - return results - - @context_matcher() - def unicode_name_matcher(self, context: CompletionContext): - """Same as :any:`unicode_name_matches`, but adopted to new Matcher API.""" - fragment, matches = self.unicode_name_matches(context.text_until_cursor) - return _convert_matcher_v1_result_to_v2( - matches, type="unicode", fragment=fragment, suppress_if_matches=True - ) - - @staticmethod - def unicode_name_matches(text: str) -> Tuple[str, List[str]]: - """Match Latex-like syntax for unicode characters base - on the name of the character. - - This does ``\\GREEK SMALL LETTER ETA`` -> ``η`` - - Works only on valid python 3 identifier, or on combining characters that - will combine to form a valid identifier. - """ - slashpos = text.rfind('\\') - if slashpos > -1: - s = text[slashpos+1:] - try : - unic = unicodedata.lookup(s) - # allow combining chars - if ('a'+unic).isidentifier(): - return '\\'+s,[unic] - except KeyError: - pass - return '', [] - - @context_matcher() - def latex_name_matcher(self, context: CompletionContext): - """Match Latex syntax for unicode characters. - - This does both ``\\alp`` -> ``\\alpha`` and ``\\alpha`` -> ``α`` - """ - fragment, matches = self.latex_matches(context.text_until_cursor) - return _convert_matcher_v1_result_to_v2( - matches, type="latex", fragment=fragment, suppress_if_matches=True - ) - - def latex_matches(self, text: str) -> Tuple[str, Sequence[str]]: - """Match Latex syntax for unicode characters. - - This does both ``\\alp`` -> ``\\alpha`` and ``\\alpha`` -> ``α`` - - .. deprecated:: 8.6 - You can use :meth:`latex_name_matcher` instead. - """ - slashpos = text.rfind('\\') - if slashpos > -1: - s = text[slashpos:] - if s in latex_symbols: - # Try to complete a full latex symbol to unicode - # \\alpha -> α - return s, [latex_symbols[s]] - else: - # If a user has partially typed a latex symbol, give them - # a full list of options \al -> [\aleph, \alpha] - matches = [k for k in latex_symbols if k.startswith(s)] - if matches: - return s, matches - return '', () - - @context_matcher() - def custom_completer_matcher(self, context): - """Dispatch custom completer. - - If a match is found, suppresses all other matchers except for Jedi. - """ - matches = self.dispatch_custom_completer(context.token) or [] - result = _convert_matcher_v1_result_to_v2( - matches, type=_UNKNOWN_TYPE, suppress_if_matches=True - ) - result["ordered"] = True - result["do_not_suppress"] = {_get_matcher_id(self._jedi_matcher)} - return result - - def dispatch_custom_completer(self, text): - """ - .. deprecated:: 8.6 - You can use :meth:`custom_completer_matcher` instead. - """ - if not self.custom_completers: - return - - line = self.line_buffer - if not line.strip(): - return None - - # Create a little structure to pass all the relevant information about - # the current completion to any custom completer. - event = SimpleNamespace() - event.line = line - event.symbol = text - cmd = line.split(None,1)[0] - event.command = cmd - event.text_until_cursor = self.text_until_cursor - - # for foo etc, try also to find completer for %foo - if not cmd.startswith(self.magic_escape): - try_magic = self.custom_completers.s_matches( - self.magic_escape + cmd) - else: - try_magic = [] - - for c in itertools.chain(self.custom_completers.s_matches(cmd), - try_magic, - self.custom_completers.flat_matches(self.text_until_cursor)): - try: - res = c(event) - if res: - # first, try case sensitive match - withcase = [r for r in res if r.startswith(text)] - if withcase: - return withcase - # if none, then case insensitive ones are ok too - text_low = text.lower() - return [r for r in res if r.lower().startswith(text_low)] - except TryNext: - pass - except KeyboardInterrupt: - """ - If custom completer take too long, - let keyboard interrupt abort and return nothing. - """ - break - - return None - - def completions(self, text: str, offset: int)->Iterator[Completion]: - """ - Returns an iterator over the possible completions - - .. warning:: - - Unstable - - This function is unstable, API may change without warning. - It will also raise unless use in proper context manager. - - Parameters - ---------- - text : str - Full text of the current input, multi line string. - offset : int - Integer representing the position of the cursor in ``text``. Offset - is 0-based indexed. - - Yields - ------ - Completion - - Notes - ----- - The cursor on a text can either be seen as being "in between" - characters or "On" a character depending on the interface visible to - the user. For consistency the cursor being on "in between" characters X - and Y is equivalent to the cursor being "on" character Y, that is to say - the character the cursor is on is considered as being after the cursor. - - Combining characters may span more that one position in the - text. - - .. note:: - - If ``IPCompleter.debug`` is :any:`True` will yield a ``--jedi/ipython--`` - fake Completion token to distinguish completion returned by Jedi - and usual IPython completion. - - .. note:: - - Completions are not completely deduplicated yet. If identical - completions are coming from different sources this function does not - ensure that each completion object will only be present once. - """ - warnings.warn("_complete is a provisional API (as of IPython 6.0). " - "It may change without warnings. " - "Use in corresponding context manager.", - category=ProvisionalCompleterWarning, stacklevel=2) - - seen = set() - profiler:Optional[cProfile.Profile] - try: - if self.profile_completions: - import cProfile - profiler = cProfile.Profile() - profiler.enable() - else: - profiler = None - - for c in self._completions(text, offset, _timeout=self.jedi_compute_type_timeout/1000): - if c and (c in seen): - continue - yield c - seen.add(c) - except KeyboardInterrupt: - """if completions take too long and users send keyboard interrupt, - do not crash and return ASAP. """ - pass - finally: - if profiler is not None: - profiler.disable() - ensure_dir_exists(self.profiler_output_dir) - output_path = os.path.join(self.profiler_output_dir, str(uuid.uuid4())) - print("Writing profiler output to", output_path) - profiler.dump_stats(output_path) - - def _completions(self, full_text: str, offset: int, *, _timeout) -> Iterator[Completion]: - """ - Core completion module.Same signature as :any:`completions`, with the - extra `timeout` parameter (in seconds). - - Computing jedi's completion ``.type`` can be quite expensive (it is a - lazy property) and can require some warm-up, more warm up than just - computing the ``name`` of a completion. The warm-up can be : - - - Long warm-up the first time a module is encountered after - install/update: actually build parse/inference tree. - - - first time the module is encountered in a session: load tree from - disk. - - We don't want to block completions for tens of seconds so we give the - completer a "budget" of ``_timeout`` seconds per invocation to compute - completions types, the completions that have not yet been computed will - be marked as "unknown" an will have a chance to be computed next round - are things get cached. - - Keep in mind that Jedi is not the only thing treating the completion so - keep the timeout short-ish as if we take more than 0.3 second we still - have lots of processing to do. - - """ - deadline = time.monotonic() + _timeout - - before = full_text[:offset] - cursor_line, cursor_column = position_to_cursor(full_text, offset) - - jedi_matcher_id = _get_matcher_id(self._jedi_matcher) - - def is_non_jedi_result( - result: MatcherResult, identifier: str - ) -> TypeGuard[SimpleMatcherResult]: - return identifier != jedi_matcher_id - - results = self._complete( - full_text=full_text, cursor_line=cursor_line, cursor_pos=cursor_column - ) - - non_jedi_results: Dict[str, SimpleMatcherResult] = { - identifier: result - for identifier, result in results.items() - if is_non_jedi_result(result, identifier) - } - - jedi_matches = ( - cast(_JediMatcherResult, results[jedi_matcher_id])["completions"] - if jedi_matcher_id in results - else () - ) - - iter_jm = iter(jedi_matches) - if _timeout: - for jm in iter_jm: - try: - type_ = jm.type - except Exception: - if self.debug: - print("Error in Jedi getting type of ", jm) - type_ = None - delta = len(jm.name_with_symbols) - len(jm.complete) - if type_ == 'function': - signature = _make_signature(jm) - else: - signature = '' - yield Completion(start=offset - delta, - end=offset, - text=jm.name_with_symbols, - type=type_, - signature=signature, - _origin='jedi') - - if time.monotonic() > deadline: - break - - for jm in iter_jm: - delta = len(jm.name_with_symbols) - len(jm.complete) - yield Completion( - start=offset - delta, - end=offset, - text=jm.name_with_symbols, - type=_UNKNOWN_TYPE, # don't compute type for speed - _origin="jedi", - signature="", - ) - - # TODO: - # Suppress this, right now just for debug. - if jedi_matches and non_jedi_results and self.debug: - some_start_offset = before.rfind( - next(iter(non_jedi_results.values()))["matched_fragment"] - ) - yield Completion( - start=some_start_offset, - end=offset, - text="--jedi/ipython--", - _origin="debug", - type="none", - signature="", - ) - - ordered: List[Completion] = [] - sortable: List[Completion] = [] - - for origin, result in non_jedi_results.items(): - matched_text = result["matched_fragment"] - start_offset = before.rfind(matched_text) - is_ordered = result.get("ordered", False) - container = ordered if is_ordered else sortable - - # I'm unsure if this is always true, so let's assert and see if it - # crash - assert before.endswith(matched_text) - - for simple_completion in result["completions"]: - completion = Completion( - start=start_offset, - end=offset, - text=simple_completion.text, - _origin=origin, - signature="", - type=simple_completion.type or _UNKNOWN_TYPE, - ) - container.append(completion) - - yield from list(self._deduplicate(ordered + self._sort(sortable)))[ - :MATCHES_LIMIT - ] - - def complete(self, text=None, line_buffer=None, cursor_pos=None) -> Tuple[str, Sequence[str]]: - """Find completions for the given text and line context. - - Note that both the text and the line_buffer are optional, but at least - one of them must be given. - - Parameters - ---------- - text : string, optional - Text to perform the completion on. If not given, the line buffer - is split using the instance's CompletionSplitter object. - line_buffer : string, optional - If not given, the completer attempts to obtain the current line - buffer via readline. This keyword allows clients which are - requesting for text completions in non-readline contexts to inform - the completer of the entire text. - cursor_pos : int, optional - Index of the cursor in the full line buffer. Should be provided by - remote frontends where kernel has no access to frontend state. - - Returns - ------- - Tuple of two items: - text : str - Text that was actually used in the completion. - matches : list - A list of completion matches. - - Notes - ----- - This API is likely to be deprecated and replaced by - :any:`IPCompleter.completions` in the future. - - """ - warnings.warn('`Completer.complete` is pending deprecation since ' - 'IPython 6.0 and will be replaced by `Completer.completions`.', - PendingDeprecationWarning) - # potential todo, FOLD the 3rd throw away argument of _complete - # into the first 2 one. - # TODO: Q: does the above refer to jedi completions (i.e. 0-indexed?) - # TODO: should we deprecate now, or does it stay? - - results = self._complete( - line_buffer=line_buffer, cursor_pos=cursor_pos, text=text, cursor_line=0 - ) - - jedi_matcher_id = _get_matcher_id(self._jedi_matcher) - - return self._arrange_and_extract( - results, - # TODO: can we confirm that excluding Jedi here was a deliberate choice in previous version? - skip_matchers={jedi_matcher_id}, - # this API does not support different start/end positions (fragments of token). - abort_if_offset_changes=True, - ) - - def _arrange_and_extract( - self, - results: Dict[str, MatcherResult], - skip_matchers: Set[str], - abort_if_offset_changes: bool, - ): - sortable: List[AnyMatcherCompletion] = [] - ordered: List[AnyMatcherCompletion] = [] - most_recent_fragment = None - for identifier, result in results.items(): - if identifier in skip_matchers: - continue - if not result["completions"]: - continue - if not most_recent_fragment: - most_recent_fragment = result["matched_fragment"] - if ( - abort_if_offset_changes - and result["matched_fragment"] != most_recent_fragment - ): - break - if result.get("ordered", False): - ordered.extend(result["completions"]) - else: - sortable.extend(result["completions"]) - - if not most_recent_fragment: - most_recent_fragment = "" # to satisfy typechecker (and just in case) - - return most_recent_fragment, [ - m.text for m in self._deduplicate(ordered + self._sort(sortable)) - ] - - def _complete(self, *, cursor_line, cursor_pos, line_buffer=None, text=None, - full_text=None) -> _CompleteResult: - """ - Like complete but can also returns raw jedi completions as well as the - origin of the completion text. This could (and should) be made much - cleaner but that will be simpler once we drop the old (and stateful) - :any:`complete` API. - - With current provisional API, cursor_pos act both (depending on the - caller) as the offset in the ``text`` or ``line_buffer``, or as the - ``column`` when passing multiline strings this could/should be renamed - but would add extra noise. - - Parameters - ---------- - cursor_line - Index of the line the cursor is on. 0 indexed. - cursor_pos - Position of the cursor in the current line/line_buffer/text. 0 - indexed. - line_buffer : optional, str - The current line the cursor is in, this is mostly due to legacy - reason that readline could only give a us the single current line. - Prefer `full_text`. - text : str - The current "token" the cursor is in, mostly also for historical - reasons. as the completer would trigger only after the current line - was parsed. - full_text : str - Full text of the current cell. - - Returns - ------- - An ordered dictionary where keys are identifiers of completion - matchers and values are ``MatcherResult``s. - """ - - # if the cursor position isn't given, the only sane assumption we can - # make is that it's at the end of the line (the common case) - if cursor_pos is None: - cursor_pos = len(line_buffer) if text is None else len(text) - - if self.use_main_ns: - self.namespace = __main__.__dict__ - - # if text is either None or an empty string, rely on the line buffer - if (not line_buffer) and full_text: - line_buffer = full_text.split('\n')[cursor_line] - if not text: # issue #11508: check line_buffer before calling split_line - text = ( - self.splitter.split_line(line_buffer, cursor_pos) if line_buffer else "" - ) - - # If no line buffer is given, assume the input text is all there was - if line_buffer is None: - line_buffer = text - - # deprecated - do not use `line_buffer` in new code. - self.line_buffer = line_buffer - self.text_until_cursor = self.line_buffer[:cursor_pos] - - if not full_text: - full_text = line_buffer - - context = CompletionContext( - full_text=full_text, - cursor_position=cursor_pos, - cursor_line=cursor_line, - token=text, - limit=MATCHES_LIMIT, - ) - - # Start with a clean slate of completions - results: Dict[str, MatcherResult] = {} - - jedi_matcher_id = _get_matcher_id(self._jedi_matcher) - - suppressed_matchers: Set[str] = set() - - matchers = { - _get_matcher_id(matcher): matcher - for matcher in sorted( - self.matchers, key=_get_matcher_priority, reverse=True - ) - } - - for matcher_id, matcher in matchers.items(): - matcher_id = _get_matcher_id(matcher) - - if matcher_id in self.disable_matchers: - continue - - if matcher_id in results: - warnings.warn(f"Duplicate matcher ID: {matcher_id}.") - - if matcher_id in suppressed_matchers: - continue - - result: MatcherResult - try: - if _is_matcher_v1(matcher): - result = _convert_matcher_v1_result_to_v2( - matcher(text), type=_UNKNOWN_TYPE - ) - elif _is_matcher_v2(matcher): - result = matcher(context) - else: - api_version = _get_matcher_api_version(matcher) - raise ValueError(f"Unsupported API version {api_version}") - except BaseException: - # Show the ugly traceback if the matcher causes an - # exception, but do NOT crash the kernel! - sys.excepthook(*sys.exc_info()) - continue - - # set default value for matched fragment if suffix was not selected. - result["matched_fragment"] = result.get("matched_fragment", context.token) - - if not suppressed_matchers: - suppression_recommended: Union[bool, Set[str]] = result.get( - "suppress", False - ) - - suppression_config = ( - self.suppress_competing_matchers.get(matcher_id, None) - if isinstance(self.suppress_competing_matchers, dict) - else self.suppress_competing_matchers - ) - should_suppress = ( - (suppression_config is True) - or (suppression_recommended and (suppression_config is not False)) - ) and has_any_completions(result) - - if should_suppress: - suppression_exceptions: Set[str] = result.get( - "do_not_suppress", set() - ) - if isinstance(suppression_recommended, Iterable): - to_suppress = set(suppression_recommended) - else: - to_suppress = set(matchers) - suppressed_matchers = to_suppress - suppression_exceptions - - new_results = {} - for previous_matcher_id, previous_result in results.items(): - if previous_matcher_id not in suppressed_matchers: - new_results[previous_matcher_id] = previous_result - results = new_results - - results[matcher_id] = result - - _, matches = self._arrange_and_extract( - results, - # TODO Jedi completions non included in legacy stateful API; was this deliberate or omission? - # if it was omission, we can remove the filtering step, otherwise remove this comment. - skip_matchers={jedi_matcher_id}, - abort_if_offset_changes=False, - ) - - # populate legacy stateful API - self.matches = matches - - return results - - @staticmethod - def _deduplicate( - matches: Sequence[AnyCompletion], - ) -> Iterable[AnyCompletion]: - filtered_matches: Dict[str, AnyCompletion] = {} - for match in matches: - text = match.text - if ( - text not in filtered_matches - or filtered_matches[text].type == _UNKNOWN_TYPE - ): - filtered_matches[text] = match - - return filtered_matches.values() - - @staticmethod - def _sort(matches: Sequence[AnyCompletion]): - return sorted(matches, key=lambda x: completions_sorting_key(x.text)) - - @context_matcher() - def fwd_unicode_matcher(self, context: CompletionContext): - """Same as :any:`fwd_unicode_match`, but adopted to new Matcher API.""" - # TODO: use `context.limit` to terminate early once we matched the maximum - # number that will be used downstream; can be added as an optional to - # `fwd_unicode_match(text: str, limit: int = None)` or we could re-implement here. - fragment, matches = self.fwd_unicode_match(context.text_until_cursor) - return _convert_matcher_v1_result_to_v2( - matches, type="unicode", fragment=fragment, suppress_if_matches=True - ) - - def fwd_unicode_match(self, text: str) -> Tuple[str, Sequence[str]]: - """ - Forward match a string starting with a backslash with a list of - potential Unicode completions. - - Will compute list of Unicode character names on first call and cache it. - - .. deprecated:: 8.6 - You can use :meth:`fwd_unicode_matcher` instead. - - Returns - ------- - At tuple with: - - matched text (empty if no matches) - - list of potential completions, empty tuple otherwise) - """ - # TODO: self.unicode_names is here a list we traverse each time with ~100k elements. - # We could do a faster match using a Trie. - - # Using pygtrie the following seem to work: - - # s = PrefixSet() - - # for c in range(0,0x10FFFF + 1): - # try: - # s.add(unicodedata.name(chr(c))) - # except ValueError: - # pass - # [''.join(k) for k in s.iter(prefix)] - - # But need to be timed and adds an extra dependency. - - slashpos = text.rfind('\\') - # if text starts with slash - if slashpos > -1: - # PERF: It's important that we don't access self._unicode_names - # until we're inside this if-block. _unicode_names is lazily - # initialized, and it takes a user-noticeable amount of time to - # initialize it, so we don't want to initialize it unless we're - # actually going to use it. - s = text[slashpos + 1 :] - sup = s.upper() - candidates = [x for x in self.unicode_names if x.startswith(sup)] - if candidates: - return s, candidates - candidates = [x for x in self.unicode_names if sup in x] - if candidates: - return s, candidates - splitsup = sup.split(" ") - candidates = [ - x for x in self.unicode_names if all(u in x for u in splitsup) - ] - if candidates: - return s, candidates - - return "", () - - # if text does not start with slash - else: - return '', () - - @property - def unicode_names(self) -> List[str]: - """List of names of unicode code points that can be completed. - - The list is lazily initialized on first access. - """ - if self._unicode_names is None: - names = [] - for c in range(0,0x10FFFF + 1): - try: - names.append(unicodedata.name(chr(c))) - except ValueError: - pass - self._unicode_names = _unicode_name_compute(_UNICODE_RANGES) - - return self._unicode_names - -def _unicode_name_compute(ranges:List[Tuple[int,int]]) -> List[str]: - names = [] - for start,stop in ranges: - for c in range(start, stop) : - try: - names.append(unicodedata.name(chr(c))) - except ValueError: - pass - return names diff --git a/.venv/lib/python3.12/site-packages/IPython/core/completerlib.py b/.venv/lib/python3.12/site-packages/IPython/core/completerlib.py deleted file mode 100644 index f15490f..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/completerlib.py +++ /dev/null @@ -1,382 +0,0 @@ -# encoding: utf-8 -"""Implementations for various useful completers. - -These are all loaded by default by IPython. -""" -#----------------------------------------------------------------------------- -# Copyright (C) 2010-2011 The IPython Development Team. -# -# Distributed under the terms of the BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -# Stdlib imports -import glob -import inspect -import os -import re -import sys -from importlib import import_module -from importlib.machinery import all_suffixes - - -# Third-party imports -from time import time -from zipimport import zipimporter - -# Our own imports -from .completer import expand_user, compress_user -from .error import TryNext -from ..utils._process_common import arg_split - -# FIXME: this should be pulled in with the right call via the component system -from IPython import get_ipython - -from typing import List - -#----------------------------------------------------------------------------- -# Globals and constants -#----------------------------------------------------------------------------- -_suffixes = all_suffixes() - -# Time in seconds after which the rootmodules will be stored permanently in the -# ipython ip.db database (kept in the user's .ipython dir). -TIMEOUT_STORAGE = 2 - -# Time in seconds after which we give up -TIMEOUT_GIVEUP = 20 - -# Regular expression for the python import statement -import_re = re.compile(r'(?P[^\W\d]\w*?)' - r'(?P[/\\]__init__)?' - r'(?P%s)$' % - r'|'.join(re.escape(s) for s in _suffixes)) - -# RE for the ipython %run command (python + ipython scripts) -magic_run_re = re.compile(r'.*(\.ipy|\.ipynb|\.py[w]?)$') - -#----------------------------------------------------------------------------- -# Local utilities -#----------------------------------------------------------------------------- - - -def module_list(path: str) -> List[str]: - """ - Return the list containing the names of the modules available in the given - folder. - """ - # sys.path has the cwd as an empty string, but isdir/listdir need it as '.' - if path == '': - path = '.' - - # A few local constants to be used in loops below - pjoin = os.path.join - - if os.path.isdir(path): - # Build a list of all files in the directory and all files - # in its subdirectories. For performance reasons, do not - # recurse more than one level into subdirectories. - files: List[str] = [] - for root, dirs, nondirs in os.walk(path, followlinks=True): - subdir = root[len(path)+1:] - if subdir: - files.extend(pjoin(subdir, f) for f in nondirs) - dirs[:] = [] # Do not recurse into additional subdirectories. - else: - files.extend(nondirs) - - else: - try: - files = list(zipimporter(path)._files.keys()) # type: ignore - except Exception: - files = [] - - # Build a list of modules which match the import_re regex. - modules = [] - for f in files: - m = import_re.match(f) - if m: - modules.append(m.group('name')) - return list(set(modules)) - - -def get_root_modules(): - """ - Returns a list containing the names of all the modules available in the - folders of the pythonpath. - - ip.db['rootmodules_cache'] maps sys.path entries to list of modules. - """ - ip = get_ipython() - if ip is None: - # No global shell instance to store cached list of modules. - # Don't try to scan for modules every time. - return list(sys.builtin_module_names) - - if getattr(ip.db, "_mock", False): - rootmodules_cache = {} - else: - rootmodules_cache = ip.db.get("rootmodules_cache", {}) - rootmodules = list(sys.builtin_module_names) - start_time = time() - store = False - for path in sys.path: - try: - modules = rootmodules_cache[path] - except KeyError: - modules = module_list(path) - try: - modules.remove('__init__') - except ValueError: - pass - if path not in ('', '.'): # cwd modules should not be cached - rootmodules_cache[path] = modules - if time() - start_time > TIMEOUT_STORAGE and not store: - store = True - print("\nCaching the list of root modules, please wait!") - print("(This will only be done once - type '%rehashx' to " - "reset cache!)\n") - sys.stdout.flush() - if time() - start_time > TIMEOUT_GIVEUP: - print("This is taking too long, we give up.\n") - return [] - rootmodules.extend(modules) - if store: - ip.db['rootmodules_cache'] = rootmodules_cache - rootmodules = list(set(rootmodules)) - return rootmodules - - -def is_importable(module, attr: str, only_modules) -> bool: - if only_modules: - try: - mod = getattr(module, attr) - except ModuleNotFoundError: - # See gh-14434 - return False - return inspect.ismodule(mod) - else: - return not(attr[:2] == '__' and attr[-2:] == '__') - -def is_possible_submodule(module, attr): - try: - obj = getattr(module, attr) - except AttributeError: - # Is possibly an unimported submodule - return True - except TypeError: - # https://github.com/ipython/ipython/issues/9678 - return False - return inspect.ismodule(obj) - - -def try_import(mod: str, only_modules=False) -> List[str]: - """ - Try to import given module and return list of potential completions. - """ - mod = mod.rstrip('.') - try: - m = import_module(mod) - except: - return [] - - m_is_init = '__init__' in (getattr(m, '__file__', '') or '') - - completions = [] - if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init: - completions.extend( [attr for attr in dir(m) if - is_importable(m, attr, only_modules)]) - - m_all = getattr(m, "__all__", []) - if only_modules: - completions.extend(attr for attr in m_all if is_possible_submodule(m, attr)) - else: - completions.extend(m_all) - - if m_is_init: - file_ = m.__file__ - file_path = os.path.dirname(file_) # type: ignore - if file_path is not None: - completions.extend(module_list(file_path)) - completions_set = {c for c in completions if isinstance(c, str)} - completions_set.discard('__init__') - return list(completions_set) - - -#----------------------------------------------------------------------------- -# Completion-related functions. -#----------------------------------------------------------------------------- - -def quick_completer(cmd, completions): - r""" Easily create a trivial completer for a command. - - Takes either a list of completions, or all completions in string (that will - be split on whitespace). - - Example:: - - [d:\ipython]|1> import ipy_completers - [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz']) - [d:\ipython]|3> foo b - bar baz - [d:\ipython]|3> foo ba - """ - - if isinstance(completions, str): - completions = completions.split() - - def do_complete(self, event): - return completions - - get_ipython().set_hook('complete_command',do_complete, str_key = cmd) - -def module_completion(line): - """ - Returns a list containing the completion possibilities for an import line. - - The line looks like this : - 'import xml.d' - 'from xml.dom import' - """ - - words = line.split(' ') - nwords = len(words) - - # from whatever -> 'import ' - if nwords == 3 and words[0] == 'from': - return ['import '] - - # 'from xy' or 'import xy' - if nwords < 3 and (words[0] in {'%aimport', 'import', 'from'}) : - if nwords == 1: - return get_root_modules() - mod = words[1].split('.') - if len(mod) < 2: - return get_root_modules() - completion_list = try_import('.'.join(mod[:-1]), True) - return ['.'.join(mod[:-1] + [el]) for el in completion_list] - - # 'from xyz import abc' - if nwords >= 3 and words[0] == 'from': - mod = words[1] - return try_import(mod) - -#----------------------------------------------------------------------------- -# Completers -#----------------------------------------------------------------------------- -# These all have the func(self, event) signature to be used as custom -# completers - -def module_completer(self,event): - """Give completions after user has typed 'import ...' or 'from ...'""" - - # This works in all versions of python. While 2.5 has - # pkgutil.walk_packages(), that particular routine is fairly dangerous, - # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full - # of possibly problematic side effects. - # This search the folders in the sys.path for available modules. - - return module_completion(event.line) - -# FIXME: there's a lot of logic common to the run, cd and builtin file -# completers, that is currently reimplemented in each. - -def magic_run_completer(self, event): - """Complete files that end in .py or .ipy or .ipynb for the %run command. - """ - comps = arg_split(event.line, strict=False) - # relpath should be the current token that we need to complete. - if (len(comps) > 1) and (not event.line.endswith(' ')): - relpath = comps[-1].strip("'\"") - else: - relpath = '' - - #print("\nev=", event) # dbg - #print("rp=", relpath) # dbg - #print('comps=', comps) # dbg - - lglob = glob.glob - isdir = os.path.isdir - relpath, tilde_expand, tilde_val = expand_user(relpath) - - # Find if the user has already typed the first filename, after which we - # should complete on all files, since after the first one other files may - # be arguments to the input script. - - if any(magic_run_re.match(c) for c in comps): - matches = [f.replace('\\','/') + ('/' if isdir(f) else '') - for f in lglob(relpath+'*')] - else: - dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*') if isdir(f)] - pys = [f.replace('\\','/') - for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') + - lglob(relpath+'*.ipynb') + lglob(relpath + '*.pyw')] - - matches = dirs + pys - - #print('run comp:', dirs+pys) # dbg - return [compress_user(p, tilde_expand, tilde_val) for p in matches] - - -def cd_completer(self, event): - """Completer function for cd, which only returns directories.""" - ip = get_ipython() - relpath = event.symbol - - #print(event) # dbg - if event.line.endswith('-b') or ' -b ' in event.line: - # return only bookmark completions - bkms = self.db.get('bookmarks', None) - if bkms: - return bkms.keys() - else: - return [] - - if event.symbol == '-': - width_dh = str(len(str(len(ip.user_ns['_dh']) + 1))) - # jump in directory history by number - fmt = '-%0' + width_dh +'d [%s]' - ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])] - if len(ents) > 1: - return ents - return [] - - if event.symbol.startswith('--'): - return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']] - - # Expand ~ in path and normalize directory separators. - relpath, tilde_expand, tilde_val = expand_user(relpath) - relpath = relpath.replace('\\','/') - - found = [] - for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*') - if os.path.isdir(f)]: - if ' ' in d: - # we don't want to deal with any of that, complex code - # for this is elsewhere - raise TryNext - - found.append(d) - - if not found: - if os.path.isdir(relpath): - return [compress_user(relpath, tilde_expand, tilde_val)] - - # if no completions so far, try bookmarks - bks = self.db.get('bookmarks',{}) - bkmatches = [s for s in bks if s.startswith(event.symbol)] - if bkmatches: - return bkmatches - - raise TryNext - - return [compress_user(p, tilde_expand, tilde_val) for p in found] - -def reset_completer(self, event): - "A completer for %reset magic" - return '-f -s in out array dhist'.split() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/crashhandler.py b/.venv/lib/python3.12/site-packages/IPython/core/crashhandler.py deleted file mode 100644 index 9c75c5d..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/crashhandler.py +++ /dev/null @@ -1,248 +0,0 @@ -# encoding: utf-8 -"""sys.excepthook for IPython itself, leaves a detailed report on disk. - -Authors: - -* Fernando Perez -* Brian E. Granger -""" - -#----------------------------------------------------------------------------- -# Copyright (C) 2001-2007 Fernando Perez. -# Copyright (C) 2008-2011 The IPython Development Team -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -import sys -import traceback -from pprint import pformat -from pathlib import Path - -import builtins as builtin_mod - -from IPython.core import ultratb -from IPython.core.application import Application -from IPython.core.release import author_email -from IPython.utils.sysinfo import sys_info - -from IPython.core.release import __version__ as version - -from typing import Optional, Dict -import types - -#----------------------------------------------------------------------------- -# Code -#----------------------------------------------------------------------------- - -# Template for the user message. -_default_message_template = """\ -Oops, {app_name} crashed. We do our best to make it stable, but... - -A crash report was automatically generated with the following information: - - A verbatim copy of the crash traceback. - - A copy of your input history during this session. - - Data on your current {app_name} configuration. - -It was left in the file named: -\t'{crash_report_fname}' -If you can email this file to the developers, the information in it will help -them in understanding and correcting the problem. - -You can mail it to: {contact_name} at {contact_email} -with the subject '{app_name} Crash Report'. - -If you want to do it now, the following command will work (under Unix): -mail -s '{app_name} Crash Report' {contact_email} < {crash_report_fname} - -In your email, please also include information about: -- The operating system under which the crash happened: Linux, macOS, Windows, - other, and which exact version (for example: Ubuntu 16.04.3, macOS 10.13.2, - Windows 10 Pro), and whether it is 32-bit or 64-bit; -- How {app_name} was installed: using pip or conda, from GitHub, as part of - a Docker container, or other, providing more detail if possible; -- How to reproduce the crash: what exact sequence of instructions can one - input to get the same crash? Ideally, find a minimal yet complete sequence - of instructions that yields the crash. - -To ensure accurate tracking of this issue, please file a report about it at: -{bug_tracker} -""" - -_lite_message_template = """ -If you suspect this is an IPython {version} bug, please report it at: - https://github.com/ipython/ipython/issues -or send an email to the mailing list at {email} - -You can print a more detailed traceback right now with "%tb", or use "%debug" -to interactively debug it. - -Extra-detailed tracebacks for bug-reporting purposes can be enabled via: - {config}Application.verbose_crash=True -""" - - -class CrashHandler: - """Customizable crash handlers for IPython applications. - - Instances of this class provide a :meth:`__call__` method which can be - used as a ``sys.excepthook``. The :meth:`__call__` signature is:: - - def __call__(self, etype, evalue, etb) - """ - - message_template = _default_message_template - section_sep = '\n\n'+'*'*75+'\n\n' - info: Dict[str, Optional[str]] - - def __init__( - self, - app: Application, - contact_name: Optional[str] = None, - contact_email: Optional[str] = None, - bug_tracker: Optional[str] = None, - show_crash_traceback: bool = True, - call_pdb: bool = False, - ): - """Create a new crash handler - - Parameters - ---------- - app : Application - A running :class:`Application` instance, which will be queried at - crash time for internal information. - contact_name : str - A string with the name of the person to contact. - contact_email : str - A string with the email address of the contact. - bug_tracker : str - A string with the URL for your project's bug tracker. - show_crash_traceback : bool - If false, don't print the crash traceback on stderr, only generate - the on-disk report - call_pdb - Whether to call pdb on crash - - Attributes - ---------- - These instances contain some non-argument attributes which allow for - further customization of the crash handler's behavior. Please see the - source for further details. - - """ - self.crash_report_fname = "Crash_report_%s.txt" % app.name - self.app = app - self.call_pdb = call_pdb - #self.call_pdb = True # dbg - self.show_crash_traceback = show_crash_traceback - self.info = dict(app_name = app.name, - contact_name = contact_name, - contact_email = contact_email, - bug_tracker = bug_tracker, - crash_report_fname = self.crash_report_fname) - - def __call__( - self, - etype: type[BaseException], - evalue: BaseException, - etb: types.TracebackType, - ) -> None: - """Handle an exception, call for compatible with sys.excepthook""" - - # do not allow the crash handler to be called twice without reinstalling it - # this prevents unlikely errors in the crash handling from entering an - # infinite loop. - sys.excepthook = sys.__excepthook__ - - # Report tracebacks shouldn't use color in general (safer for users) - color_scheme = 'NoColor' - - # Use this ONLY for developer debugging (keep commented out for release) - # color_scheme = 'Linux' # dbg - ipython_dir = getattr(self.app, "ipython_dir", None) - if ipython_dir is not None: - assert isinstance(ipython_dir, str) - rptdir = Path(ipython_dir) - else: - rptdir = Path.cwd() - if not rptdir.is_dir(): - rptdir = Path.cwd() - report_name = rptdir / self.crash_report_fname - # write the report filename into the instance dict so it can get - # properly expanded out in the user message template - self.crash_report_fname = str(report_name) - self.info["crash_report_fname"] = str(report_name) - TBhandler = ultratb.VerboseTB( - color_scheme=color_scheme, - long_header=True, - call_pdb=self.call_pdb, - ) - if self.call_pdb: - TBhandler(etype,evalue,etb) - return - else: - traceback = TBhandler.text(etype,evalue,etb,context=31) - - # print traceback to screen - if self.show_crash_traceback: - print(traceback, file=sys.stderr) - - # and generate a complete report on disk - try: - report = open(report_name, "w", encoding="utf-8") - except: - print('Could not create crash report on disk.', file=sys.stderr) - return - - with report: - # Inform user on stderr of what happened - print('\n'+'*'*70+'\n', file=sys.stderr) - print(self.message_template.format(**self.info), file=sys.stderr) - - # Construct report on disk - report.write(self.make_report(str(traceback))) - - builtin_mod.input("Hit to quit (your terminal may close):") - - def make_report(self, traceback: str) -> str: - """Return a string containing a crash report.""" - - sec_sep = self.section_sep - - report = ['*'*75+'\n\n'+'IPython post-mortem report\n\n'] - rpt_add = report.append - rpt_add(sys_info()) - - try: - config = pformat(self.app.config) - rpt_add(sec_sep) - rpt_add("Application name: %s\n\n" % self.app.name) - rpt_add("Current user configuration structure:\n\n") - rpt_add(config) - except: - pass - rpt_add(sec_sep+'Crash traceback:\n\n' + traceback) - - return ''.join(report) - - -def crash_handler_lite( - etype: type[BaseException], evalue: BaseException, tb: types.TracebackType -) -> None: - """a light excepthook, adding a small message to the usual traceback""" - traceback.print_exception(etype, evalue, tb) - - from IPython.core.interactiveshell import InteractiveShell - if InteractiveShell.initialized(): - # we are in a Shell environment, give %magic example - config = "%config " - else: - # we are not in a shell, show generic config - config = "c." - print(_lite_message_template.format(email=author_email, config=config, version=version), file=sys.stderr) - diff --git a/.venv/lib/python3.12/site-packages/IPython/core/debugger.py b/.venv/lib/python3.12/site-packages/IPython/core/debugger.py deleted file mode 100644 index 76c42e0..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/debugger.py +++ /dev/null @@ -1,1136 +0,0 @@ -""" -Pdb debugger class. - - -This is an extension to PDB which adds a number of new features. -Note that there is also the `IPython.terminal.debugger` class which provides UI -improvements. - -We also strongly recommend to use this via the `ipdb` package, which provides -extra configuration options. - -Among other things, this subclass of PDB: - - supports many IPython magics like pdef/psource - - hide frames in tracebacks based on `__tracebackhide__` - - allows to skip frames based on `__debuggerskip__` - - -Global Configuration --------------------- - -The IPython debugger will by read the global ``~/.pdbrc`` file. -That is to say you can list all commands supported by ipdb in your `~/.pdbrc` -configuration file, to globally configure pdb. - -Example:: - - # ~/.pdbrc - skip_predicates debuggerskip false - skip_hidden false - context 25 - -Features --------- - -The IPython debugger can hide and skip frames when printing or moving through -the stack. This can have a performance impact, so can be configures. - -The skipping and hiding frames are configurable via the `skip_predicates` -command. - -By default, frames from readonly files will be hidden, frames containing -``__tracebackhide__ = True`` will be hidden. - -Frames containing ``__debuggerskip__`` will be stepped over, frames whose parent -frames value of ``__debuggerskip__`` is ``True`` will also be skipped. - - >>> def helpers_helper(): - ... pass - ... - ... def helper_1(): - ... print("don't step in me") - ... helpers_helpers() # will be stepped over unless breakpoint set. - ... - ... - ... def helper_2(): - ... print("in me neither") - ... - -One can define a decorator that wraps a function between the two helpers: - - >>> def pdb_skipped_decorator(function): - ... - ... - ... def wrapped_fn(*args, **kwargs): - ... __debuggerskip__ = True - ... helper_1() - ... __debuggerskip__ = False - ... result = function(*args, **kwargs) - ... __debuggerskip__ = True - ... helper_2() - ... # setting __debuggerskip__ to False again is not necessary - ... return result - ... - ... return wrapped_fn - -When decorating a function, ipdb will directly step into ``bar()`` by -default: - - >>> @foo_decorator - ... def bar(x, y): - ... return x * y - - -You can toggle the behavior with - - ipdb> skip_predicates debuggerskip false - -or configure it in your ``.pdbrc`` - - - -License -------- - -Modified from the standard pdb.Pdb class to avoid including readline, so that -the command line completion of other programs which include this isn't -damaged. - -In the future, this class will be expanded with improvements over the standard -pdb. - -The original code in this file is mainly lifted out of cmd.py in Python 2.2, -with minor changes. Licensing should therefore be under the standard Python -terms. For details on the PSF (Python Software Foundation) standard license, -see: - -https://docs.python.org/2/license.html - - -All the changes since then are under the same license as IPython. - -""" - -#***************************************************************************** -# -# This file is licensed under the PSF license. -# -# Copyright (C) 2001 Python Software Foundation, www.python.org -# Copyright (C) 2005-2006 Fernando Perez. -# -# -#***************************************************************************** - -from __future__ import annotations - -import inspect -import linecache -import os -import re -import sys -from contextlib import contextmanager -from functools import lru_cache - -from IPython import get_ipython -from IPython.core.excolors import exception_colors -from IPython.utils import PyColorize, coloransi, py3compat - -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - # otherwise circular import - from IPython.core.interactiveshell import InteractiveShell - -# skip module docstests -__skip_doctest__ = True - -prompt = 'ipdb> ' - -# We have to check this directly from sys.argv, config struct not yet available -from pdb import Pdb as OldPdb - -# Allow the set_trace code to operate outside of an ipython instance, even if -# it does so with some limitations. The rest of this support is implemented in -# the Tracer constructor. - -DEBUGGERSKIP = "__debuggerskip__" - - -# this has been implemented in Pdb in Python 3.13 (https://github.com/python/cpython/pull/106676 -# on lower python versions, we backported the feature. -CHAIN_EXCEPTIONS = sys.version_info < (3, 13) - - -def make_arrow(pad): - """generate the leading arrow in front of traceback or debugger""" - if pad >= 2: - return '-'*(pad-2) + '> ' - elif pad == 1: - return '>' - return '' - - -def BdbQuit_excepthook(et, ev, tb, excepthook=None): - """Exception hook which handles `BdbQuit` exceptions. - - All other exceptions are processed using the `excepthook` - parameter. - """ - raise ValueError( - "`BdbQuit_excepthook` is deprecated since version 5.1. It is still around only because it is still imported by ipdb.", - ) - - -RGX_EXTRA_INDENT = re.compile(r'(?<=\n)\s+') - - -def strip_indentation(multiline_string): - return RGX_EXTRA_INDENT.sub('', multiline_string) - - -def decorate_fn_with_doc(new_fn, old_fn, additional_text=""): - """Make new_fn have old_fn's doc string. This is particularly useful - for the ``do_...`` commands that hook into the help system. - Adapted from from a comp.lang.python posting - by Duncan Booth.""" - def wrapper(*args, **kw): - return new_fn(*args, **kw) - if old_fn.__doc__: - wrapper.__doc__ = strip_indentation(old_fn.__doc__) + additional_text - return wrapper - - -class Pdb(OldPdb): - """Modified Pdb class, does not load readline. - - for a standalone version that uses prompt_toolkit, see - `IPython.terminal.debugger.TerminalPdb` and - `IPython.terminal.debugger.set_trace()` - - - This debugger can hide and skip frames that are tagged according to some predicates. - See the `skip_predicates` commands. - - """ - - shell: InteractiveShell - - if CHAIN_EXCEPTIONS: - MAX_CHAINED_EXCEPTION_DEPTH = 999 - - default_predicates = { - "tbhide": True, - "readonly": False, - "ipython_internal": True, - "debuggerskip": True, - } - - def __init__(self, completekey=None, stdin=None, stdout=None, context=5, **kwargs): - """Create a new IPython debugger. - - Parameters - ---------- - completekey : default None - Passed to pdb.Pdb. - stdin : default None - Passed to pdb.Pdb. - stdout : default None - Passed to pdb.Pdb. - context : int - Number of lines of source code context to show when - displaying stacktrace information. - **kwargs - Passed to pdb.Pdb. - - Notes - ----- - The possibilities are python version dependent, see the python - docs for more info. - """ - - # Parent constructor: - try: - self.context = int(context) - if self.context <= 0: - raise ValueError("Context must be a positive integer") - except (TypeError, ValueError) as e: - raise ValueError("Context must be a positive integer") from e - - # `kwargs` ensures full compatibility with stdlib's `pdb.Pdb`. - OldPdb.__init__(self, completekey, stdin, stdout, **kwargs) - - # IPython changes... - self.shell = get_ipython() - - if self.shell is None: - save_main = sys.modules['__main__'] - # No IPython instance running, we must create one - from IPython.terminal.interactiveshell import \ - TerminalInteractiveShell - self.shell = TerminalInteractiveShell.instance() - # needed by any code which calls __import__("__main__") after - # the debugger was entered. See also #9941. - sys.modules["__main__"] = save_main - - - color_scheme = self.shell.colors - - self.aliases = {} - - # Create color table: we copy the default one from the traceback - # module and add a few attributes needed for debugging - self.color_scheme_table = exception_colors() - - # shorthands - C = coloransi.TermColors - cst = self.color_scheme_table - - - # Add a python parser so we can syntax highlight source while - # debugging. - self.parser = PyColorize.Parser(style=color_scheme) - self.set_colors(color_scheme) - - # Set the prompt - the default prompt is '(Pdb)' - self.prompt = prompt - self.skip_hidden = True - self.report_skipped = True - - # list of predicates we use to skip frames - self._predicates = self.default_predicates - - if CHAIN_EXCEPTIONS: - self._chained_exceptions = tuple() - self._chained_exception_index = 0 - - # - def set_colors(self, scheme): - """Shorthand access to the color table scheme selector method.""" - self.color_scheme_table.set_active_scheme(scheme) - self.parser.style = scheme - - def set_trace(self, frame=None): - if frame is None: - frame = sys._getframe().f_back - self.initial_frame = frame - return super().set_trace(frame) - - def _hidden_predicate(self, frame): - """ - Given a frame return whether it it should be hidden or not by IPython. - """ - - if self._predicates["readonly"]: - fname = frame.f_code.co_filename - # we need to check for file existence and interactively define - # function would otherwise appear as RO. - if os.path.isfile(fname) and not os.access(fname, os.W_OK): - return True - - if self._predicates["tbhide"]: - if frame in (self.curframe, getattr(self, "initial_frame", None)): - return False - frame_locals = self._get_frame_locals(frame) - if "__tracebackhide__" not in frame_locals: - return False - return frame_locals["__tracebackhide__"] - return False - - def hidden_frames(self, stack): - """ - Given an index in the stack return whether it should be skipped. - - This is used in up/down and where to skip frames. - """ - # The f_locals dictionary is updated from the actual frame - # locals whenever the .f_locals accessor is called, so we - # avoid calling it here to preserve self.curframe_locals. - # Furthermore, there is no good reason to hide the current frame. - ip_hide = [self._hidden_predicate(s[0]) for s in stack] - ip_start = [i for i, s in enumerate(ip_hide) if s == "__ipython_bottom__"] - if ip_start and self._predicates["ipython_internal"]: - ip_hide = [h if i > ip_start[0] else True for (i, h) in enumerate(ip_hide)] - return ip_hide - - if CHAIN_EXCEPTIONS: - - def _get_tb_and_exceptions(self, tb_or_exc): - """ - Given a tracecack or an exception, return a tuple of chained exceptions - and current traceback to inspect. - This will deal with selecting the right ``__cause__`` or ``__context__`` - as well as handling cycles, and return a flattened list of exceptions we - can jump to with do_exceptions. - """ - _exceptions = [] - if isinstance(tb_or_exc, BaseException): - traceback, current = tb_or_exc.__traceback__, tb_or_exc - - while current is not None: - if current in _exceptions: - break - _exceptions.append(current) - if current.__cause__ is not None: - current = current.__cause__ - elif ( - current.__context__ is not None - and not current.__suppress_context__ - ): - current = current.__context__ - - if len(_exceptions) >= self.MAX_CHAINED_EXCEPTION_DEPTH: - self.message( - f"More than {self.MAX_CHAINED_EXCEPTION_DEPTH}" - " chained exceptions found, not all exceptions" - "will be browsable with `exceptions`." - ) - break - else: - traceback = tb_or_exc - return tuple(reversed(_exceptions)), traceback - - @contextmanager - def _hold_exceptions(self, exceptions): - """ - Context manager to ensure proper cleaning of exceptions references - When given a chained exception instead of a traceback, - pdb may hold references to many objects which may leak memory. - We use this context manager to make sure everything is properly cleaned - """ - try: - self._chained_exceptions = exceptions - self._chained_exception_index = len(exceptions) - 1 - yield - finally: - # we can't put those in forget as otherwise they would - # be cleared on exception change - self._chained_exceptions = tuple() - self._chained_exception_index = 0 - - def do_exceptions(self, arg): - """exceptions [number] - List or change current exception in an exception chain. - Without arguments, list all the current exception in the exception - chain. Exceptions will be numbered, with the current exception indicated - with an arrow. - If given an integer as argument, switch to the exception at that index. - """ - if not self._chained_exceptions: - self.message( - "Did not find chained exceptions. To move between" - " exceptions, pdb/post_mortem must be given an exception" - " object rather than a traceback." - ) - return - if not arg: - for ix, exc in enumerate(self._chained_exceptions): - prompt = ">" if ix == self._chained_exception_index else " " - rep = repr(exc) - if len(rep) > 80: - rep = rep[:77] + "..." - indicator = ( - " -" - if self._chained_exceptions[ix].__traceback__ is None - else f"{ix:>3}" - ) - self.message(f"{prompt} {indicator} {rep}") - else: - try: - number = int(arg) - except ValueError: - self.error("Argument must be an integer") - return - if 0 <= number < len(self._chained_exceptions): - if self._chained_exceptions[number].__traceback__ is None: - self.error( - "This exception does not have a traceback, cannot jump to it" - ) - return - - self._chained_exception_index = number - self.setup(None, self._chained_exceptions[number].__traceback__) - self.print_stack_entry(self.stack[self.curindex]) - else: - self.error("No exception with that number") - - def interaction(self, frame, tb_or_exc): - try: - if CHAIN_EXCEPTIONS: - # this context manager is part of interaction in 3.13 - _chained_exceptions, tb = self._get_tb_and_exceptions(tb_or_exc) - if isinstance(tb_or_exc, BaseException): - assert tb is not None, "main exception must have a traceback" - with self._hold_exceptions(_chained_exceptions): - OldPdb.interaction(self, frame, tb) - else: - OldPdb.interaction(self, frame, tb_or_exc) - - except KeyboardInterrupt: - self.stdout.write("\n" + self.shell.get_exception_only()) - - def precmd(self, line): - """Perform useful escapes on the command before it is executed.""" - - if line.endswith("??"): - line = "pinfo2 " + line[:-2] - elif line.endswith("?"): - line = "pinfo " + line[:-1] - - line = super().precmd(line) - - return line - - def new_do_quit(self, arg): - return OldPdb.do_quit(self, arg) - - do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit) - - def print_stack_trace(self, context=None): - Colors = self.color_scheme_table.active_colors - ColorsNormal = Colors.Normal - if context is None: - context = self.context - try: - context = int(context) - if context <= 0: - raise ValueError("Context must be a positive integer") - except (TypeError, ValueError) as e: - raise ValueError("Context must be a positive integer") from e - try: - skipped = 0 - for hidden, frame_lineno in zip(self.hidden_frames(self.stack), self.stack): - if hidden and self.skip_hidden: - skipped += 1 - continue - if skipped: - print( - f"{Colors.excName} [... skipping {skipped} hidden frame(s)]{ColorsNormal}\n" - ) - skipped = 0 - self.print_stack_entry(frame_lineno, context=context) - if skipped: - print( - f"{Colors.excName} [... skipping {skipped} hidden frame(s)]{ColorsNormal}\n" - ) - except KeyboardInterrupt: - pass - - def print_stack_entry(self, frame_lineno, prompt_prefix='\n-> ', - context=None): - if context is None: - context = self.context - try: - context = int(context) - if context <= 0: - raise ValueError("Context must be a positive integer") - except (TypeError, ValueError) as e: - raise ValueError("Context must be a positive integer") from e - print(self.format_stack_entry(frame_lineno, '', context), file=self.stdout) - - # vds: >> - frame, lineno = frame_lineno - filename = frame.f_code.co_filename - self.shell.hooks.synchronize_with_editor(filename, lineno, 0) - # vds: << - - def _get_frame_locals(self, frame): - """ " - Accessing f_local of current frame reset the namespace, so we want to avoid - that or the following can happen - - ipdb> foo - "old" - ipdb> foo = "new" - ipdb> foo - "new" - ipdb> where - ipdb> foo - "old" - - So if frame is self.current_frame we instead return self.curframe_locals - - """ - if frame is getattr(self, "curframe", None): - return self.curframe_locals - else: - return frame.f_locals - - def format_stack_entry(self, frame_lineno, lprefix=': ', context=None): - if context is None: - context = self.context - try: - context = int(context) - if context <= 0: - print("Context must be a positive integer", file=self.stdout) - except (TypeError, ValueError): - print("Context must be a positive integer", file=self.stdout) - - import reprlib - - ret = [] - - Colors = self.color_scheme_table.active_colors - ColorsNormal = Colors.Normal - tpl_link = "%s%%s%s" % (Colors.filenameEm, ColorsNormal) - tpl_call = "%s%%s%s%%s%s" % (Colors.vName, Colors.valEm, ColorsNormal) - tpl_line = "%%s%s%%s %s%%s" % (Colors.lineno, ColorsNormal) - tpl_line_em = "%%s%s%%s %s%%s%s" % (Colors.linenoEm, Colors.line, ColorsNormal) - - frame, lineno = frame_lineno - - return_value = '' - loc_frame = self._get_frame_locals(frame) - if "__return__" in loc_frame: - rv = loc_frame["__return__"] - # return_value += '->' - return_value += reprlib.repr(rv) + "\n" - ret.append(return_value) - - #s = filename + '(' + `lineno` + ')' - filename = self.canonic(frame.f_code.co_filename) - link = tpl_link % py3compat.cast_unicode(filename) - - if frame.f_code.co_name: - func = frame.f_code.co_name - else: - func = "" - - call = "" - if func != "?": - if "__args__" in loc_frame: - args = reprlib.repr(loc_frame["__args__"]) - else: - args = '()' - call = tpl_call % (func, args) - - # The level info should be generated in the same format pdb uses, to - # avoid breaking the pdbtrack functionality of python-mode in *emacs. - if frame is self.curframe: - ret.append('> ') - else: - ret.append(" ") - ret.append("%s(%s)%s\n" % (link, lineno, call)) - - start = lineno - 1 - context//2 - lines = linecache.getlines(filename) - start = min(start, len(lines) - context) - start = max(start, 0) - lines = lines[start : start + context] - - for i, line in enumerate(lines): - show_arrow = start + 1 + i == lineno - linetpl = (frame is self.curframe or show_arrow) and tpl_line_em or tpl_line - ret.append( - self.__format_line( - linetpl, filename, start + 1 + i, line, arrow=show_arrow - ) - ) - return "".join(ret) - - def __format_line(self, tpl_line, filename, lineno, line, arrow=False): - bp_mark = "" - bp_mark_color = "" - - new_line, err = self.parser.format2(line, 'str') - if not err: - line = new_line - - bp = None - if lineno in self.get_file_breaks(filename): - bps = self.get_breaks(filename, lineno) - bp = bps[-1] - - if bp: - Colors = self.color_scheme_table.active_colors - bp_mark = str(bp.number) - bp_mark_color = Colors.breakpoint_enabled - if not bp.enabled: - bp_mark_color = Colors.breakpoint_disabled - - numbers_width = 7 - if arrow: - # This is the line with the error - pad = numbers_width - len(str(lineno)) - len(bp_mark) - num = '%s%s' % (make_arrow(pad), str(lineno)) - else: - num = '%*s' % (numbers_width - len(bp_mark), str(lineno)) - - return tpl_line % (bp_mark_color + bp_mark, num, line) - - def print_list_lines(self, filename, first, last): - """The printing (as opposed to the parsing part of a 'list' - command.""" - try: - Colors = self.color_scheme_table.active_colors - ColorsNormal = Colors.Normal - tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal) - tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal) - src = [] - if filename == "" and hasattr(self, "_exec_filename"): - filename = self._exec_filename - - for lineno in range(first, last+1): - line = linecache.getline(filename, lineno) - if not line: - break - - if lineno == self.curframe.f_lineno: - line = self.__format_line( - tpl_line_em, filename, lineno, line, arrow=True - ) - else: - line = self.__format_line( - tpl_line, filename, lineno, line, arrow=False - ) - - src.append(line) - self.lineno = lineno - - print(''.join(src), file=self.stdout) - - except KeyboardInterrupt: - pass - - def do_skip_predicates(self, args): - """ - Turn on/off individual predicates as to whether a frame should be hidden/skip. - - The global option to skip (or not) hidden frames is set with skip_hidden - - To change the value of a predicate - - skip_predicates key [true|false] - - Call without arguments to see the current values. - - To permanently change the value of an option add the corresponding - command to your ``~/.pdbrc`` file. If you are programmatically using the - Pdb instance you can also change the ``default_predicates`` class - attribute. - """ - if not args.strip(): - print("current predicates:") - for p, v in self._predicates.items(): - print(" ", p, ":", v) - return - type_value = args.strip().split(" ") - if len(type_value) != 2: - print( - f"Usage: skip_predicates , with one of {set(self._predicates.keys())}" - ) - return - - type_, value = type_value - if type_ not in self._predicates: - print(f"{type_!r} not in {set(self._predicates.keys())}") - return - if value.lower() not in ("true", "yes", "1", "no", "false", "0"): - print( - f"{value!r} is invalid - use one of ('true', 'yes', '1', 'no', 'false', '0')" - ) - return - - self._predicates[type_] = value.lower() in ("true", "yes", "1") - if not any(self._predicates.values()): - print( - "Warning, all predicates set to False, skip_hidden may not have any effects." - ) - - def do_skip_hidden(self, arg): - """ - Change whether or not we should skip frames with the - __tracebackhide__ attribute. - """ - if not arg.strip(): - print( - f"skip_hidden = {self.skip_hidden}, use 'yes','no', 'true', or 'false' to change." - ) - elif arg.strip().lower() in ("true", "yes"): - self.skip_hidden = True - elif arg.strip().lower() in ("false", "no"): - self.skip_hidden = False - if not any(self._predicates.values()): - print( - "Warning, all predicates set to False, skip_hidden may not have any effects." - ) - - def do_list(self, arg): - """Print lines of code from the current stack frame - """ - self.lastcmd = 'list' - last = None - if arg and arg != ".": - try: - x = eval(arg, {}, {}) - if type(x) == type(()): - first, last = x - first = int(first) - last = int(last) - if last < first: - # Assume it's a count - last = first + last - else: - first = max(1, int(x) - 5) - except: - print('*** Error in argument:', repr(arg), file=self.stdout) - return - elif self.lineno is None or arg == ".": - first = max(1, self.curframe.f_lineno - 5) - else: - first = self.lineno + 1 - if last is None: - last = first + 10 - self.print_list_lines(self.curframe.f_code.co_filename, first, last) - - # vds: >> - lineno = first - filename = self.curframe.f_code.co_filename - self.shell.hooks.synchronize_with_editor(filename, lineno, 0) - # vds: << - - do_l = do_list - - def getsourcelines(self, obj): - lines, lineno = inspect.findsource(obj) - if inspect.isframe(obj) and obj.f_globals is self._get_frame_locals(obj): - # must be a module frame: do not try to cut a block out of it - return lines, 1 - elif inspect.ismodule(obj): - return lines, 1 - return inspect.getblock(lines[lineno:]), lineno+1 - - def do_longlist(self, arg): - """Print lines of code from the current stack frame. - - Shows more lines than 'list' does. - """ - self.lastcmd = 'longlist' - try: - lines, lineno = self.getsourcelines(self.curframe) - except OSError as err: - self.error(err) - return - last = lineno + len(lines) - self.print_list_lines(self.curframe.f_code.co_filename, lineno, last) - do_ll = do_longlist - - def do_debug(self, arg): - """debug code - Enter a recursive debugger that steps through the code - argument (which is an arbitrary expression or statement to be - executed in the current environment). - """ - trace_function = sys.gettrace() - sys.settrace(None) - globals = self.curframe.f_globals - locals = self.curframe_locals - p = self.__class__(completekey=self.completekey, - stdin=self.stdin, stdout=self.stdout) - p.use_rawinput = self.use_rawinput - p.prompt = "(%s) " % self.prompt.strip() - self.message("ENTERING RECURSIVE DEBUGGER") - sys.call_tracing(p.run, (arg, globals, locals)) - self.message("LEAVING RECURSIVE DEBUGGER") - sys.settrace(trace_function) - self.lastcmd = p.lastcmd - - def do_pdef(self, arg): - """Print the call signature for any callable object. - - The debugger interface to %pdef""" - namespaces = [ - ("Locals", self.curframe_locals), - ("Globals", self.curframe.f_globals), - ] - self.shell.find_line_magic("pdef")(arg, namespaces=namespaces) - - def do_pdoc(self, arg): - """Print the docstring for an object. - - The debugger interface to %pdoc.""" - namespaces = [ - ("Locals", self.curframe_locals), - ("Globals", self.curframe.f_globals), - ] - self.shell.find_line_magic("pdoc")(arg, namespaces=namespaces) - - def do_pfile(self, arg): - """Print (or run through pager) the file where an object is defined. - - The debugger interface to %pfile. - """ - namespaces = [ - ("Locals", self.curframe_locals), - ("Globals", self.curframe.f_globals), - ] - self.shell.find_line_magic("pfile")(arg, namespaces=namespaces) - - def do_pinfo(self, arg): - """Provide detailed information about an object. - - The debugger interface to %pinfo, i.e., obj?.""" - namespaces = [ - ("Locals", self.curframe_locals), - ("Globals", self.curframe.f_globals), - ] - self.shell.find_line_magic("pinfo")(arg, namespaces=namespaces) - - def do_pinfo2(self, arg): - """Provide extra detailed information about an object. - - The debugger interface to %pinfo2, i.e., obj??.""" - namespaces = [ - ("Locals", self.curframe_locals), - ("Globals", self.curframe.f_globals), - ] - self.shell.find_line_magic("pinfo2")(arg, namespaces=namespaces) - - def do_psource(self, arg): - """Print (or run through pager) the source code for an object.""" - namespaces = [ - ("Locals", self.curframe_locals), - ("Globals", self.curframe.f_globals), - ] - self.shell.find_line_magic("psource")(arg, namespaces=namespaces) - - def do_where(self, arg): - """w(here) - Print a stack trace, with the most recent frame at the bottom. - An arrow indicates the "current frame", which determines the - context of most commands. 'bt' is an alias for this command. - - Take a number as argument as an (optional) number of context line to - print""" - if arg: - try: - context = int(arg) - except ValueError as err: - self.error(err) - return - self.print_stack_trace(context) - else: - self.print_stack_trace() - - do_w = do_where - - def break_anywhere(self, frame): - """ - _stop_in_decorator_internals is overly restrictive, as we may still want - to trace function calls, so we need to also update break_anywhere so - that is we don't `stop_here`, because of debugger skip, we may still - stop at any point inside the function - - """ - - sup = super().break_anywhere(frame) - if sup: - return sup - if self._predicates["debuggerskip"]: - if DEBUGGERSKIP in frame.f_code.co_varnames: - return True - if frame.f_back and self._get_frame_locals(frame.f_back).get(DEBUGGERSKIP): - return True - return False - - def _is_in_decorator_internal_and_should_skip(self, frame): - """ - Utility to tell us whether we are in a decorator internal and should stop. - - """ - # if we are disabled don't skip - if not self._predicates["debuggerskip"]: - return False - - return self._cachable_skip(frame) - - @lru_cache(1024) - def _cached_one_parent_frame_debuggerskip(self, frame): - """ - Cache looking up for DEBUGGERSKIP on parent frame. - - This should speedup walking through deep frame when one of the highest - one does have a debugger skip. - - This is likely to introduce fake positive though. - """ - while getattr(frame, "f_back", None): - frame = frame.f_back - if self._get_frame_locals(frame).get(DEBUGGERSKIP): - return True - return None - - @lru_cache(1024) - def _cachable_skip(self, frame): - # if frame is tagged, skip by default. - if DEBUGGERSKIP in frame.f_code.co_varnames: - return True - - # if one of the parent frame value set to True skip as well. - if self._cached_one_parent_frame_debuggerskip(frame): - return True - - return False - - def stop_here(self, frame): - if self._is_in_decorator_internal_and_should_skip(frame) is True: - return False - - hidden = False - if self.skip_hidden: - hidden = self._hidden_predicate(frame) - if hidden: - if self.report_skipped: - Colors = self.color_scheme_table.active_colors - ColorsNormal = Colors.Normal - print( - f"{Colors.excName} [... skipped 1 hidden frame]{ColorsNormal}\n" - ) - return super().stop_here(frame) - - def do_up(self, arg): - """u(p) [count] - Move the current frame count (default one) levels up in the - stack trace (to an older frame). - - Will skip hidden frames. - """ - # modified version of upstream that skips - # frames with __tracebackhide__ - if self.curindex == 0: - self.error("Oldest frame") - return - try: - count = int(arg or 1) - except ValueError: - self.error("Invalid frame count (%s)" % arg) - return - skipped = 0 - if count < 0: - _newframe = 0 - else: - counter = 0 - hidden_frames = self.hidden_frames(self.stack) - for i in range(self.curindex - 1, -1, -1): - if hidden_frames[i] and self.skip_hidden: - skipped += 1 - continue - counter += 1 - if counter >= count: - break - else: - # if no break occurred. - self.error( - "all frames above hidden, use `skip_hidden False` to get get into those." - ) - return - - Colors = self.color_scheme_table.active_colors - ColorsNormal = Colors.Normal - _newframe = i - self._select_frame(_newframe) - if skipped: - print( - f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n" - ) - - def do_down(self, arg): - """d(own) [count] - Move the current frame count (default one) levels down in the - stack trace (to a newer frame). - - Will skip hidden frames. - """ - if self.curindex + 1 == len(self.stack): - self.error("Newest frame") - return - try: - count = int(arg or 1) - except ValueError: - self.error("Invalid frame count (%s)" % arg) - return - if count < 0: - _newframe = len(self.stack) - 1 - else: - counter = 0 - skipped = 0 - hidden_frames = self.hidden_frames(self.stack) - for i in range(self.curindex + 1, len(self.stack)): - if hidden_frames[i] and self.skip_hidden: - skipped += 1 - continue - counter += 1 - if counter >= count: - break - else: - self.error( - "all frames below hidden, use `skip_hidden False` to get get into those." - ) - return - - Colors = self.color_scheme_table.active_colors - ColorsNormal = Colors.Normal - if skipped: - print( - f"{Colors.excName} [... skipped {skipped} hidden frame(s)]{ColorsNormal}\n" - ) - _newframe = i - - self._select_frame(_newframe) - - do_d = do_down - do_u = do_up - - def do_context(self, context): - """context number_of_lines - Set the number of lines of source code to show when displaying - stacktrace information. - """ - try: - new_context = int(context) - if new_context <= 0: - raise ValueError() - self.context = new_context - except ValueError: - self.error( - f"The 'context' command requires a positive integer argument (current value {self.context})." - ) - - -class InterruptiblePdb(Pdb): - """Version of debugger where KeyboardInterrupt exits the debugger altogether.""" - - def cmdloop(self, intro=None): - """Wrap cmdloop() such that KeyboardInterrupt stops the debugger.""" - try: - return OldPdb.cmdloop(self, intro=intro) - except KeyboardInterrupt: - self.stop_here = lambda frame: False - self.do_quit("") - sys.settrace(None) - self.quitting = False - raise - - def _cmdloop(self): - while True: - try: - # keyboard interrupts allow for an easy way to cancel - # the current command, so allow them during interactive input - self.allow_kbdint = True - self.cmdloop() - self.allow_kbdint = False - break - except KeyboardInterrupt: - self.message('--KeyboardInterrupt--') - raise - - -def set_trace(frame=None, header=None): - """ - Start debugging from `frame`. - - If frame is not specified, debugging starts from caller's frame. - """ - pdb = Pdb() - if header is not None: - pdb.message(header) - pdb.set_trace(frame or sys._getframe().f_back) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/display.py b/.venv/lib/python3.12/site-packages/IPython/core/display.py deleted file mode 100644 index a943447..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/display.py +++ /dev/null @@ -1,1373 +0,0 @@ -# -*- coding: utf-8 -*- -"""Top-level display functions for displaying object in different formats.""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - - -from binascii import b2a_base64, hexlify -import html -import json -import mimetypes -import os -import struct -import warnings -from copy import deepcopy -from os.path import splitext -from pathlib import Path, PurePath - -from typing import Optional - -from IPython.testing.skipdoctest import skip_doctest -from . import display_functions - - -__all__ = [ - "display_pretty", - "display_html", - "display_markdown", - "display_svg", - "display_png", - "display_jpeg", - "display_webp", - "display_latex", - "display_json", - "display_javascript", - "display_pdf", - "DisplayObject", - "TextDisplayObject", - "Pretty", - "HTML", - "Markdown", - "Math", - "Latex", - "SVG", - "ProgressBar", - "JSON", - "GeoJSON", - "Javascript", - "Image", - "set_matplotlib_formats", - "set_matplotlib_close", - "Video", -] - -_deprecated_names = ["display", "clear_output", "publish_display_data", "update_display", "DisplayHandle"] - -__all__ = __all__ + _deprecated_names - - -# ----- warn to import from IPython.display ----- - -from warnings import warn - - -def __getattr__(name): - if name in _deprecated_names: - warn( - f"Importing {name} from IPython.core.display is deprecated since IPython 7.14, please import from IPython.display", - DeprecationWarning, - stacklevel=2, - ) - return getattr(display_functions, name) - - if name in globals().keys(): - return globals()[name] - else: - raise AttributeError(f"module {__name__} has no attribute {name}") - - -#----------------------------------------------------------------------------- -# utility functions -#----------------------------------------------------------------------------- - -def _safe_exists(path): - """Check path, but don't let exceptions raise""" - try: - return os.path.exists(path) - except Exception: - return False - - -def _display_mimetype(mimetype, objs, raw=False, metadata=None): - """internal implementation of all display_foo methods - - Parameters - ---------- - mimetype : str - The mimetype to be published (e.g. 'image/png') - *objs : object - The Python objects to display, or if raw=True raw text data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - if metadata: - metadata = {mimetype: metadata} - if raw: - # turn list of pngdata into list of { 'image/png': pngdata } - objs = [ {mimetype: obj} for obj in objs ] - display_functions.display(*objs, raw=raw, metadata=metadata, include=[mimetype]) - -#----------------------------------------------------------------------------- -# Main functions -#----------------------------------------------------------------------------- - - -def display_pretty(*objs, **kwargs): - """Display the pretty (default) representation of an object. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw text data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype('text/plain', objs, **kwargs) - - -def display_html(*objs, **kwargs): - """Display the HTML representation of an object. - - Note: If raw=False and the object does not have a HTML - representation, no HTML will be shown. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw HTML data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype('text/html', objs, **kwargs) - - -def display_markdown(*objs, **kwargs): - """Displays the Markdown representation of an object. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw markdown data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - - _display_mimetype('text/markdown', objs, **kwargs) - - -def display_svg(*objs, **kwargs): - """Display the SVG representation of an object. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw svg data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype('image/svg+xml', objs, **kwargs) - - -def display_png(*objs, **kwargs): - """Display the PNG representation of an object. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw png data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype('image/png', objs, **kwargs) - - -def display_jpeg(*objs, **kwargs): - """Display the JPEG representation of an object. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw JPEG data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype('image/jpeg', objs, **kwargs) - - -def display_webp(*objs, **kwargs): - """Display the WEBP representation of an object. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw JPEG data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype("image/webp", objs, **kwargs) - - -def display_latex(*objs, **kwargs): - """Display the LaTeX representation of an object. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw latex data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype('text/latex', objs, **kwargs) - - -def display_json(*objs, **kwargs): - """Display the JSON representation of an object. - - Note that not many frontends support displaying JSON. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw json data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype('application/json', objs, **kwargs) - - -def display_javascript(*objs, **kwargs): - """Display the Javascript representation of an object. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw javascript data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype('application/javascript', objs, **kwargs) - - -def display_pdf(*objs, **kwargs): - """Display the PDF representation of an object. - - Parameters - ---------- - *objs : object - The Python objects to display, or if raw=True raw javascript data to - display. - raw : bool - Are the data objects raw data or Python objects that need to be - formatted before display? [default: False] - metadata : dict (optional) - Metadata to be associated with the specific mimetype output. - """ - _display_mimetype('application/pdf', objs, **kwargs) - - -#----------------------------------------------------------------------------- -# Smart classes -#----------------------------------------------------------------------------- - - -class DisplayObject(object): - """An object that wraps data to be displayed.""" - - _read_flags = 'r' - _show_mem_addr = False - metadata = None - - def __init__(self, data=None, url=None, filename=None, metadata=None): - """Create a display object given raw data. - - When this object is returned by an expression or passed to the - display function, it will result in the data being displayed - in the frontend. The MIME type of the data should match the - subclasses used, so the Png subclass should be used for 'image/png' - data. If the data is a URL, the data will first be downloaded - and then displayed. - - Parameters - ---------- - data : unicode, str or bytes - The raw data or a URL or file to load the data from - url : unicode - A URL to download the data from. - filename : unicode - Path to a local file to load the data from. - metadata : dict - Dict of metadata associated to be the object when displayed - """ - if isinstance(data, (Path, PurePath)): - data = str(data) - - if data is not None and isinstance(data, str): - if data.startswith('http') and url is None: - url = data - filename = None - data = None - elif _safe_exists(data) and filename is None: - url = None - filename = data - data = None - - self.url = url - self.filename = filename - # because of @data.setter methods in - # subclasses ensure url and filename are set - # before assigning to self.data - self.data = data - - if metadata is not None: - self.metadata = metadata - elif self.metadata is None: - self.metadata = {} - - self.reload() - self._check_data() - - def __repr__(self): - if not self._show_mem_addr: - cls = self.__class__ - r = "<%s.%s object>" % (cls.__module__, cls.__name__) - else: - r = super(DisplayObject, self).__repr__() - return r - - def _check_data(self): - """Override in subclasses if there's something to check.""" - pass - - def _data_and_metadata(self): - """shortcut for returning metadata with shape information, if defined""" - if self.metadata: - return self.data, deepcopy(self.metadata) - else: - return self.data - - def reload(self): - """Reload the raw data from file or URL.""" - if self.filename is not None: - encoding = None if "b" in self._read_flags else "utf-8" - with open(self.filename, self._read_flags, encoding=encoding) as f: - self.data = f.read() - elif self.url is not None: - # Deferred import - from urllib.request import urlopen - response = urlopen(self.url) - data = response.read() - # extract encoding from header, if there is one: - encoding = None - if 'content-type' in response.headers: - for sub in response.headers['content-type'].split(';'): - sub = sub.strip() - if sub.startswith('charset'): - encoding = sub.split('=')[-1].strip() - break - if 'content-encoding' in response.headers: - # TODO: do deflate? - if 'gzip' in response.headers['content-encoding']: - import gzip - from io import BytesIO - - # assume utf-8 if encoding is not specified - with gzip.open( - BytesIO(data), "rt", encoding=encoding or "utf-8" - ) as fp: - encoding = None - data = fp.read() - - # decode data, if an encoding was specified - # We only touch self.data once since - # subclasses such as SVG have @data.setter methods - # that transform self.data into ... well svg. - if encoding: - self.data = data.decode(encoding, 'replace') - else: - self.data = data - - -class TextDisplayObject(DisplayObject): - """Create a text display object given raw data. - - Parameters - ---------- - data : str or unicode - The raw data or a URL or file to load the data from. - url : unicode - A URL to download the data from. - filename : unicode - Path to a local file to load the data from. - metadata : dict - Dict of metadata associated to be the object when displayed - """ - def _check_data(self): - if self.data is not None and not isinstance(self.data, str): - raise TypeError("%s expects text, not %r" % (self.__class__.__name__, self.data)) - -class Pretty(TextDisplayObject): - - def _repr_pretty_(self, pp, cycle): - return pp.text(self.data) - - -class HTML(TextDisplayObject): - - def __init__(self, data=None, url=None, filename=None, metadata=None): - def warn(): - if not data: - return False - - # - # Avoid calling lower() on the entire data, because it could be a - # long string and we're only interested in its beginning and end. - # - prefix = data[:10].lower() - suffix = data[-10:].lower() - return prefix.startswith("') - m_warn.assert_not_called() - - display.HTML('') - m_warn.assert_called_with('Consider using IPython.display.IFrame instead') - - m_warn.reset_mock() - display.HTML('') - m_warn.assert_called_with('Consider using IPython.display.IFrame instead') - -def test_progress(): - p = display.ProgressBar(10) - assert "0/10" in repr(p) - p.html_width = "100%" - p.progress = 5 - assert ( - p._repr_html_() == "" - ) - - -def test_progress_iter(): - with capture_output(display=False) as captured: - for i in display.ProgressBar(5): - out = captured.stdout - assert "{0}/5".format(i) in out - out = captured.stdout - assert "5/5" in out - - -def test_json(): - d = {'a': 5} - lis = [d] - metadata = [ - {'expanded': False, 'root': 'root'}, - {'expanded': True, 'root': 'root'}, - {'expanded': False, 'root': 'custom'}, - {'expanded': True, 'root': 'custom'}, - ] - json_objs = [ - display.JSON(d), - display.JSON(d, expanded=True), - display.JSON(d, root='custom'), - display.JSON(d, expanded=True, root='custom'), - ] - for j, md in zip(json_objs, metadata): - assert j._repr_json_() == (d, md) - - with warnings.catch_warnings(record=True) as w: - warnings.simplefilter("always") - j = display.JSON(json.dumps(d)) - assert len(w) == 1 - assert j._repr_json_() == (d, metadata[0]) - - json_objs = [ - display.JSON(lis), - display.JSON(lis, expanded=True), - display.JSON(lis, root='custom'), - display.JSON(lis, expanded=True, root='custom'), - ] - for j, md in zip(json_objs, metadata): - assert j._repr_json_() == (lis, md) - - with warnings.catch_warnings(record=True) as w: - warnings.simplefilter("always") - j = display.JSON(json.dumps(lis)) - assert len(w) == 1 - assert j._repr_json_() == (lis, metadata[0]) - - -def test_video_embedding(): - """use a tempfile, with dummy-data, to ensure that video embedding doesn't crash""" - v = display.Video("http://ignored") - assert not v.embed - html = v._repr_html_() - assert 'src="data:' not in html - assert 'src="http://ignored"' in html - - with pytest.raises(ValueError): - v = display.Video(b'abc') - - with NamedFileInTemporaryDirectory('test.mp4') as f: - f.write(b'abc') - f.close() - - v = display.Video(f.name) - assert not v.embed - html = v._repr_html_() - assert 'src="data:' not in html - - v = display.Video(f.name, embed=True) - html = v._repr_html_() - assert 'src="data:video/mp4;base64,YWJj"' in html - - v = display.Video(f.name, embed=True, mimetype='video/other') - html = v._repr_html_() - assert 'src="data:video/other;base64,YWJj"' in html - - v = display.Video(b'abc', embed=True, mimetype='video/mp4') - html = v._repr_html_() - assert 'src="data:video/mp4;base64,YWJj"' in html - - v = display.Video(u'YWJj', embed=True, mimetype='video/xyz') - html = v._repr_html_() - assert 'src="data:video/xyz;base64,YWJj"' in html - -def test_html_metadata(): - s = "

Test

" - h = display.HTML(s, metadata={"isolated": True}) - assert h._repr_html_() == (s, {"isolated": True}) - - -def test_display_id(): - ip = get_ipython() - with mock.patch.object(ip.display_pub, 'publish') as pub: - handle = display.display('x') - assert handle is None - handle = display.display('y', display_id='secret') - assert isinstance(handle, display.DisplayHandle) - handle2 = display.display('z', display_id=True) - assert isinstance(handle2, display.DisplayHandle) - assert handle.display_id != handle2.display_id - - assert pub.call_count == 3 - args, kwargs = pub.call_args_list[0] - assert args == () - assert kwargs == { - 'data': { - 'text/plain': repr('x') - }, - 'metadata': {}, - } - args, kwargs = pub.call_args_list[1] - assert args == () - assert kwargs == { - 'data': { - 'text/plain': repr('y') - }, - 'metadata': {}, - 'transient': { - 'display_id': handle.display_id, - }, - } - args, kwargs = pub.call_args_list[2] - assert args == () - assert kwargs == { - 'data': { - 'text/plain': repr('z') - }, - 'metadata': {}, - 'transient': { - 'display_id': handle2.display_id, - }, - } - - -def test_update_display(): - ip = get_ipython() - with mock.patch.object(ip.display_pub, 'publish') as pub: - with pytest.raises(TypeError): - display.update_display('x') - display.update_display('x', display_id='1') - display.update_display('y', display_id='2') - args, kwargs = pub.call_args_list[0] - assert args == () - assert kwargs == { - 'data': { - 'text/plain': repr('x') - }, - 'metadata': {}, - 'transient': { - 'display_id': '1', - }, - 'update': True, - } - args, kwargs = pub.call_args_list[1] - assert args == () - assert kwargs == { - 'data': { - 'text/plain': repr('y') - }, - 'metadata': {}, - 'transient': { - 'display_id': '2', - }, - 'update': True, - } - - -def test_display_handle(): - ip = get_ipython() - handle = display.DisplayHandle() - assert isinstance(handle.display_id, str) - handle = display.DisplayHandle("my-id") - assert handle.display_id == "my-id" - with mock.patch.object(ip.display_pub, "publish") as pub: - handle.display("x") - handle.update("y") - - args, kwargs = pub.call_args_list[0] - assert args == () - assert kwargs == { - 'data': { - 'text/plain': repr('x') - }, - 'metadata': {}, - 'transient': { - 'display_id': handle.display_id, - } - } - args, kwargs = pub.call_args_list[1] - assert args == () - assert kwargs == { - 'data': { - 'text/plain': repr('y') - }, - 'metadata': {}, - 'transient': { - 'display_id': handle.display_id, - }, - 'update': True, - } - - -def test_image_alt_tag(): - """Simple test for display.Image(args, alt=x,)""" - thisurl = "http://example.com/image.png" - img = display.Image(url=thisurl, alt="an image") - assert 'an image' % (thisurl) == img._repr_html_() - img = display.Image(url=thisurl, unconfined=True, alt="an image") - assert ( - 'an image' % (thisurl) - == img._repr_html_() - ) - img = display.Image(url=thisurl, alt='>"& <') - assert '>"& <' % (thisurl) == img._repr_html_() - - img = display.Image(url=thisurl, metadata={"alt": "an image"}) - assert img.alt == "an image" - here = os.path.dirname(__file__) - img = display.Image(os.path.join(here, "2x2.png"), alt="an image") - assert img.alt == "an image" - _, md = img._repr_png_() - assert md["alt"] == "an image" - - -def test_image_bad_filename_raises_proper_exception(): - with pytest.raises(FileNotFoundError): - display.Image("/this/file/does/not/exist/")._repr_png_() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_displayhook.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_displayhook.py deleted file mode 100644 index 22899f3..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_displayhook.py +++ /dev/null @@ -1,112 +0,0 @@ -import sys -from IPython.testing.tools import AssertPrints, AssertNotPrints -from IPython.core.displayhook import CapturingDisplayHook -from IPython.utils.capture import CapturedIO - -def test_output_displayed(): - """Checking to make sure that output is displayed""" - - with AssertPrints('2'): - ip.run_cell('1+1', store_history=True) - - with AssertPrints('2'): - ip.run_cell('1+1 # comment with a semicolon;', store_history=True) - - with AssertPrints('2'): - ip.run_cell('1+1\n#commented_out_function();', store_history=True) - - -def test_output_quiet(): - """Checking to make sure that output is quiet""" - - with AssertNotPrints('2'): - ip.run_cell('1+1;', store_history=True) - - with AssertNotPrints('2'): - ip.run_cell('1+1; # comment with a semicolon', store_history=True) - - with AssertNotPrints('2'): - ip.run_cell('1+1;\n#commented_out_function()', store_history=True) - -def test_underscore_no_overwrite_user(): - ip.run_cell('_ = 42', store_history=True) - ip.run_cell('1+1', store_history=True) - - with AssertPrints('42'): - ip.run_cell('print(_)', store_history=True) - - ip.run_cell('del _', store_history=True) - ip.run_cell('6+6', store_history=True) - with AssertPrints('12'): - ip.run_cell('_', store_history=True) - - -def test_underscore_no_overwrite_builtins(): - ip.run_cell("import gettext ; gettext.install('foo')", store_history=True) - ip.run_cell('3+3', store_history=True) - - with AssertPrints('gettext'): - ip.run_cell('print(_)', store_history=True) - - ip.run_cell('_ = "userset"', store_history=True) - - with AssertPrints('userset'): - ip.run_cell('print(_)', store_history=True) - ip.run_cell('import builtins; del builtins._') - - -def test_interactivehooks_ast_modes(): - """ - Test that ast nodes can be triggered with different modes - """ - saved_mode = ip.ast_node_interactivity - ip.ast_node_interactivity = 'last_expr_or_assign' - - try: - with AssertPrints('2'): - ip.run_cell('a = 1+1', store_history=True) - - with AssertPrints('9'): - ip.run_cell('b = 1+8 # comment with a semicolon;', store_history=False) - - with AssertPrints('7'): - ip.run_cell('c = 1+6\n#commented_out_function();', store_history=True) - - ip.run_cell('d = 11', store_history=True) - with AssertPrints('12'): - ip.run_cell('d += 1', store_history=True) - - with AssertNotPrints('42'): - ip.run_cell('(u,v) = (41+1, 43-1)') - - finally: - ip.ast_node_interactivity = saved_mode - -def test_interactivehooks_ast_modes_semi_suppress(): - """ - Test that ast nodes can be triggered with different modes and suppressed - by semicolon - """ - saved_mode = ip.ast_node_interactivity - ip.ast_node_interactivity = 'last_expr_or_assign' - - try: - with AssertNotPrints('2'): - ip.run_cell('x = 1+1;', store_history=True) - - with AssertNotPrints('7'): - ip.run_cell('y = 1+6; # comment with a semicolon', store_history=True) - - with AssertNotPrints('9'): - ip.run_cell('z = 1+8;\n#commented_out_function()', store_history=True) - - finally: - ip.ast_node_interactivity = saved_mode - -def test_capture_display_hook_format(): - """Tests that the capture display hook conforms to the CapturedIO output format""" - hook = CapturingDisplayHook(ip) - hook({"foo": "bar"}) - captured = CapturedIO(sys.stdout, sys.stderr, hook.outputs) - # Should not raise with RichOutput transformation error - captured.outputs diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_events.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_events.py deleted file mode 100644 index 61bc01d..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_events.py +++ /dev/null @@ -1,78 +0,0 @@ -import unittest -from unittest.mock import Mock - -from IPython.core import events -import IPython.testing.tools as tt - - -@events._define_event -def ping_received(): - pass - - -@events._define_event -def event_with_argument(argument): - pass - - -class CallbackTests(unittest.TestCase): - def setUp(self): - self.em = events.EventManager(get_ipython(), - {'ping_received': ping_received, - 'event_with_argument': event_with_argument}) - - def test_register_unregister(self): - cb = Mock() - - self.em.register('ping_received', cb) - self.em.trigger('ping_received') - self.assertEqual(cb.call_count, 1) - - self.em.unregister('ping_received', cb) - self.em.trigger('ping_received') - self.assertEqual(cb.call_count, 1) - - def test_bare_function_missed_unregister(self): - def cb1(): - ... - - def cb2(): - ... - - self.em.register("ping_received", cb1) - self.assertRaises(ValueError, self.em.unregister, "ping_received", cb2) - self.em.unregister("ping_received", cb1) - - def test_cb_error(self): - cb = Mock(side_effect=ValueError) - self.em.register('ping_received', cb) - with tt.AssertPrints("Error in callback"): - self.em.trigger('ping_received') - - def test_cb_keyboard_interrupt(self): - cb = Mock(side_effect=KeyboardInterrupt) - self.em.register('ping_received', cb) - with tt.AssertPrints("Error in callback"): - self.em.trigger('ping_received') - - def test_unregister_during_callback(self): - invoked = [False] * 3 - - def func1(*_): - invoked[0] = True - self.em.unregister('ping_received', func1) - self.em.register('ping_received', func3) - - def func2(*_): - invoked[1] = True - self.em.unregister('ping_received', func2) - - def func3(*_): - invoked[2] = True - - self.em.register('ping_received', func1) - self.em.register('ping_received', func2) - - self.em.trigger('ping_received') - self.assertEqual([True, True, False], invoked) - self.assertEqual([func3], self.em.callbacks['ping_received']) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_exceptiongroup_tb.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_exceptiongroup_tb.py deleted file mode 100644 index c8e8002..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_exceptiongroup_tb.py +++ /dev/null @@ -1,112 +0,0 @@ -import unittest -import re -from IPython.utils.capture import capture_output -import sys -import pytest -from tempfile import TemporaryDirectory -from IPython.testing import tools as tt - - -def _exceptiongroup_common( - outer_chain: str, - inner_chain: str, - native: bool, -) -> None: - pre_raise = "exceptiongroup." if not native else "" - pre_catch = pre_raise if sys.version_info < (3, 11) else "" - filestr = f""" - {"import exceptiongroup" if not native else ""} - import pytest - - def f(): raise ValueError("From f()") - def g(): raise BaseException("From g()") - - def inner(inner_chain): - excs = [] - for callback in [f, g]: - try: - callback() - except BaseException as err: - excs.append(err) - if excs: - if inner_chain == "none": - raise {pre_raise}BaseExceptionGroup("Oops", excs) - try: - raise SyntaxError() - except SyntaxError as e: - if inner_chain == "from": - raise {pre_raise}BaseExceptionGroup("Oops", excs) from e - else: - raise {pre_raise}BaseExceptionGroup("Oops", excs) - - def outer(outer_chain, inner_chain): - try: - inner(inner_chain) - except {pre_catch}BaseExceptionGroup as e: - if outer_chain == "none": - raise - if outer_chain == "from": - raise IndexError() from e - else: - raise IndexError - - - outer("{outer_chain}", "{inner_chain}") - """ - with capture_output() as cap: - ip.run_cell(filestr) - - match_lines = [] - if inner_chain == "another": - match_lines += [ - "During handling of the above exception, another exception occurred:", - ] - elif inner_chain == "from": - match_lines += [ - "The above exception was the direct cause of the following exception:", - ] - - match_lines += [ - " + Exception Group Traceback (most recent call last):", - f" | {pre_catch}BaseExceptionGroup: Oops (2 sub-exceptions)", - " | ValueError: From f()", - " | BaseException: From g()", - ] - - if outer_chain == "another": - match_lines += [ - "During handling of the above exception, another exception occurred:", - "IndexError", - ] - elif outer_chain == "from": - match_lines += [ - "The above exception was the direct cause of the following exception:", - "IndexError", - ] - - error_lines = cap.stderr.split("\n") - - err_index = match_index = 0 - for expected in match_lines: - for i, actual in enumerate(error_lines): - if actual == expected: - error_lines = error_lines[i + 1 :] - break - else: - assert False, f"{expected} not found in cap.stderr" - - -@pytest.mark.skipif( - sys.version_info < (3, 11), reason="Native ExceptionGroup not implemented" -) -@pytest.mark.parametrize("outer_chain", ["none", "from", "another"]) -@pytest.mark.parametrize("inner_chain", ["none", "from", "another"]) -def test_native_exceptiongroup(outer_chain, inner_chain) -> None: - _exceptiongroup_common(outer_chain, inner_chain, native=True) - - -@pytest.mark.parametrize("outer_chain", ["none", "from", "another"]) -@pytest.mark.parametrize("inner_chain", ["none", "from", "another"]) -def test_native_exceptiongroup(outer_chain, inner_chain) -> None: - pytest.importorskip("exceptiongroup") - _exceptiongroup_common(outer_chain, inner_chain, native=False) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_extension.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_extension.py deleted file mode 100644 index 24ecf7e..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_extension.py +++ /dev/null @@ -1,95 +0,0 @@ -import os.path - -from tempfile import TemporaryDirectory - -import IPython.testing.tools as tt -from IPython.utils.syspathcontext import prepended_to_syspath - -ext1_content = """ -def load_ipython_extension(ip): - print("Running ext1 load") - -def unload_ipython_extension(ip): - print("Running ext1 unload") -""" - -ext2_content = """ -def load_ipython_extension(ip): - print("Running ext2 load") -""" - -ext3_content = """ -def load_ipython_extension(ip): - ip2 = get_ipython() - print(ip is ip2) -""" - -def test_extension_loading(): - em = get_ipython().extension_manager - with TemporaryDirectory() as td: - ext1 = os.path.join(td, "ext1.py") - with open(ext1, "w", encoding="utf-8") as f: - f.write(ext1_content) - - ext2 = os.path.join(td, "ext2.py") - with open(ext2, "w", encoding="utf-8") as f: - f.write(ext2_content) - - with prepended_to_syspath(td): - assert 'ext1' not in em.loaded - assert 'ext2' not in em.loaded - - # Load extension - with tt.AssertPrints("Running ext1 load"): - assert em.load_extension('ext1') is None - assert 'ext1' in em.loaded - - # Should refuse to load it again - with tt.AssertNotPrints("Running ext1 load"): - assert em.load_extension('ext1') == 'already loaded' - - # Reload - with tt.AssertPrints("Running ext1 unload"): - with tt.AssertPrints("Running ext1 load", suppress=False): - em.reload_extension('ext1') - - # Unload - with tt.AssertPrints("Running ext1 unload"): - assert em.unload_extension('ext1') is None - - # Can't unload again - with tt.AssertNotPrints("Running ext1 unload"): - assert em.unload_extension('ext1') == 'not loaded' - assert em.unload_extension('ext2') == 'not loaded' - - # Load extension 2 - with tt.AssertPrints("Running ext2 load"): - assert em.load_extension('ext2') is None - - # Can't unload this - assert em.unload_extension('ext2') == 'no unload function' - - # But can reload it - with tt.AssertPrints("Running ext2 load"): - em.reload_extension('ext2') - - -def test_extension_builtins(): - em = get_ipython().extension_manager - with TemporaryDirectory() as td: - ext3 = os.path.join(td, "ext3.py") - with open(ext3, "w", encoding="utf-8") as f: - f.write(ext3_content) - - assert 'ext3' not in em.loaded - - with prepended_to_syspath(td): - # Load extension - with tt.AssertPrints("True"): - assert em.load_extension('ext3') is None - assert 'ext3' in em.loaded - - -def test_non_extension(): - em = get_ipython().extension_manager - assert em.load_extension("sys") == "no load function" diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_formatters.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_formatters.py deleted file mode 100644 index 5f8eeda..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_formatters.py +++ /dev/null @@ -1,545 +0,0 @@ -"""Tests for the Formatters.""" - -from math import pi - -try: - import numpy -except: - numpy = None -import pytest - -from IPython import get_ipython -from traitlets.config import Config -from IPython.core.formatters import ( - PlainTextFormatter, HTMLFormatter, PDFFormatter, _mod_name_key, - DisplayFormatter, JSONFormatter, -) -from IPython.utils.io import capture_output - -class A(object): - def __repr__(self): - return 'A()' - -class B(A): - def __repr__(self): - return 'B()' - -class C: - pass - -class BadRepr(object): - def __repr__(self): - raise ValueError("bad repr") - -class BadPretty(object): - _repr_pretty_ = None - -class GoodPretty(object): - def _repr_pretty_(self, pp, cycle): - pp.text('foo') - - def __repr__(self): - return 'GoodPretty()' - -def foo_printer(obj, pp, cycle): - pp.text('foo') - -def test_pretty(): - f = PlainTextFormatter() - f.for_type(A, foo_printer) - assert f(A()) == "foo" - assert f(B()) == "B()" - assert f(GoodPretty()) == "foo" - # Just don't raise an exception for the following: - f(BadPretty()) - - f.pprint = False - assert f(A()) == "A()" - assert f(B()) == "B()" - assert f(GoodPretty()) == "GoodPretty()" - - -def test_deferred(): - f = PlainTextFormatter() - -def test_precision(): - """test various values for float_precision.""" - f = PlainTextFormatter() - assert f(pi) == repr(pi) - f.float_precision = 0 - if numpy: - po = numpy.get_printoptions() - assert po["precision"] == 0 - assert f(pi) == "3" - f.float_precision = 2 - if numpy: - po = numpy.get_printoptions() - assert po["precision"] == 2 - assert f(pi) == "3.14" - f.float_precision = "%g" - if numpy: - po = numpy.get_printoptions() - assert po["precision"] == 2 - assert f(pi) == "3.14159" - f.float_precision = "%e" - assert f(pi) == "3.141593e+00" - f.float_precision = "" - if numpy: - po = numpy.get_printoptions() - assert po["precision"] == 8 - assert f(pi) == repr(pi) - - -def test_bad_precision(): - """test various invalid values for float_precision.""" - f = PlainTextFormatter() - def set_fp(p): - f.float_precision = p - - pytest.raises(ValueError, set_fp, "%") - pytest.raises(ValueError, set_fp, "%.3f%i") - pytest.raises(ValueError, set_fp, "foo") - pytest.raises(ValueError, set_fp, -1) - -def test_for_type(): - f = PlainTextFormatter() - - # initial return, None - assert f.for_type(C, foo_printer) is None - # no func queries - assert f.for_type(C) is foo_printer - # shouldn't change anything - assert f.for_type(C) is foo_printer - # None should do the same - assert f.for_type(C, None) is foo_printer - assert f.for_type(C, None) is foo_printer - -def test_for_type_string(): - f = PlainTextFormatter() - - type_str = '%s.%s' % (C.__module__, 'C') - - # initial return, None - assert f.for_type(type_str, foo_printer) is None - # no func queries - assert f.for_type(type_str) is foo_printer - assert _mod_name_key(C) in f.deferred_printers - assert f.for_type(C) is foo_printer - assert _mod_name_key(C) not in f.deferred_printers - assert C in f.type_printers - -def test_for_type_by_name(): - f = PlainTextFormatter() - - mod = C.__module__ - - # initial return, None - assert f.for_type_by_name(mod, "C", foo_printer) is None - # no func queries - assert f.for_type_by_name(mod, "C") is foo_printer - # shouldn't change anything - assert f.for_type_by_name(mod, "C") is foo_printer - # None should do the same - assert f.for_type_by_name(mod, "C", None) is foo_printer - assert f.for_type_by_name(mod, "C", None) is foo_printer - - -def test_lookup(): - f = PlainTextFormatter() - - f.for_type(C, foo_printer) - assert f.lookup(C()) is foo_printer - with pytest.raises(KeyError): - f.lookup(A()) - -def test_lookup_string(): - f = PlainTextFormatter() - type_str = '%s.%s' % (C.__module__, 'C') - - f.for_type(type_str, foo_printer) - assert f.lookup(C()) is foo_printer - # should move from deferred to imported dict - assert _mod_name_key(C) not in f.deferred_printers - assert C in f.type_printers - -def test_lookup_by_type(): - f = PlainTextFormatter() - f.for_type(C, foo_printer) - assert f.lookup_by_type(C) is foo_printer - with pytest.raises(KeyError): - f.lookup_by_type(A) - -def test_lookup_by_type_string(): - f = PlainTextFormatter() - type_str = '%s.%s' % (C.__module__, 'C') - f.for_type(type_str, foo_printer) - - # verify insertion - assert _mod_name_key(C) in f.deferred_printers - assert C not in f.type_printers - - assert f.lookup_by_type(type_str) is foo_printer - # lookup by string doesn't cause import - assert _mod_name_key(C) in f.deferred_printers - assert C not in f.type_printers - - assert f.lookup_by_type(C) is foo_printer - # should move from deferred to imported dict - assert _mod_name_key(C) not in f.deferred_printers - assert C in f.type_printers - -def test_in_formatter(): - f = PlainTextFormatter() - f.for_type(C, foo_printer) - type_str = '%s.%s' % (C.__module__, 'C') - assert C in f - assert type_str in f - -def test_string_in_formatter(): - f = PlainTextFormatter() - type_str = '%s.%s' % (C.__module__, 'C') - f.for_type(type_str, foo_printer) - assert type_str in f - assert C in f - -def test_pop(): - f = PlainTextFormatter() - f.for_type(C, foo_printer) - assert f.lookup_by_type(C) is foo_printer - assert f.pop(C, None) is foo_printer - f.for_type(C, foo_printer) - assert f.pop(C) is foo_printer - with pytest.raises(KeyError): - f.lookup_by_type(C) - with pytest.raises(KeyError): - f.pop(C) - with pytest.raises(KeyError): - f.pop(A) - assert f.pop(A, None) is None - -def test_pop_string(): - f = PlainTextFormatter() - type_str = '%s.%s' % (C.__module__, 'C') - - with pytest.raises(KeyError): - f.pop(type_str) - - f.for_type(type_str, foo_printer) - f.pop(type_str) - with pytest.raises(KeyError): - f.lookup_by_type(C) - with pytest.raises(KeyError): - f.pop(type_str) - - f.for_type(C, foo_printer) - assert f.pop(type_str, None) is foo_printer - with pytest.raises(KeyError): - f.lookup_by_type(C) - with pytest.raises(KeyError): - f.pop(type_str) - assert f.pop(type_str, None) is None - - -def test_error_method(): - f = HTMLFormatter() - class BadHTML(object): - def _repr_html_(self): - raise ValueError("Bad HTML") - bad = BadHTML() - with capture_output() as captured: - result = f(bad) - assert result is None - assert "Traceback" in captured.stdout - assert "Bad HTML" in captured.stdout - assert "_repr_html_" in captured.stdout - -def test_nowarn_notimplemented(): - f = HTMLFormatter() - class HTMLNotImplemented(object): - def _repr_html_(self): - raise NotImplementedError - h = HTMLNotImplemented() - with capture_output() as captured: - result = f(h) - assert result is None - assert "" == captured.stderr - assert "" == captured.stdout - - -def test_warn_error_for_type(): - f = HTMLFormatter() - f.for_type(int, lambda i: name_error) - with capture_output() as captured: - result = f(5) - assert result is None - assert "Traceback" in captured.stdout - assert "NameError" in captured.stdout - assert "name_error" in captured.stdout - -def test_error_pretty_method(): - f = PlainTextFormatter() - class BadPretty(object): - def _repr_pretty_(self): - return "hello" - bad = BadPretty() - with capture_output() as captured: - result = f(bad) - assert result is None - assert "Traceback" in captured.stdout - assert "_repr_pretty_" in captured.stdout - assert "given" in captured.stdout - assert "argument" in captured.stdout - - -def test_bad_repr_traceback(): - f = PlainTextFormatter() - bad = BadRepr() - with capture_output() as captured: - result = f(bad) - # catches error, returns None - assert result is None - assert "Traceback" in captured.stdout - assert "__repr__" in captured.stdout - assert "ValueError" in captured.stdout - - -class MakePDF(object): - def _repr_pdf_(self): - return 'PDF' - -def test_pdf_formatter(): - pdf = MakePDF() - f = PDFFormatter() - assert f(pdf) == "PDF" - - -def test_print_method_bound(): - f = HTMLFormatter() - class MyHTML(object): - def _repr_html_(self): - return "hello" - with capture_output() as captured: - result = f(MyHTML) - assert result is None - assert "FormatterWarning" not in captured.stderr - - with capture_output() as captured: - result = f(MyHTML()) - assert result == "hello" - assert captured.stderr == "" - - -def test_print_method_weird(): - - class TextMagicHat(object): - def __getattr__(self, key): - return key - - f = HTMLFormatter() - - text_hat = TextMagicHat() - assert text_hat._repr_html_ == "_repr_html_" - with capture_output() as captured: - result = f(text_hat) - - assert result is None - assert "FormatterWarning" not in captured.stderr - - class CallableMagicHat(object): - def __getattr__(self, key): - return lambda : key - - call_hat = CallableMagicHat() - with capture_output() as captured: - result = f(call_hat) - - assert result is None - - class BadReprArgs(object): - def _repr_html_(self, extra, args): - return "html" - - bad = BadReprArgs() - with capture_output() as captured: - result = f(bad) - - assert result is None - assert "FormatterWarning" not in captured.stderr - - -def test_format_config(): - """config objects don't pretend to support fancy reprs with lazy attrs""" - f = HTMLFormatter() - cfg = Config() - with capture_output() as captured: - result = f(cfg) - assert result is None - assert captured.stderr == "" - - with capture_output() as captured: - result = f(Config) - assert result is None - assert captured.stderr == "" - - -def test_pretty_max_seq_length(): - f = PlainTextFormatter(max_seq_length=1) - lis = list(range(3)) - text = f(lis) - assert text == "[0, ...]" - f.max_seq_length = 0 - text = f(lis) - assert text == "[0, 1, 2]" - text = f(list(range(1024))) - lines = text.splitlines() - assert len(lines) == 1024 - - -def test_ipython_display_formatter(): - """Objects with _ipython_display_ defined bypass other formatters""" - f = get_ipython().display_formatter - catcher = [] - class SelfDisplaying(object): - def _ipython_display_(self): - catcher.append(self) - - class NotSelfDisplaying(object): - def __repr__(self): - return "NotSelfDisplaying" - - def _ipython_display_(self): - raise NotImplementedError - - save_enabled = f.ipython_display_formatter.enabled - f.ipython_display_formatter.enabled = True - - yes = SelfDisplaying() - no = NotSelfDisplaying() - - d, md = f.format(no) - assert d == {"text/plain": repr(no)} - assert md == {} - assert catcher == [] - - d, md = f.format(yes) - assert d == {} - assert md == {} - assert catcher == [yes] - - f.ipython_display_formatter.enabled = save_enabled - - -def test_repr_mime(): - class HasReprMime(object): - def _repr_mimebundle_(self, include=None, exclude=None): - return { - 'application/json+test.v2': { - 'x': 'y' - }, - 'plain/text' : '', - 'image/png' : 'i-overwrite' - } - - def _repr_png_(self): - return 'should-be-overwritten' - def _repr_html_(self): - return 'hi!' - - f = get_ipython().display_formatter - html_f = f.formatters['text/html'] - save_enabled = html_f.enabled - html_f.enabled = True - obj = HasReprMime() - d, md = f.format(obj) - html_f.enabled = save_enabled - - assert sorted(d) == [ - "application/json+test.v2", - "image/png", - "plain/text", - "text/html", - "text/plain", - ] - assert md == {} - - d, md = f.format(obj, include={"image/png"}) - assert list(d.keys()) == [ - "image/png" - ], "Include should filter out even things from repr_mimebundle" - - assert d["image/png"] == "i-overwrite", "_repr_mimebundle_ take precedence" - - -def test_pass_correct_include_exclude(): - class Tester(object): - - def __init__(self, include=None, exclude=None): - self.include = include - self.exclude = exclude - - def _repr_mimebundle_(self, include, exclude, **kwargs): - if include and (include != self.include): - raise ValueError('include got modified: display() may be broken.') - if exclude and (exclude != self.exclude): - raise ValueError('exclude got modified: display() may be broken.') - - return None - - include = {'a', 'b', 'c'} - exclude = {'c', 'e' , 'f'} - - f = get_ipython().display_formatter - f.format(Tester(include=include, exclude=exclude), include=include, exclude=exclude) - f.format(Tester(exclude=exclude), exclude=exclude) - f.format(Tester(include=include), include=include) - - -def test_repr_mime_meta(): - class HasReprMimeMeta(object): - def _repr_mimebundle_(self, include=None, exclude=None): - data = { - 'image/png': 'base64-image-data', - } - metadata = { - 'image/png': { - 'width': 5, - 'height': 10, - } - } - return (data, metadata) - - f = get_ipython().display_formatter - obj = HasReprMimeMeta() - d, md = f.format(obj) - assert sorted(d) == ["image/png", "text/plain"] - assert md == { - "image/png": { - "width": 5, - "height": 10, - } - } - - -def test_repr_mime_failure(): - class BadReprMime(object): - def _repr_mimebundle_(self, include=None, exclude=None): - raise RuntimeError - - f = get_ipython().display_formatter - obj = BadReprMime() - d, md = f.format(obj) - assert "text/plain" in d - - -def test_custom_repr_namedtuple_partialmethod(): - from functools import partialmethod - from typing import NamedTuple - - class Foo(NamedTuple): ... - - Foo.__repr__ = partialmethod(lambda obj: "Hello World") - foo = Foo() - - f = PlainTextFormatter() - assert f.pprint - assert f(foo) == "Hello World" diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_guarded_eval.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_guarded_eval.py deleted file mode 100644 index f9057d8..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_guarded_eval.py +++ /dev/null @@ -1,785 +0,0 @@ -import sys -from contextlib import contextmanager -from typing import ( - Annotated, - AnyStr, - NamedTuple, - Literal, - NewType, - Optional, - Protocol, - TypeGuard, - Union, - TypedDict, -) -from functools import partial -from IPython.core.guarded_eval import ( - EvaluationContext, - GuardRejection, - guarded_eval, - _unbind_method, -) -from IPython.testing import decorators as dec -import pytest - - -if sys.version_info < (3, 11): - from typing_extensions import Self, LiteralString -else: - from typing import Self, LiteralString - -if sys.version_info < (3, 12): - from typing_extensions import TypeAliasType -else: - from typing import TypeAliasType - - -def create_context(evaluation: str, **kwargs): - return EvaluationContext(locals=kwargs, globals={}, evaluation=evaluation) - - -forbidden = partial(create_context, "forbidden") -minimal = partial(create_context, "minimal") -limited = partial(create_context, "limited") -unsafe = partial(create_context, "unsafe") -dangerous = partial(create_context, "dangerous") - -LIMITED_OR_HIGHER = [limited, unsafe, dangerous] -MINIMAL_OR_HIGHER = [minimal, *LIMITED_OR_HIGHER] - - -@contextmanager -def module_not_installed(module: str): - import sys - - try: - to_restore = sys.modules[module] - del sys.modules[module] - except KeyError: - to_restore = None - try: - yield - finally: - sys.modules[module] = to_restore - - -def test_external_not_installed(): - """ - Because attribute check requires checking if object is not of allowed - external type, this tests logic for absence of external module. - """ - - class Custom: - def __init__(self): - self.test = 1 - - def __getattr__(self, key): - return key - - with module_not_installed("pandas"): - context = limited(x=Custom()) - with pytest.raises(GuardRejection): - guarded_eval("x.test", context) - - -@dec.skip_without("pandas") -def test_external_changed_api(monkeypatch): - """Check that the execution rejects if external API changed paths""" - import pandas as pd - - series = pd.Series([1], index=["a"]) - - with monkeypatch.context() as m: - m.delattr(pd, "Series") - context = limited(data=series) - with pytest.raises(GuardRejection): - guarded_eval("data.iloc[0]", context) - - -@dec.skip_without("pandas") -def test_pandas_series_iloc(): - import pandas as pd - - series = pd.Series([1], index=["a"]) - context = limited(data=series) - assert guarded_eval("data.iloc[0]", context) == 1 - - -def test_rejects_custom_properties(): - class BadProperty: - @property - def iloc(self): - return [None] - - series = BadProperty() - context = limited(data=series) - - with pytest.raises(GuardRejection): - guarded_eval("data.iloc[0]", context) - - -@dec.skip_without("pandas") -def test_accepts_non_overriden_properties(): - import pandas as pd - - class GoodProperty(pd.Series): - pass - - series = GoodProperty([1], index=["a"]) - context = limited(data=series) - - assert guarded_eval("data.iloc[0]", context) == 1 - - -@dec.skip_without("pandas") -def test_pandas_series(): - import pandas as pd - - context = limited(data=pd.Series([1], index=["a"])) - assert guarded_eval('data["a"]', context) == 1 - with pytest.raises(KeyError): - guarded_eval('data["c"]', context) - - -@dec.skip_without("pandas") -def test_pandas_bad_series(): - import pandas as pd - - class BadItemSeries(pd.Series): - def __getitem__(self, key): - return "CUSTOM_ITEM" - - class BadAttrSeries(pd.Series): - def __getattr__(self, key): - return "CUSTOM_ATTR" - - bad_series = BadItemSeries([1], index=["a"]) - context = limited(data=bad_series) - - with pytest.raises(GuardRejection): - guarded_eval('data["a"]', context) - with pytest.raises(GuardRejection): - guarded_eval('data["c"]', context) - - # note: here result is a bit unexpected because - # pandas `__getattr__` calls `__getitem__`; - # FIXME - special case to handle it? - assert guarded_eval("data.a", context) == "CUSTOM_ITEM" - - context = unsafe(data=bad_series) - assert guarded_eval('data["a"]', context) == "CUSTOM_ITEM" - - bad_attr_series = BadAttrSeries([1], index=["a"]) - context = limited(data=bad_attr_series) - assert guarded_eval('data["a"]', context) == 1 - with pytest.raises(GuardRejection): - guarded_eval("data.a", context) - - -@dec.skip_without("pandas") -def test_pandas_dataframe_loc(): - import pandas as pd - from pandas.testing import assert_series_equal - - data = pd.DataFrame([{"a": 1}]) - context = limited(data=data) - assert_series_equal(guarded_eval('data.loc[:, "a"]', context), data["a"]) - - -def test_named_tuple(): - class GoodNamedTuple(NamedTuple): - a: str - pass - - class BadNamedTuple(NamedTuple): - a: str - - def __getitem__(self, key): - return None - - good = GoodNamedTuple(a="x") - bad = BadNamedTuple(a="x") - - context = limited(data=good) - assert guarded_eval("data[0]", context) == "x" - - context = limited(data=bad) - with pytest.raises(GuardRejection): - guarded_eval("data[0]", context) - - -def test_dict(): - context = limited(data={"a": 1, "b": {"x": 2}, ("x", "y"): 3}) - assert guarded_eval('data["a"]', context) == 1 - assert guarded_eval('data["b"]', context) == {"x": 2} - assert guarded_eval('data["b"]["x"]', context) == 2 - assert guarded_eval('data["x", "y"]', context) == 3 - - assert guarded_eval("data.keys", context) - - -def test_set(): - context = limited(data={"a", "b"}) - assert guarded_eval("data.difference", context) - - -def test_list(): - context = limited(data=[1, 2, 3]) - assert guarded_eval("data[1]", context) == 2 - assert guarded_eval("data.copy", context) - - -def test_dict_literal(): - context = limited() - assert guarded_eval("{}", context) == {} - assert guarded_eval('{"a": 1}', context) == {"a": 1} - - -def test_list_literal(): - context = limited() - assert guarded_eval("[]", context) == [] - assert guarded_eval('[1, "a"]', context) == [1, "a"] - - -def test_set_literal(): - context = limited() - assert guarded_eval("set()", context) == set() - assert guarded_eval('{"a"}', context) == {"a"} - - -def test_evaluates_if_expression(): - context = limited() - assert guarded_eval("2 if True else 3", context) == 2 - assert guarded_eval("4 if False else 5", context) == 5 - - -def test_object(): - obj = object() - context = limited(obj=obj) - assert guarded_eval("obj.__dir__", context) == obj.__dir__ - - -@pytest.mark.parametrize( - "code,expected", - [ - ["int.numerator", int.numerator], - ["float.is_integer", float.is_integer], - ["complex.real", complex.real], - ], -) -def test_number_attributes(code, expected): - assert guarded_eval(code, limited()) == expected - - -def test_method_descriptor(): - context = limited() - assert guarded_eval("list.copy.__name__", context) == "copy" - - -class HeapType: - pass - - -class CallCreatesHeapType: - def __call__(self) -> HeapType: - return HeapType() - - -class CallCreatesBuiltin: - def __call__(self) -> frozenset: - return frozenset() - - -class HasStaticMethod: - @staticmethod - def static_method() -> HeapType: - return HeapType() - - -class InitReturnsFrozenset: - def __new__(self) -> frozenset: # type:ignore[misc] - return frozenset() - - -class StringAnnotation: - def heap(self) -> "HeapType": - return HeapType() - - def copy(self) -> "StringAnnotation": - return StringAnnotation() - - -CustomIntType = NewType("CustomIntType", int) -CustomHeapType = NewType("CustomHeapType", HeapType) -IntTypeAlias = TypeAliasType("IntTypeAlias", int) -HeapTypeAlias = TypeAliasType("HeapTypeAlias", HeapType) - - -class TestProtocol(Protocol): - def test_method(self) -> bool: - pass - - -class TestProtocolImplementer(TestProtocol): - def test_method(self) -> bool: - return True - - -class Movie(TypedDict): - name: str - year: int - - -class SpecialTyping: - def custom_int_type(self) -> CustomIntType: - return CustomIntType(1) - - def custom_heap_type(self) -> CustomHeapType: - return CustomHeapType(HeapType()) - - # TODO: remove type:ignore comment once mypy - # supports explicit calls to `TypeAliasType`, see: - # https://github.com/python/mypy/issues/16614 - def int_type_alias(self) -> IntTypeAlias: # type:ignore[valid-type] - return 1 - - def heap_type_alias(self) -> HeapTypeAlias: # type:ignore[valid-type] - return 1 - - def literal(self) -> Literal[False]: - return False - - def literal_string(self) -> LiteralString: - return "test" - - def self(self) -> Self: - return self - - def any_str(self, x: AnyStr) -> AnyStr: - return x - - def annotated(self) -> Annotated[float, "positive number"]: - return 1 - - def annotated_self(self) -> Annotated[Self, "self with metadata"]: - self._metadata = "test" - return self - - def int_type_guard(self, x) -> TypeGuard[int]: - return isinstance(x, int) - - def optional_float(self) -> Optional[float]: - return 1.0 - - def union_str_and_int(self) -> Union[str, int]: - return "" - - def protocol(self) -> TestProtocol: - return TestProtocolImplementer() - - def typed_dict(self) -> Movie: - return {"name": "The Matrix", "year": 1999} - - -@pytest.mark.parametrize( - "data,code,expected,equality", - [ - [[1, 2, 3], "data.index(2)", 1, True], - [{"a": 1}, "data.keys().isdisjoint({})", True, True], - [StringAnnotation(), "data.heap()", HeapType, False], - [StringAnnotation(), "data.copy()", StringAnnotation, False], - # test cases for `__call__` - [CallCreatesHeapType(), "data()", HeapType, False], - [CallCreatesBuiltin(), "data()", frozenset, False], - # Test cases for `__init__` - [HeapType, "data()", HeapType, False], - [InitReturnsFrozenset, "data()", frozenset, False], - [HeapType(), "data.__class__()", HeapType, False], - # supported special cases for typing - [SpecialTyping(), "data.custom_int_type()", int, False], - [SpecialTyping(), "data.custom_heap_type()", HeapType, False], - [SpecialTyping(), "data.int_type_alias()", int, False], - [SpecialTyping(), "data.heap_type_alias()", HeapType, False], - [SpecialTyping(), "data.self()", SpecialTyping, False], - [SpecialTyping(), "data.literal()", False, True], - [SpecialTyping(), "data.literal_string()", str, False], - [SpecialTyping(), "data.any_str('a')", str, False], - [SpecialTyping(), "data.any_str(b'a')", bytes, False], - [SpecialTyping(), "data.annotated()", float, False], - [SpecialTyping(), "data.annotated_self()", SpecialTyping, False], - [SpecialTyping(), "data.int_type_guard()", int, False], - # test cases for static methods - [HasStaticMethod, "data.static_method()", HeapType, False], - ], -) -def test_evaluates_calls(data, code, expected, equality): - context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation) - value = guarded_eval(code, context) - if equality: - assert value == expected - else: - assert isinstance(value, expected) - - -@pytest.mark.parametrize( - "data,code,expected_attributes", - [ - [SpecialTyping(), "data.optional_float()", ["is_integer"]], - [ - SpecialTyping(), - "data.union_str_and_int()", - ["capitalize", "as_integer_ratio"], - ], - [SpecialTyping(), "data.protocol()", ["test_method"]], - [SpecialTyping(), "data.typed_dict()", ["keys", "values", "items"]], - ], -) -def test_mocks_attributes_of_call_results(data, code, expected_attributes): - context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation) - result = guarded_eval(code, context) - for attr in expected_attributes: - assert hasattr(result, attr) - assert attr in dir(result) - - -@pytest.mark.parametrize( - "data,code,expected_items", - [ - [SpecialTyping(), "data.typed_dict()", {"year": int, "name": str}], - ], -) -def test_mocks_items_of_call_results(data, code, expected_items): - context = limited(data=data, HeapType=HeapType, StringAnnotation=StringAnnotation) - result = guarded_eval(code, context) - ipython_keys = result._ipython_key_completions_() - for key, value in expected_items.items(): - assert isinstance(result[key], value) - assert key in ipython_keys - - -@pytest.mark.parametrize( - "data,bad", - [ - [[1, 2, 3], "data.append(4)"], - [{"a": 1}, "data.update()"], - ], -) -def test_rejects_calls_with_side_effects(data, bad): - context = limited(data=data) - - with pytest.raises(GuardRejection): - guarded_eval(bad, context) - - -@pytest.mark.parametrize( - "code,expected", - [ - ["(1\n+\n1)", 2], - ["list(range(10))[-1:]", [9]], - ["list(range(20))[3:-2:3]", [3, 6, 9, 12, 15]], - ], -) -@pytest.mark.parametrize("context", LIMITED_OR_HIGHER) -def test_evaluates_complex_cases(code, expected, context): - assert guarded_eval(code, context()) == expected - - -@pytest.mark.parametrize( - "code,expected", - [ - ["1", 1], - ["1.0", 1.0], - ["0xdeedbeef", 0xDEEDBEEF], - ["True", True], - ["None", None], - ["{}", {}], - ["[]", []], - ], -) -@pytest.mark.parametrize("context", MINIMAL_OR_HIGHER) -def test_evaluates_literals(code, expected, context): - assert guarded_eval(code, context()) == expected - - -@pytest.mark.parametrize( - "code,expected", - [ - ["-5", -5], - ["+5", +5], - ["~5", -6], - ], -) -@pytest.mark.parametrize("context", LIMITED_OR_HIGHER) -def test_evaluates_unary_operations(code, expected, context): - assert guarded_eval(code, context()) == expected - - -@pytest.mark.parametrize( - "code,expected", - [ - ["1 + 1", 2], - ["3 - 1", 2], - ["2 * 3", 6], - ["5 // 2", 2], - ["5 / 2", 2.5], - ["5**2", 25], - ["2 >> 1", 1], - ["2 << 1", 4], - ["1 | 2", 3], - ["1 & 1", 1], - ["1 & 2", 0], - ], -) -@pytest.mark.parametrize("context", LIMITED_OR_HIGHER) -def test_evaluates_binary_operations(code, expected, context): - assert guarded_eval(code, context()) == expected - - -@pytest.mark.parametrize( - "code,expected", - [ - ["2 > 1", True], - ["2 < 1", False], - ["2 <= 1", False], - ["2 <= 2", True], - ["1 >= 2", False], - ["2 >= 2", True], - ["2 == 2", True], - ["1 == 2", False], - ["1 != 2", True], - ["1 != 1", False], - ["1 < 4 < 3", False], - ["(1 < 4) < 3", True], - ["4 > 3 > 2 > 1", True], - ["4 > 3 > 2 > 9", False], - ["1 < 2 < 3 < 4", True], - ["9 < 2 < 3 < 4", False], - ["1 < 2 > 1 > 0 > -1 < 1", True], - ["1 in [1] in [[1]]", True], - ["1 in [1] in [[2]]", False], - ["1 in [1]", True], - ["0 in [1]", False], - ["1 not in [1]", False], - ["0 not in [1]", True], - ["True is True", True], - ["False is False", True], - ["True is False", False], - ["True is not True", False], - ["False is not True", True], - ], -) -@pytest.mark.parametrize("context", LIMITED_OR_HIGHER) -def test_evaluates_comparisons(code, expected, context): - assert guarded_eval(code, context()) == expected - - -def test_guards_comparisons(): - class GoodEq(int): - pass - - class BadEq(int): - def __eq__(self, other): - assert False - - context = limited(bad=BadEq(1), good=GoodEq(1)) - - with pytest.raises(GuardRejection): - guarded_eval("bad == 1", context) - - with pytest.raises(GuardRejection): - guarded_eval("bad != 1", context) - - with pytest.raises(GuardRejection): - guarded_eval("1 == bad", context) - - with pytest.raises(GuardRejection): - guarded_eval("1 != bad", context) - - assert guarded_eval("good == 1", context) is True - assert guarded_eval("good != 1", context) is False - assert guarded_eval("1 == good", context) is True - assert guarded_eval("1 != good", context) is False - - -def test_guards_unary_operations(): - class GoodOp(int): - pass - - class BadOpInv(int): - def __inv__(self, other): - assert False - - class BadOpInverse(int): - def __inv__(self, other): - assert False - - context = limited(good=GoodOp(1), bad1=BadOpInv(1), bad2=BadOpInverse(1)) - - with pytest.raises(GuardRejection): - guarded_eval("~bad1", context) - - with pytest.raises(GuardRejection): - guarded_eval("~bad2", context) - - -def test_guards_binary_operations(): - class GoodOp(int): - pass - - class BadOp(int): - def __add__(self, other): - assert False - - context = limited(good=GoodOp(1), bad=BadOp(1)) - - with pytest.raises(GuardRejection): - guarded_eval("1 + bad", context) - - with pytest.raises(GuardRejection): - guarded_eval("bad + 1", context) - - assert guarded_eval("good + 1", context) == 2 - assert guarded_eval("1 + good", context) == 2 - - -def test_guards_attributes(): - class GoodAttr(float): - pass - - class BadAttr1(float): - def __getattr__(self, key): - assert False - - class BadAttr2(float): - def __getattribute__(self, key): - assert False - - context = limited(good=GoodAttr(0.5), bad1=BadAttr1(0.5), bad2=BadAttr2(0.5)) - - with pytest.raises(GuardRejection): - guarded_eval("bad1.as_integer_ratio", context) - - with pytest.raises(GuardRejection): - guarded_eval("bad2.as_integer_ratio", context) - - assert guarded_eval("good.as_integer_ratio()", context) == (1, 2) - - -@pytest.mark.parametrize("context", MINIMAL_OR_HIGHER) -def test_access_builtins(context): - assert guarded_eval("round", context()) == round - - -def test_access_builtins_fails(): - context = limited() - with pytest.raises(NameError): - guarded_eval("this_is_not_builtin", context) - - -def test_rejects_forbidden(): - context = forbidden() - with pytest.raises(GuardRejection): - guarded_eval("1", context) - - -def test_guards_locals_and_globals(): - context = EvaluationContext( - locals={"local_a": "a"}, globals={"global_b": "b"}, evaluation="minimal" - ) - - with pytest.raises(GuardRejection): - guarded_eval("local_a", context) - - with pytest.raises(GuardRejection): - guarded_eval("global_b", context) - - -def test_access_locals_and_globals(): - context = EvaluationContext( - locals={"local_a": "a"}, globals={"global_b": "b"}, evaluation="limited" - ) - assert guarded_eval("local_a", context) == "a" - assert guarded_eval("global_b", context) == "b" - - -@pytest.mark.parametrize( - "code", - ["def func(): pass", "class C: pass", "x = 1", "x += 1", "del x", "import ast"], -) -@pytest.mark.parametrize("context", [minimal(), limited(), unsafe()]) -def test_rejects_side_effect_syntax(code, context): - with pytest.raises(SyntaxError): - guarded_eval(code, context) - - -def test_subscript(): - context = EvaluationContext( - locals={}, globals={}, evaluation="limited", in_subscript=True - ) - empty_slice = slice(None, None, None) - assert guarded_eval("", context) == tuple() - assert guarded_eval(":", context) == empty_slice - assert guarded_eval("1:2:3", context) == slice(1, 2, 3) - assert guarded_eval(':, "a"', context) == (empty_slice, "a") - - -def test_unbind_method(): - class X(list): - def index(self, k): - return "CUSTOM" - - x = X() - assert _unbind_method(x.index) is X.index - assert _unbind_method([].index) is list.index - assert _unbind_method(list.index) is None - - -def test_assumption_instance_attr_do_not_matter(): - """This is semi-specified in Python documentation. - - However, since the specification says 'not guaranteed - to work' rather than 'is forbidden to work', future - versions could invalidate this assumptions. This test - is meant to catch such a change if it ever comes true. - """ - - class T: - def __getitem__(self, k): - return "a" - - def __getattr__(self, k): - return "a" - - def f(self): - return "b" - - t = T() - t.__getitem__ = f - t.__getattr__ = f - assert t[1] == "a" - assert t[1] == "a" - - -def test_assumption_named_tuples_share_getitem(): - """Check assumption on named tuples sharing __getitem__""" - from typing import NamedTuple - - class A(NamedTuple): - pass - - class B(NamedTuple): - pass - - assert A.__getitem__ == B.__getitem__ - - -@dec.skip_without("numpy") -def test_module_access(): - import numpy - - context = limited(numpy=numpy) - assert guarded_eval("numpy.linalg.norm", context) == numpy.linalg.norm - - context = minimal(numpy=numpy) - with pytest.raises(GuardRejection): - guarded_eval("np.linalg.norm", context) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_handlers.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_handlers.py deleted file mode 100644 index 905d9ab..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_handlers.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Tests for input handlers. -""" -#----------------------------------------------------------------------------- -# Module imports -#----------------------------------------------------------------------------- - -# our own packages -from IPython.core import autocall -from IPython.testing import tools as tt -import pytest -from collections.abc import Callable - -#----------------------------------------------------------------------------- -# Globals -#----------------------------------------------------------------------------- - -# Test functions -#----------------------------------------------------------------------------- - -class CallableIndexable(object): - def __getitem__(self, idx): return True - def __call__(self, *args, **kws): return True - - -class Autocallable(autocall.IPyAutocall): - def __call__(self): - return "called" - - -@pytest.mark.parametrize( - "autocall, input, output", - [ - # For many of the below, we're also checking that leading whitespace - # turns off the esc char, which it should unless there is a continuation - # line. - ("1", '"no change"', '"no change"'), # normal - ("1", "lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), # magic - # Only explicit escapes or instances of IPyAutocallable should get - # expanded - ("0", 'len "abc"', 'len "abc"'), - ("0", "autocallable", "autocallable()"), - # Don't add extra brackets (gh-1117) - ("0", "autocallable()", "autocallable()"), - ("1", 'len "abc"', 'len("abc")'), - ("1", 'len "abc";', 'len("abc");'), # ; is special -- moves out of parens - # Autocall is turned off if first arg is [] and the object - # is both callable and indexable. Like so: - ("1", "len [1,2]", "len([1,2])"), # len doesn't support __getitem__... - ("1", "call_idx [1]", "call_idx [1]"), # call_idx *does*.. - ("1", "call_idx 1", "call_idx(1)"), - ("1", "len", "len"), # only at 2 does it auto-call on single args - ("2", 'len "abc"', 'len("abc")'), - ("2", 'len "abc";', 'len("abc");'), - ("2", "len [1,2]", "len([1,2])"), - ("2", "call_idx [1]", "call_idx [1]"), - ("2", "call_idx 1", "call_idx(1)"), - # T his is what's different: - ("2", "len", "len()"), # only at 2 does it auto-call on single args - ("0", "Callable[[int], None]", "Callable[[int], None]"), - ("1", "Callable[[int], None]", "Callable[[int], None]"), - ("1", "Callable[[int], None]", "Callable[[int], None]"), - ], -) -def test_handlers_I(autocall, input, output): - autocallable = Autocallable() - ip.user_ns["autocallable"] = autocallable - - call_idx = CallableIndexable() - ip.user_ns["call_idx"] = call_idx - - ip.user_ns["Callable"] = Callable - - ip.run_line_magic("autocall", autocall) - assert ip.prefilter_manager.prefilter_lines(input) == output - ip.run_line_magic("autocall", "1") diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_history.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_history.py deleted file mode 100644 index fa64fe0..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_history.py +++ /dev/null @@ -1,306 +0,0 @@ -# coding: utf-8 -"""Tests for the IPython tab-completion machinery. -""" -#----------------------------------------------------------------------------- -# Module imports -#----------------------------------------------------------------------------- - -# stdlib -import io -import sys -import tempfile -from datetime import datetime -from pathlib import Path - -from tempfile import TemporaryDirectory -# our own packages -from traitlets.config.loader import Config - -from IPython.core.history import HistoryAccessor, HistoryManager, extract_hist_ranges - - -def test_proper_default_encoding(): - assert sys.getdefaultencoding() == "utf-8" - -def test_history(): - ip = get_ipython() - with TemporaryDirectory() as tmpdir: - tmp_path = Path(tmpdir) - hist_manager_ori = ip.history_manager - hist_file = tmp_path / "history.sqlite" - try: - ip.history_manager = HistoryManager(shell=ip, hist_file=hist_file) - hist = ["a=1", "def f():\n test = 1\n return test", "b='€Æ¾÷ß'"] - for i, h in enumerate(hist, start=1): - ip.history_manager.store_inputs(i, h) - - ip.history_manager.db_log_output = True - # Doesn't match the input, but we'll just check it's stored. - ip.history_manager.output_hist_reprs[3] = "spam" - ip.history_manager.store_output(3) - - assert ip.history_manager.input_hist_raw == [""] + hist - - # Detailed tests for _get_range_session - grs = ip.history_manager._get_range_session - assert list(grs(start=2, stop=-1)) == list(zip([0], [2], hist[1:-1])) - assert list(grs(start=-2)) == list(zip([0, 0], [2, 3], hist[-2:])) - assert list(grs(output=True)) == list( - zip([0, 0, 0], [1, 2, 3], zip(hist, [None, None, "spam"])) - ) - - # Check whether specifying a range beyond the end of the current - # session results in an error (gh-804) - ip.run_line_magic("hist", "2-500") - - # Check that we can write non-ascii characters to a file - ip.run_line_magic("hist", "-f %s" % (tmp_path / "test1")) - ip.run_line_magic("hist", "-pf %s" % (tmp_path / "test2")) - ip.run_line_magic("hist", "-nf %s" % (tmp_path / "test3")) - ip.run_line_magic("save", "%s 1-10" % (tmp_path / "test4")) - - # New session - ip.history_manager.reset() - newcmds = ["z=5", "class X(object):\n pass", "k='p'", "z=5"] - for i, cmd in enumerate(newcmds, start=1): - ip.history_manager.store_inputs(i, cmd) - gothist = ip.history_manager.get_range(start=1, stop=4) - assert list(gothist) == list(zip([0, 0, 0], [1, 2, 3], newcmds)) - # Previous session: - gothist = ip.history_manager.get_range(-1, 1, 4) - assert list(gothist) == list(zip([1, 1, 1], [1, 2, 3], hist)) - - newhist = [(2, i, c) for (i, c) in enumerate(newcmds, 1)] - - # Check get_hist_tail - gothist = ip.history_manager.get_tail(5, output=True, - include_latest=True) - expected = [(1, 3, (hist[-1], "spam"))] \ - + [(s, n, (c, None)) for (s, n, c) in newhist] - assert list(gothist) == expected - - gothist = ip.history_manager.get_tail(2) - expected = newhist[-3:-1] - assert list(gothist) == expected - - # Check get_hist_search - - gothist = ip.history_manager.search("*test*") - assert list(gothist) == [(1, 2, hist[1])] - - gothist = ip.history_manager.search("*=*") - assert list(gothist) == [ - (1, 1, hist[0]), - (1, 2, hist[1]), - (1, 3, hist[2]), - newhist[0], - newhist[2], - newhist[3], - ] - - gothist = ip.history_manager.search("*=*", n=4) - assert list(gothist) == [ - (1, 3, hist[2]), - newhist[0], - newhist[2], - newhist[3], - ] - - gothist = ip.history_manager.search("*=*", unique=True) - assert list(gothist) == [ - (1, 1, hist[0]), - (1, 2, hist[1]), - (1, 3, hist[2]), - newhist[2], - newhist[3], - ] - - gothist = ip.history_manager.search("*=*", unique=True, n=3) - assert list(gothist) == [(1, 3, hist[2]), newhist[2], newhist[3]] - - gothist = ip.history_manager.search("b*", output=True) - assert list(gothist) == [(1, 3, (hist[2], "spam"))] - - # Cross testing: check that magic %save can get previous session. - testfilename = (tmp_path / "test.py").resolve() - ip.run_line_magic("save", str(testfilename) + " ~1/1-3") - with io.open(testfilename, encoding="utf-8") as testfile: - assert testfile.read() == "# coding: utf-8\n" + "\n".join(hist) + "\n" - - # Duplicate line numbers - check that it doesn't crash, and - # gets a new session - ip.history_manager.store_inputs(1, "rogue") - ip.history_manager.writeout_cache() - assert ip.history_manager.session_number == 3 - - # Check that session and line values are not just max values - sessid, lineno, entry = newhist[-1] - assert lineno > 1 - ip.history_manager.reset() - lineno = 1 - ip.history_manager.store_inputs(lineno, entry) - gothist = ip.history_manager.search("*=*", unique=True) - hist = list(gothist)[-1] - assert sessid < hist[0] - assert hist[1:] == (lineno, entry) - finally: - # Ensure saving thread is shut down before we try to clean up the files - ip.history_manager.save_thread.stop() - # Forcibly close database rather than relying on garbage collection - ip.history_manager.db.close() - # Restore history manager - ip.history_manager = hist_manager_ori - - -def test_extract_hist_ranges(): - instr = "1 2/3 ~4/5-6 ~4/7-~4/9 ~9/2-~7/5 ~10/" - expected = [(0, 1, 2), # 0 == current session - (2, 3, 4), - (-4, 5, 7), - (-4, 7, 10), - (-9, 2, None), # None == to end - (-8, 1, None), - (-7, 1, 6), - (-10, 1, None)] - actual = list(extract_hist_ranges(instr)) - assert actual == expected - - -def test_extract_hist_ranges_empty_str(): - instr = "" - expected = [(0, 1, None)] # 0 == current session, None == to end - actual = list(extract_hist_ranges(instr)) - assert actual == expected - - -def test_magic_rerun(): - """Simple test for %rerun (no args -> rerun last line)""" - ip = get_ipython() - ip.run_cell("a = 10", store_history=True) - ip.run_cell("a += 1", store_history=True) - assert ip.user_ns["a"] == 11 - ip.run_cell("%rerun", store_history=True) - assert ip.user_ns["a"] == 12 - -def test_timestamp_type(): - ip = get_ipython() - info = ip.history_manager.get_session_info() - assert isinstance(info[1], datetime) - -def test_hist_file_config(): - cfg = Config() - tfile = tempfile.NamedTemporaryFile(delete=False) - cfg.HistoryManager.hist_file = Path(tfile.name) - try: - hm = HistoryManager(shell=get_ipython(), config=cfg) - assert hm.hist_file == cfg.HistoryManager.hist_file - finally: - try: - Path(tfile.name).unlink() - except OSError: - # same catch as in testing.tools.TempFileMixin - # On Windows, even though we close the file, we still can't - # delete it. I have no clue why - pass - -def test_histmanager_disabled(): - """Ensure that disabling the history manager doesn't create a database.""" - cfg = Config() - cfg.HistoryAccessor.enabled = False - - ip = get_ipython() - with TemporaryDirectory() as tmpdir: - hist_manager_ori = ip.history_manager - hist_file = Path(tmpdir) / "history.sqlite" - cfg.HistoryManager.hist_file = hist_file - try: - ip.history_manager = HistoryManager(shell=ip, config=cfg) - hist = ["a=1", "def f():\n test = 1\n return test", "b='€Æ¾÷ß'"] - for i, h in enumerate(hist, start=1): - ip.history_manager.store_inputs(i, h) - assert ip.history_manager.input_hist_raw == [""] + hist - ip.history_manager.reset() - ip.history_manager.end_session() - finally: - ip.history_manager = hist_manager_ori - - # hist_file should not be created - assert hist_file.exists() is False - - -def test_get_tail_session_awareness(): - """Test .get_tail() is: - - session specific in HistoryManager - - session agnostic in HistoryAccessor - same for .get_last_session_id() - """ - ip = get_ipython() - with TemporaryDirectory() as tmpdir: - tmp_path = Path(tmpdir) - hist_file = tmp_path / "history.sqlite" - get_source = lambda x: x[2] - hm1 = None - hm2 = None - ha = None - try: - # hm1 creates a new session and adds history entries, - # ha catches up - hm1 = HistoryManager(shell=ip, hist_file=hist_file) - hm1_last_sid = hm1.get_last_session_id - ha = HistoryAccessor(hist_file=hist_file) - ha_last_sid = ha.get_last_session_id - - hist1 = ["a=1", "b=1", "c=1"] - for i, h in enumerate(hist1 + [""], start=1): - hm1.store_inputs(i, h) - assert list(map(get_source, hm1.get_tail())) == hist1 - assert list(map(get_source, ha.get_tail())) == hist1 - sid1 = hm1_last_sid() - assert sid1 is not None - assert ha_last_sid() == sid1 - - # hm2 creates a new session and adds entries, - # ha catches up - hm2 = HistoryManager(shell=ip, hist_file=hist_file) - hm2_last_sid = hm2.get_last_session_id - - hist2 = ["a=2", "b=2", "c=2"] - for i, h in enumerate(hist2 + [""], start=1): - hm2.store_inputs(i, h) - tail = hm2.get_tail(n=3) - assert list(map(get_source, tail)) == hist2 - tail = ha.get_tail(n=3) - assert list(map(get_source, tail)) == hist2 - sid2 = hm2_last_sid() - assert sid2 is not None - assert ha_last_sid() == sid2 - assert sid2 != sid1 - - # but hm1 still maintains its point of reference - # and adding more entries to it doesn't change others - # immediate perspective - assert hm1_last_sid() == sid1 - tail = hm1.get_tail(n=3) - assert list(map(get_source, tail)) == hist1 - - hist3 = ["a=3", "b=3", "c=3"] - for i, h in enumerate(hist3 + [""], start=5): - hm1.store_inputs(i, h) - tail = hm1.get_tail(n=7) - assert list(map(get_source, tail)) == hist1 + [""] + hist3 - tail = hm2.get_tail(n=3) - assert list(map(get_source, tail)) == hist2 - tail = ha.get_tail(n=3) - assert list(map(get_source, tail)) == hist2 - assert hm1_last_sid() == sid1 - assert hm2_last_sid() == sid2 - assert ha_last_sid() == sid2 - finally: - if hm1: - hm1.save_thread.stop() - hm1.db.close() - if hm2: - hm2.save_thread.stop() - hm2.db.close() - if ha: - ha.db.close() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_hooks.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_hooks.py deleted file mode 100644 index 6e0b1c1..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_hooks.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -"""Tests for CommandChainDispatcher.""" - - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -import pytest -from IPython.core.error import TryNext -from IPython.core.hooks import CommandChainDispatcher - -#----------------------------------------------------------------------------- -# Local utilities -#----------------------------------------------------------------------------- - -# Define two classes, one which succeeds and one which raises TryNext. Each -# sets the attribute `called` to True when it is called. -class Okay(object): - def __init__(self, message): - self.message = message - self.called = False - def __call__(self): - self.called = True - return self.message - -class Fail(object): - def __init__(self, message): - self.message = message - self.called = False - def __call__(self): - self.called = True - raise TryNext(self.message) - -#----------------------------------------------------------------------------- -# Test functions -#----------------------------------------------------------------------------- - -def test_command_chain_dispatcher_ff(): - """Test two failing hooks""" - fail1 = Fail("fail1") - fail2 = Fail("fail2") - dp = CommandChainDispatcher([(0, fail1), (10, fail2)]) - - with pytest.raises(TryNext) as e: - dp() - assert str(e.value) == "fail2" - - assert fail1.called is True - assert fail2.called is True - -def test_command_chain_dispatcher_fofo(): - """Test a mixture of failing and succeeding hooks.""" - fail1 = Fail("fail1") - fail2 = Fail("fail2") - okay1 = Okay("okay1") - okay2 = Okay("okay2") - - dp = CommandChainDispatcher([(0, fail1), - # (5, okay1), # add this later - (10, fail2), - (15, okay2)]) - dp.add(okay1, 5) - - assert dp() == "okay1" - - assert fail1.called is True - assert okay1.called is True - assert fail2.called is False - assert okay2.called is False - -def test_command_chain_dispatcher_eq_priority(): - okay1 = Okay(u'okay1') - okay2 = Okay(u'okay2') - dp = CommandChainDispatcher([(1, okay1)]) - dp.add(okay2, 1) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_imports.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_imports.py deleted file mode 100644 index 7aa278f..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_imports.py +++ /dev/null @@ -1,52 +0,0 @@ -# encoding: utf-8 - -def test_import_completer(): - from IPython.core import completer - -def test_import_crashhandler(): - from IPython.core import crashhandler - -def test_import_debugger(): - from IPython.core import debugger - -def test_import_excolors(): - from IPython.core import excolors - -def test_import_history(): - from IPython.core import history - -def test_import_hooks(): - from IPython.core import hooks - -def test_import_getipython(): - from IPython.core import getipython - -def test_import_interactiveshell(): - from IPython.core import interactiveshell - -def test_import_logger(): - from IPython.core import logger - -def test_import_macro(): - from IPython.core import macro - -def test_import_magic(): - from IPython.core import magic - -def test_import_oinspect(): - from IPython.core import oinspect - -def test_import_prefilter(): - from IPython.core import prefilter - -def test_import_prompts(): - from IPython.core import prompts - -def test_import_release(): - from IPython.core import release - -def test_import_ultratb(): - from IPython.core import ultratb - -def test_import_usage(): - from IPython.core import usage diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputsplitter.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputsplitter.py deleted file mode 100644 index 61e06df..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputsplitter.py +++ /dev/null @@ -1,643 +0,0 @@ -# -*- coding: utf-8 -*- -"""Tests for the inputsplitter module.""" - - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - -import unittest -import pytest -import sys - -with pytest.warns(DeprecationWarning, match="inputsplitter"): - from IPython.core import inputsplitter as isp -from IPython.core.inputtransformer import InputTransformer -from IPython.core.tests.test_inputtransformer import syntax, syntax_ml -from IPython.testing import tools as tt - -#----------------------------------------------------------------------------- -# Semi-complete examples (also used as tests) -#----------------------------------------------------------------------------- - -# Note: at the bottom, there's a slightly more complete version of this that -# can be useful during development of code here. - -def mini_interactive_loop(input_func): - """Minimal example of the logic of an interactive interpreter loop. - - This serves as an example, and it is used by the test system with a fake - raw_input that simulates interactive input.""" - - from IPython.core.inputsplitter import InputSplitter - - isp = InputSplitter() - # In practice, this input loop would be wrapped in an outside loop to read - # input indefinitely, until some exit/quit command was issued. Here we - # only illustrate the basic inner loop. - while isp.push_accepts_more(): - indent = ' '*isp.get_indent_spaces() - prompt = '>>> ' + indent - line = indent + input_func(prompt) - isp.push(line) - - # Here we just return input so we can use it in a test suite, but a real - # interpreter would instead send it for execution somewhere. - src = isp.source_reset() - # print('Input source was:\n', src) # dbg - return src - -#----------------------------------------------------------------------------- -# Test utilities, just for local use -#----------------------------------------------------------------------------- - - -def pseudo_input(lines): - """Return a function that acts like raw_input but feeds the input list.""" - ilines = iter(lines) - def raw_in(prompt): - try: - return next(ilines) - except StopIteration: - return '' - return raw_in - -#----------------------------------------------------------------------------- -# Tests -#----------------------------------------------------------------------------- -def test_spaces(): - tests = [('', 0), - (' ', 1), - ('\n', 0), - (' \n', 1), - ('x', 0), - (' x', 1), - (' x',2), - (' x',4), - # Note: tabs are counted as a single whitespace! - ('\tx', 1), - ('\t x', 2), - ] - with pytest.warns(PendingDeprecationWarning): - tt.check_pairs(isp.num_ini_spaces, tests) - - -def test_remove_comments(): - tests = [('text', 'text'), - ('text # comment', 'text '), - ('text # comment\n', 'text \n'), - ('text # comment \n', 'text \n'), - ('line # c \nline\n','line \nline\n'), - ('line # c \nline#c2 \nline\nline #c\n\n', - 'line \nline\nline\nline \n\n'), - ] - tt.check_pairs(isp.remove_comments, tests) - - -def test_get_input_encoding(): - encoding = isp.get_input_encoding() - assert isinstance(encoding, str) - # simple-minded check that at least encoding a simple string works with the - # encoding we got. - assert "test".encode(encoding) == b"test" - - -class NoInputEncodingTestCase(unittest.TestCase): - def setUp(self): - self.old_stdin = sys.stdin - class X: pass - fake_stdin = X() - sys.stdin = fake_stdin - - def test(self): - # Verify that if sys.stdin has no 'encoding' attribute we do the right - # thing - enc = isp.get_input_encoding() - self.assertEqual(enc, 'ascii') - - def tearDown(self): - sys.stdin = self.old_stdin - - -class InputSplitterTestCase(unittest.TestCase): - def setUp(self): - self.isp = isp.InputSplitter() - - def test_reset(self): - isp = self.isp - isp.push('x=1') - isp.reset() - self.assertEqual(isp._buffer, []) - self.assertEqual(isp.get_indent_spaces(), 0) - self.assertEqual(isp.source, '') - self.assertEqual(isp.code, None) - self.assertEqual(isp._is_complete, False) - - def test_source(self): - self.isp._store('1') - self.isp._store('2') - self.assertEqual(self.isp.source, '1\n2\n') - self.assertEqual(len(self.isp._buffer)>0, True) - self.assertEqual(self.isp.source_reset(), '1\n2\n') - self.assertEqual(self.isp._buffer, []) - self.assertEqual(self.isp.source, '') - - def test_indent(self): - isp = self.isp # shorthand - isp.push('x=1') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('if 1:\n x=1') - self.assertEqual(isp.get_indent_spaces(), 4) - isp.push('y=2\n') - self.assertEqual(isp.get_indent_spaces(), 0) - - def test_indent2(self): - isp = self.isp - isp.push('if 1:') - self.assertEqual(isp.get_indent_spaces(), 4) - isp.push(' x=1') - self.assertEqual(isp.get_indent_spaces(), 4) - # Blank lines shouldn't change the indent level - isp.push(' '*2) - self.assertEqual(isp.get_indent_spaces(), 4) - - def test_indent3(self): - isp = self.isp - # When a multiline statement contains parens or multiline strings, we - # shouldn't get confused. - isp.push("if 1:") - isp.push(" x = (1+\n 2)") - self.assertEqual(isp.get_indent_spaces(), 4) - - def test_indent4(self): - isp = self.isp - # whitespace after ':' should not screw up indent level - isp.push('if 1: \n x=1') - self.assertEqual(isp.get_indent_spaces(), 4) - isp.push('y=2\n') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('if 1:\t\n x=1') - self.assertEqual(isp.get_indent_spaces(), 4) - isp.push('y=2\n') - self.assertEqual(isp.get_indent_spaces(), 0) - - def test_dedent_pass(self): - isp = self.isp # shorthand - # should NOT cause dedent - isp.push('if 1:\n passes = 5') - self.assertEqual(isp.get_indent_spaces(), 4) - isp.push('if 1:\n pass') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('if 1:\n pass ') - self.assertEqual(isp.get_indent_spaces(), 0) - - def test_dedent_break(self): - isp = self.isp # shorthand - # should NOT cause dedent - isp.push('while 1:\n breaks = 5') - self.assertEqual(isp.get_indent_spaces(), 4) - isp.push('while 1:\n break') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('while 1:\n break ') - self.assertEqual(isp.get_indent_spaces(), 0) - - def test_dedent_continue(self): - isp = self.isp # shorthand - # should NOT cause dedent - isp.push('while 1:\n continues = 5') - self.assertEqual(isp.get_indent_spaces(), 4) - isp.push('while 1:\n continue') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('while 1:\n continue ') - self.assertEqual(isp.get_indent_spaces(), 0) - - def test_dedent_raise(self): - isp = self.isp # shorthand - # should NOT cause dedent - isp.push('if 1:\n raised = 4') - self.assertEqual(isp.get_indent_spaces(), 4) - isp.push('if 1:\n raise TypeError()') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('if 1:\n raise') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('if 1:\n raise ') - self.assertEqual(isp.get_indent_spaces(), 0) - - def test_dedent_return(self): - isp = self.isp # shorthand - # should NOT cause dedent - isp.push('if 1:\n returning = 4') - self.assertEqual(isp.get_indent_spaces(), 4) - isp.push('if 1:\n return 5 + 493') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('if 1:\n return') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('if 1:\n return ') - self.assertEqual(isp.get_indent_spaces(), 0) - isp.push('if 1:\n return(0)') - self.assertEqual(isp.get_indent_spaces(), 0) - - def test_push(self): - isp = self.isp - self.assertEqual(isp.push('x=1'), True) - - def test_push2(self): - isp = self.isp - self.assertEqual(isp.push('if 1:'), False) - for line in [' x=1', '# a comment', ' y=2']: - print(line) - self.assertEqual(isp.push(line), True) - - def test_push3(self): - isp = self.isp - isp.push('if True:') - isp.push(' a = 1') - self.assertEqual(isp.push('b = [1,'), False) - - def test_push_accepts_more(self): - isp = self.isp - isp.push('x=1') - self.assertEqual(isp.push_accepts_more(), False) - - def test_push_accepts_more2(self): - isp = self.isp - isp.push('if 1:') - self.assertEqual(isp.push_accepts_more(), True) - isp.push(' x=1') - self.assertEqual(isp.push_accepts_more(), True) - isp.push('') - self.assertEqual(isp.push_accepts_more(), False) - - def test_push_accepts_more3(self): - isp = self.isp - isp.push("x = (2+\n3)") - self.assertEqual(isp.push_accepts_more(), False) - - def test_push_accepts_more4(self): - isp = self.isp - # When a multiline statement contains parens or multiline strings, we - # shouldn't get confused. - # FIXME: we should be able to better handle de-dents in statements like - # multiline strings and multiline expressions (continued with \ or - # parens). Right now we aren't handling the indentation tracking quite - # correctly with this, though in practice it may not be too much of a - # problem. We'll need to see. - isp.push("if 1:") - isp.push(" x = (2+") - isp.push(" 3)") - self.assertEqual(isp.push_accepts_more(), True) - isp.push(" y = 3") - self.assertEqual(isp.push_accepts_more(), True) - isp.push('') - self.assertEqual(isp.push_accepts_more(), False) - - def test_push_accepts_more5(self): - isp = self.isp - isp.push('try:') - isp.push(' a = 5') - isp.push('except:') - isp.push(' raise') - # We want to be able to add an else: block at this point, so it should - # wait for a blank line. - self.assertEqual(isp.push_accepts_more(), True) - - def test_continuation(self): - isp = self.isp - isp.push("import os, \\") - self.assertEqual(isp.push_accepts_more(), True) - isp.push("sys") - self.assertEqual(isp.push_accepts_more(), False) - - def test_syntax_error(self): - isp = self.isp - # Syntax errors immediately produce a 'ready' block, so the invalid - # Python can be sent to the kernel for evaluation with possible ipython - # special-syntax conversion. - isp.push('run foo') - self.assertEqual(isp.push_accepts_more(), False) - - def test_unicode(self): - self.isp.push(u"Pérez") - self.isp.push(u'\xc3\xa9') - self.isp.push(u"u'\xc3\xa9'") - - @pytest.mark.xfail( - reason="Bug in python 3.9.8 – bpo 45738", - condition=sys.version_info in [(3, 11, 0, "alpha", 2)], - raises=SystemError, - strict=True, - ) - def test_line_continuation(self): - """ Test issue #2108.""" - isp = self.isp - # A blank line after a line continuation should not accept more - isp.push("1 \\\n\n") - self.assertEqual(isp.push_accepts_more(), False) - # Whitespace after a \ is a SyntaxError. The only way to test that - # here is to test that push doesn't accept more (as with - # test_syntax_error() above). - isp.push(r"1 \ ") - self.assertEqual(isp.push_accepts_more(), False) - # Even if the line is continuable (c.f. the regular Python - # interpreter) - isp.push(r"(1 \ ") - self.assertEqual(isp.push_accepts_more(), False) - - def test_check_complete(self): - isp = self.isp - self.assertEqual(isp.check_complete("a = 1"), ('complete', None)) - self.assertEqual(isp.check_complete("for a in range(5):"), ('incomplete', 4)) - self.assertEqual(isp.check_complete("raise = 2"), ('invalid', None)) - self.assertEqual(isp.check_complete("a = [1,\n2,"), ('incomplete', 0)) - self.assertEqual(isp.check_complete("def a():\n x=1\n global x"), ('invalid', None)) - -class InteractiveLoopTestCase(unittest.TestCase): - """Tests for an interactive loop like a python shell. - """ - def check_ns(self, lines, ns): - """Validate that the given input lines produce the resulting namespace. - - Note: the input lines are given exactly as they would be typed in an - auto-indenting environment, as mini_interactive_loop above already does - auto-indenting and prepends spaces to the input. - """ - src = mini_interactive_loop(pseudo_input(lines)) - test_ns = {} - exec(src, test_ns) - # We can't check that the provided ns is identical to the test_ns, - # because Python fills test_ns with extra keys (copyright, etc). But - # we can check that the given dict is *contained* in test_ns - for k,v in ns.items(): - self.assertEqual(test_ns[k], v) - - def test_simple(self): - self.check_ns(['x=1'], dict(x=1)) - - def test_simple2(self): - self.check_ns(['if 1:', 'x=2'], dict(x=2)) - - def test_xy(self): - self.check_ns(['x=1; y=2'], dict(x=1, y=2)) - - def test_abc(self): - self.check_ns(['if 1:','a=1','b=2','c=3'], dict(a=1, b=2, c=3)) - - def test_multi(self): - self.check_ns(['x =(1+','1+','2)'], dict(x=4)) - - -class IPythonInputTestCase(InputSplitterTestCase): - """By just creating a new class whose .isp is a different instance, we - re-run the same test battery on the new input splitter. - - In addition, this runs the tests over the syntax and syntax_ml dicts that - were tested by individual functions, as part of the OO interface. - - It also makes some checks on the raw buffer storage. - """ - - def setUp(self): - self.isp = isp.IPythonInputSplitter() - - def test_syntax(self): - """Call all single-line syntax tests from the main object""" - isp = self.isp - for example in syntax.values(): - for raw, out_t in example: - if raw.startswith(' '): - continue - - isp.push(raw+'\n') - out_raw = isp.source_raw - out = isp.source_reset() - self.assertEqual(out.rstrip(), out_t, - tt.pair_fail_msg.format("inputsplitter",raw, out_t, out)) - self.assertEqual(out_raw.rstrip(), raw.rstrip()) - - def test_syntax_multiline(self): - isp = self.isp - for example in syntax_ml.values(): - for line_pairs in example: - out_t_parts = [] - raw_parts = [] - for lraw, out_t_part in line_pairs: - if out_t_part is not None: - out_t_parts.append(out_t_part) - - if lraw is not None: - isp.push(lraw) - raw_parts.append(lraw) - - out_raw = isp.source_raw - out = isp.source_reset() - out_t = '\n'.join(out_t_parts).rstrip() - raw = '\n'.join(raw_parts).rstrip() - self.assertEqual(out.rstrip(), out_t) - self.assertEqual(out_raw.rstrip(), raw) - - def test_syntax_multiline_cell(self): - isp = self.isp - for example in syntax_ml.values(): - - out_t_parts = [] - for line_pairs in example: - raw = '\n'.join(r for r, _ in line_pairs if r is not None) - out_t = '\n'.join(t for _,t in line_pairs if t is not None) - out = isp.transform_cell(raw) - # Match ignoring trailing whitespace - self.assertEqual(out.rstrip(), out_t.rstrip()) - - def test_cellmagic_preempt(self): - isp = self.isp - for raw, name, line, cell in [ - ("%%cellm a\nIn[1]:", u'cellm', u'a', u'In[1]:'), - ("%%cellm \nline\n>>> hi", u'cellm', u'', u'line\n>>> hi'), - (">>> %%cellm \nline\n>>> hi", u'cellm', u'', u'line\nhi'), - ("%%cellm \n>>> hi", u'cellm', u'', u'>>> hi'), - ("%%cellm \nline1\nline2", u'cellm', u'', u'line1\nline2'), - ("%%cellm \nline1\\\\\nline2", u'cellm', u'', u'line1\\\\\nline2'), - ]: - expected = "get_ipython().run_cell_magic(%r, %r, %r)" % ( - name, line, cell - ) - out = isp.transform_cell(raw) - self.assertEqual(out.rstrip(), expected.rstrip()) - - def test_multiline_passthrough(self): - isp = self.isp - class CommentTransformer(InputTransformer): - def __init__(self): - self._lines = [] - - def push(self, line): - self._lines.append(line + '#') - - def reset(self): - text = '\n'.join(self._lines) - self._lines = [] - return text - - isp.physical_line_transforms.insert(0, CommentTransformer()) - - for raw, expected in [ - ("a=5", "a=5#"), - ("%ls foo", "get_ipython().run_line_magic(%r, %r)" % (u'ls', u'foo#')), - ("!ls foo\n%ls bar", "get_ipython().system(%r)\nget_ipython().run_line_magic(%r, %r)" % ( - u'ls foo#', u'ls', u'bar#' - )), - ("1\n2\n3\n%ls foo\n4\n5", "1#\n2#\n3#\nget_ipython().run_line_magic(%r, %r)\n4#\n5#" % (u'ls', u'foo#')), - ]: - out = isp.transform_cell(raw) - self.assertEqual(out.rstrip(), expected.rstrip()) - -#----------------------------------------------------------------------------- -# Main - use as a script, mostly for developer experiments -#----------------------------------------------------------------------------- - -if __name__ == '__main__': - # A simple demo for interactive experimentation. This code will not get - # picked up by any test suite. - from IPython.core.inputsplitter import IPythonInputSplitter - - # configure here the syntax to use, prompt and whether to autoindent - #isp, start_prompt = InputSplitter(), '>>> ' - isp, start_prompt = IPythonInputSplitter(), 'In> ' - - autoindent = True - #autoindent = False - - try: - while True: - prompt = start_prompt - while isp.push_accepts_more(): - indent = ' '*isp.get_indent_spaces() - if autoindent: - line = indent + input(prompt+indent) - else: - line = input(prompt) - isp.push(line) - prompt = '... ' - - # Here we just return input so we can use it in a test suite, but a - # real interpreter would instead send it for execution somewhere. - #src = isp.source; raise EOFError # dbg - raw = isp.source_raw - src = isp.source_reset() - print('Input source was:\n', src) - print('Raw source was:\n', raw) - except EOFError: - print('Bye') - -# Tests for cell magics support - -def test_last_blank(): - assert isp.last_blank("") is False - assert isp.last_blank("abc") is False - assert isp.last_blank("abc\n") is False - assert isp.last_blank("abc\na") is False - - assert isp.last_blank("\n") is True - assert isp.last_blank("\n ") is True - assert isp.last_blank("abc\n ") is True - assert isp.last_blank("abc\n\n") is True - assert isp.last_blank("abc\nd\n\n") is True - assert isp.last_blank("abc\nd\ne\n\n") is True - assert isp.last_blank("abc \n \n \n\n") is True - - -def test_last_two_blanks(): - assert isp.last_two_blanks("") is False - assert isp.last_two_blanks("abc") is False - assert isp.last_two_blanks("abc\n") is False - assert isp.last_two_blanks("abc\n\na") is False - assert isp.last_two_blanks("abc\n \n") is False - assert isp.last_two_blanks("abc\n\n") is False - - assert isp.last_two_blanks("\n\n") is True - assert isp.last_two_blanks("\n\n ") is True - assert isp.last_two_blanks("\n \n") is True - assert isp.last_two_blanks("abc\n\n ") is True - assert isp.last_two_blanks("abc\n\n\n") is True - assert isp.last_two_blanks("abc\n\n \n") is True - assert isp.last_two_blanks("abc\n\n \n ") is True - assert isp.last_two_blanks("abc\n\n \n \n") is True - assert isp.last_two_blanks("abc\nd\n\n\n") is True - assert isp.last_two_blanks("abc\nd\ne\nf\n\n\n") is True - - -class CellMagicsCommon(object): - - def test_whole_cell(self): - src = "%%cellm line\nbody\n" - out = self.sp.transform_cell(src) - ref = "get_ipython().run_cell_magic('cellm', 'line', 'body')\n" - assert out == ref - - def test_cellmagic_help(self): - self.sp.push('%%cellm?') - assert self.sp.push_accepts_more() is False - - def tearDown(self): - self.sp.reset() - - -class CellModeCellMagics(CellMagicsCommon, unittest.TestCase): - sp = isp.IPythonInputSplitter(line_input_checker=False) - - def test_incremental(self): - sp = self.sp - sp.push("%%cellm firstline\n") - assert sp.push_accepts_more() is True # 1 - sp.push("line2\n") - assert sp.push_accepts_more() is True # 2 - sp.push("\n") - # This should accept a blank line and carry on until the cell is reset - assert sp.push_accepts_more() is True # 3 - - def test_no_strip_coding(self): - src = '\n'.join([ - '%%writefile foo.py', - '# coding: utf-8', - 'print(u"üñîçø∂é")', - ]) - out = self.sp.transform_cell(src) - assert "# coding: utf-8" in out - - -class LineModeCellMagics(CellMagicsCommon, unittest.TestCase): - sp = isp.IPythonInputSplitter(line_input_checker=True) - - def test_incremental(self): - sp = self.sp - sp.push("%%cellm line2\n") - assert sp.push_accepts_more() is True # 1 - sp.push("\n") - # In this case, a blank line should end the cell magic - assert sp.push_accepts_more() is False # 2 - - -indentation_samples = [ - ('a = 1', 0), - ('for a in b:', 4), - ('def f():', 4), - ('def f(): #comment', 4), - ('a = ":#not a comment"', 0), - ('def f():\n a = 1', 4), - ('def f():\n return 1', 0), - ('for a in b:\n' - ' if a < 0:' - ' continue', 3), - ('a = {', 4), - ('a = {\n' - ' 1,', 5), - ('b = """123', 0), - ('', 0), - ('def f():\n pass', 0), - ('class Bar:\n def f():\n pass', 4), - ('class Bar:\n def f():\n raise', 4), -] - -def test_find_next_indent(): - for code, exp in indentation_samples: - res = isp.find_next_indent(code) - msg = "{!r} != {!r} (expected)\n Code: {!r}".format(res, exp, code) - assert res == exp, msg diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer.py deleted file mode 100644 index bfc936d..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer.py +++ /dev/null @@ -1,469 +0,0 @@ -import tokenize - -from IPython.testing import tools as tt - -from IPython.core import inputtransformer as ipt - -def transform_and_reset(transformer): - transformer = transformer() - def transform(inp): - try: - return transformer.push(inp) - finally: - transformer.reset() - - return transform - -# Transformer tests -def transform_checker(tests, transformer, **kwargs): - """Utility to loop over test inputs""" - transformer = transformer(**kwargs) - try: - for inp, tr in tests: - if inp is None: - out = transformer.reset() - else: - out = transformer.push(inp) - assert out == tr - finally: - transformer.reset() - -# Data for all the syntax tests in the form of lists of pairs of -# raw/transformed input. We store it here as a global dict so that we can use -# it both within single-function tests and also to validate the behavior of the -# larger objects - -syntax = \ - dict(assign_system = - [('a =! ls', "a = get_ipython().getoutput('ls')"), - ('b = !ls', "b = get_ipython().getoutput('ls')"), - ('c= !ls', "c = get_ipython().getoutput('ls')"), - ('d == !ls', 'd == !ls'), # Invalid syntax, but we leave == alone. - ('x=1', 'x=1'), # normal input is unmodified - (' ',' '), # blank lines are kept intact - # Tuple unpacking - ("a, b = !echo 'a\\nb'", "a, b = get_ipython().getoutput(\"echo 'a\\\\nb'\")"), - ("a,= !echo 'a'", "a, = get_ipython().getoutput(\"echo 'a'\")"), - ("a, *bc = !echo 'a\\nb\\nc'", "a, *bc = get_ipython().getoutput(\"echo 'a\\\\nb\\\\nc'\")"), - # Tuple unpacking with regular Python expressions, not our syntax. - ("a, b = range(2)", "a, b = range(2)"), - ("a, = range(1)", "a, = range(1)"), - ("a, *bc = range(3)", "a, *bc = range(3)"), - ], - - assign_magic = - [('a =% who', "a = get_ipython().run_line_magic('who', '')"), - ('b = %who', "b = get_ipython().run_line_magic('who', '')"), - ('c= %ls', "c = get_ipython().run_line_magic('ls', '')"), - ('d == %ls', 'd == %ls'), # Invalid syntax, but we leave == alone. - ('x=1', 'x=1'), # normal input is unmodified - (' ',' '), # blank lines are kept intact - ("a, b = %foo", "a, b = get_ipython().run_line_magic('foo', '')"), - ], - classic_prompt=[ - (">>> x=1", "x=1"), - ("x=1", "x=1"), # normal input is unmodified - (" ", " "), # blank lines are kept intact - ], - ipy_prompt=[ - ("In [1]: x=1", "x=1"), - ("x=1", "x=1"), # normal input is unmodified - (" ", " "), # blank lines are kept intact - ], - # Tests for the escape transformer to leave normal code alone - escaped_noesc=[ - (" ", " "), - ("x=1", "x=1"), - ], - # System calls - escaped_shell=[ - ("!ls", "get_ipython().system('ls')"), - # Double-escape shell, this means to capture the output of the - # subprocess and return it - ("!!ls", "get_ipython().getoutput('ls')"), - ], - # Help/object info - escaped_help=[ - ("?", "get_ipython().show_usage()"), - ("?x1", "get_ipython().run_line_magic('pinfo', 'x1')"), - ("??x2", "get_ipython().run_line_magic('pinfo2', 'x2')"), - ("?a.*s", "get_ipython().run_line_magic('psearch', 'a.*s')"), - ("?%hist1", "get_ipython().run_line_magic('pinfo', '%hist1')"), - ("?%%hist2", "get_ipython().run_line_magic('pinfo', '%%hist2')"), - ("?abc = qwe", "get_ipython().run_line_magic('pinfo', 'abc')"), - ], - end_help=[ - ("x3?", "get_ipython().run_line_magic('pinfo', 'x3')"), - ("x4??", "get_ipython().run_line_magic('pinfo2', 'x4')"), - ("%hist1?", "get_ipython().run_line_magic('pinfo', '%hist1')"), - ("%hist2??", "get_ipython().run_line_magic('pinfo2', '%hist2')"), - ("%%hist3?", "get_ipython().run_line_magic('pinfo', '%%hist3')"), - ("%%hist4??", "get_ipython().run_line_magic('pinfo2', '%%hist4')"), - ("π.foo?", "get_ipython().run_line_magic('pinfo', 'π.foo')"), - ("f*?", "get_ipython().run_line_magic('psearch', 'f*')"), - ("ax.*aspe*?", "get_ipython().run_line_magic('psearch', 'ax.*aspe*')"), - ("a = abc?", "get_ipython().run_line_magic('pinfo', 'abc')"), - ("a = abc.qe??", "get_ipython().run_line_magic('pinfo2', 'abc.qe')"), - ("a = *.items?", "get_ipython().run_line_magic('psearch', '*.items')"), - ("plot(a?", "get_ipython().run_line_magic('pinfo', 'a')"), - ("a*2 #comment?", "a*2 #comment?"), - ], - # Explicit magic calls - escaped_magic=[ - ("%cd", "get_ipython().run_line_magic('cd', '')"), - ("%cd /home", "get_ipython().run_line_magic('cd', '/home')"), - # Backslashes need to be escaped. - ("%cd C:\\User", "get_ipython().run_line_magic('cd', 'C:\\\\User')"), - (" %magic", " get_ipython().run_line_magic('magic', '')"), - ], - # Quoting with separate arguments - escaped_quote=[ - (",f", 'f("")'), - (",f x", 'f("x")'), - (" ,f y", ' f("y")'), - (",f a b", 'f("a", "b")'), - ], - # Quoting with single argument - escaped_quote2=[ - (";f", 'f("")'), - (";f x", 'f("x")'), - (" ;f y", ' f("y")'), - (";f a b", 'f("a b")'), - ], - # Simply apply parens - escaped_paren=[ - ("/f", "f()"), - ("/f x", "f(x)"), - (" /f y", " f(y)"), - ("/f a b", "f(a, b)"), - ], - # Check that we transform prompts before other transforms - mixed=[ - ("In [1]: %lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), - (">>> %lsmagic", "get_ipython().run_line_magic('lsmagic', '')"), - ("In [2]: !ls", "get_ipython().system('ls')"), - ("In [3]: abs?", "get_ipython().run_line_magic('pinfo', 'abs')"), - ("In [4]: b = %who", "b = get_ipython().run_line_magic('who', '')"), - ], -) - -# multiline syntax examples. Each of these should be a list of lists, with -# each entry itself having pairs of raw/transformed input. The union (with -# '\n'.join() of the transformed inputs is what the splitter should produce -# when fed the raw lines one at a time via push. -syntax_ml = \ - dict(classic_prompt = - [ [('>>> for i in range(10):','for i in range(10):'), - ('... print i',' print i'), - ('... ', ''), - ], - [('>>> a="""','a="""'), - ('... 123"""','123"""'), - ], - [('a="""','a="""'), - ('... 123','123'), - ('... 456"""','456"""'), - ], - [('a="""','a="""'), - ('>>> 123','123'), - ('... 456"""','456"""'), - ], - [('a="""','a="""'), - ('123','123'), - ('... 456"""','... 456"""'), - ], - [('....__class__','....__class__'), - ], - [('a=5', 'a=5'), - ('...', ''), - ], - [('>>> def f(x):', 'def f(x):'), - ('...', ''), - ('... return x', ' return x'), - ], - [('board = """....', 'board = """....'), - ('....', '....'), - ('...."""', '...."""'), - ], - ], - - ipy_prompt = - [ [('In [24]: for i in range(10):','for i in range(10):'), - (' ....: print i',' print i'), - (' ....: ', ''), - ], - [('In [24]: for i in range(10):','for i in range(10):'), - # Qt console prompts expand with spaces, not dots - (' ...: print i',' print i'), - (' ...: ', ''), - ], - [('In [24]: for i in range(10):','for i in range(10):'), - # Sometimes whitespace preceding '...' has been removed - ('...: print i',' print i'), - ('...: ', ''), - ], - [('In [24]: for i in range(10):','for i in range(10):'), - # Space after last continuation prompt has been removed (issue #6674) - ('...: print i',' print i'), - ('...:', ''), - ], - [('In [2]: a="""','a="""'), - (' ...: 123"""','123"""'), - ], - [('a="""','a="""'), - (' ...: 123','123'), - (' ...: 456"""','456"""'), - ], - [('a="""','a="""'), - ('In [1]: 123','123'), - (' ...: 456"""','456"""'), - ], - [('a="""','a="""'), - ('123','123'), - (' ...: 456"""',' ...: 456"""'), - ], - ], - - multiline_datastructure_prompt = - [ [('>>> a = [1,','a = [1,'), - ('... 2]','2]'), - ], - ], - - multiline_datastructure = - [ [('b = ("%s"', None), - ('# comment', None), - ('%foo )', 'b = ("%s"\n# comment\n%foo )'), - ], - ], - - multiline_string = - [ [("'''foo?", None), - ("bar'''", "'''foo?\nbar'''"), - ], - ], - - leading_indent = - [ [(' print "hi"','print "hi"'), - ], - [(' for a in range(5):','for a in range(5):'), - (' a*2',' a*2'), - ], - [(' a="""','a="""'), - (' 123"""','123"""'), - ], - [('a="""','a="""'), - (' 123"""',' 123"""'), - ], - ], - - cellmagic = - [ [('%%foo a', None), - (None, "get_ipython().run_cell_magic('foo', 'a', '')"), - ], - [('%%bar 123', None), - ('hello', None), - (None , "get_ipython().run_cell_magic('bar', '123', 'hello')"), - ], - [('a=5', 'a=5'), - ('%%cellmagic', '%%cellmagic'), - ], - ], - - escaped = - [ [('%abc def \\', None), - ('ghi', "get_ipython().run_line_magic('abc', 'def ghi')"), - ], - [('%abc def \\', None), - ('ghi\\', None), - (None, "get_ipython().run_line_magic('abc', 'def ghi')"), - ], - ], - - assign_magic = - [ [('a = %bc de \\', None), - ('fg', "a = get_ipython().run_line_magic('bc', 'de fg')"), - ], - [('a = %bc de \\', None), - ('fg\\', None), - (None, "a = get_ipython().run_line_magic('bc', 'de fg')"), - ], - ], - - assign_system = - [ [('a = !bc de \\', None), - ('fg', "a = get_ipython().getoutput('bc de fg')"), - ], - [('a = !bc de \\', None), - ('fg\\', None), - (None, "a = get_ipython().getoutput('bc de fg')"), - ], - ], - ) - - -def test_assign_system(): - tt.check_pairs(transform_and_reset(ipt.assign_from_system), syntax['assign_system']) - -def test_assign_magic(): - tt.check_pairs(transform_and_reset(ipt.assign_from_magic), syntax['assign_magic']) - -def test_classic_prompt(): - tt.check_pairs(transform_and_reset(ipt.classic_prompt), syntax['classic_prompt']) - for example in syntax_ml['classic_prompt']: - transform_checker(example, ipt.classic_prompt) - for example in syntax_ml['multiline_datastructure_prompt']: - transform_checker(example, ipt.classic_prompt) - - # Check that we don't transform the second line if the first is obviously - # IPython syntax - transform_checker([ - ('%foo', '%foo'), - ('>>> bar', '>>> bar'), - ], ipt.classic_prompt) - - -def test_ipy_prompt(): - tt.check_pairs(transform_and_reset(ipt.ipy_prompt), syntax['ipy_prompt']) - for example in syntax_ml['ipy_prompt']: - transform_checker(example, ipt.ipy_prompt) - - # Check that we don't transform the second line if we're inside a cell magic - transform_checker([ - ('%%foo', '%%foo'), - ('In [1]: bar', 'In [1]: bar'), - ], ipt.ipy_prompt) - -def test_assemble_logical_lines(): - tests = \ - [ [("a = \\", None), - ("123", "a = 123"), - ], - [("a = \\", None), # Test resetting when within a multi-line string - ("12 *\\", None), - (None, "a = 12 *"), - ], - [("# foo\\", "# foo\\"), # Comments can't be continued like this - ], - ] - for example in tests: - transform_checker(example, ipt.assemble_logical_lines) - -def test_assemble_python_lines(): - tests = \ - [ [("a = '''", None), - ("abc'''", "a = '''\nabc'''"), - ], - [("a = '''", None), # Test resetting when within a multi-line string - ("def", None), - (None, "a = '''\ndef"), - ], - [("a = [1,", None), - ("2]", "a = [1,\n2]"), - ], - [("a = [1,", None), # Test resetting when within a multi-line string - ("2,", None), - (None, "a = [1,\n2,"), - ], - [("a = '''", None), # Test line continuation within a multi-line string - ("abc\\", None), - ("def", None), - ("'''", "a = '''\nabc\\\ndef\n'''"), - ], - ] + syntax_ml['multiline_datastructure'] - for example in tests: - transform_checker(example, ipt.assemble_python_lines) - - -def test_help_end(): - tt.check_pairs(transform_and_reset(ipt.help_end), syntax['end_help']) - -def test_escaped_noesc(): - tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_noesc']) - - -def test_escaped_shell(): - tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_shell']) - - -def test_escaped_help(): - tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_help']) - - -def test_escaped_magic(): - tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_magic']) - - -def test_escaped_quote(): - tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_quote']) - - -def test_escaped_quote2(): - tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_quote2']) - - -def test_escaped_paren(): - tt.check_pairs(transform_and_reset(ipt.escaped_commands), syntax['escaped_paren']) - - -def test_cellmagic(): - for example in syntax_ml['cellmagic']: - transform_checker(example, ipt.cellmagic) - - line_example = [('%%bar 123', None), - ('hello', None), - ('' , "get_ipython().run_cell_magic('bar', '123', 'hello')"), - ] - transform_checker(line_example, ipt.cellmagic, end_on_blank_line=True) - -def test_has_comment(): - tests = [('text', False), - ('text #comment', True), - ('text #comment\n', True), - ('#comment', True), - ('#comment\n', True), - ('a = "#string"', False), - ('a = "#string" # comment', True), - ('a #comment not "string"', True), - ] - tt.check_pairs(ipt.has_comment, tests) - -@ipt.TokenInputTransformer.wrap -def decistmt(tokens): - """Substitute Decimals for floats in a string of statements. - - Based on an example from the tokenize module docs. - """ - result = [] - for toknum, tokval, _, _, _ in tokens: - if toknum == tokenize.NUMBER and '.' in tokval: # replace NUMBER tokens - yield from [ - (tokenize.NAME, 'Decimal'), - (tokenize.OP, '('), - (tokenize.STRING, repr(tokval)), - (tokenize.OP, ')') - ] - else: - yield (toknum, tokval) - - - -def test_token_input_transformer(): - tests = [('1.2', "Decimal ('1.2')"), - ('"1.2"', '"1.2"'), - ] - tt.check_pairs(transform_and_reset(decistmt), tests) - ml_tests = \ - [ [("a = 1.2; b = '''x", None), - ("y'''", "a =Decimal ('1.2');b ='''x\ny'''"), - ], - [("a = [1.2,", None), - ("3]", "a =[Decimal ('1.2'),\n3 ]"), - ], - [("a = '''foo", None), # Test resetting when within a multi-line string - ("bar", None), - (None, "a = '''foo\nbar"), - ], - ] - for example in ml_tests: - transform_checker(example, decistmt) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2.py deleted file mode 100644 index 0f563b7..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2.py +++ /dev/null @@ -1,448 +0,0 @@ -"""Tests for the token-based transformers in IPython.core.inputtransformer2 - -Line-based transformers are the simpler ones; token-based transformers are -more complex. See test_inputtransformer2_line for tests for line-based -transformations. -""" - -import platform -import string -import sys -from textwrap import dedent - -import pytest - -from IPython.core import inputtransformer2 as ipt2 -from IPython.core.inputtransformer2 import _find_assign_op, make_tokens_by_line - -MULTILINE_MAGIC = ( - """\ -a = f() -%foo \\ -bar -g() -""".splitlines( - keepends=True - ), - (2, 0), - """\ -a = f() -get_ipython().run_line_magic('foo', ' bar') -g() -""".splitlines( - keepends=True - ), -) - -INDENTED_MAGIC = ( - """\ -for a in range(5): - %ls -""".splitlines( - keepends=True - ), - (2, 4), - """\ -for a in range(5): - get_ipython().run_line_magic('ls', '') -""".splitlines( - keepends=True - ), -) - -CRLF_MAGIC = ( - ["a = f()\n", "%ls\r\n", "g()\n"], - (2, 0), - ["a = f()\n", "get_ipython().run_line_magic('ls', '')\n", "g()\n"], -) - -MULTILINE_MAGIC_ASSIGN = ( - """\ -a = f() -b = %foo \\ - bar -g() -""".splitlines( - keepends=True - ), - (2, 4), - """\ -a = f() -b = get_ipython().run_line_magic('foo', ' bar') -g() -""".splitlines( - keepends=True - ), -) - -MULTILINE_SYSTEM_ASSIGN = ("""\ -a = f() -b = !foo \\ - bar -g() -""".splitlines(keepends=True), (2, 4), """\ -a = f() -b = get_ipython().getoutput('foo bar') -g() -""".splitlines(keepends=True)) - -##### - -MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT = ( - """\ -def test(): - for i in range(1): - print(i) - res =! ls -""".splitlines( - keepends=True - ), - (4, 7), - """\ -def test(): - for i in range(1): - print(i) - res =get_ipython().getoutput(\' ls\') -""".splitlines( - keepends=True - ), -) - -###### - -AUTOCALL_QUOTE = ([",f 1 2 3\n"], (1, 0), ['f("1", "2", "3")\n']) - -AUTOCALL_QUOTE2 = ([";f 1 2 3\n"], (1, 0), ['f("1 2 3")\n']) - -AUTOCALL_PAREN = (["/f 1 2 3\n"], (1, 0), ["f(1, 2, 3)\n"]) - -SIMPLE_HELP = (["foo?\n"], (1, 0), ["get_ipython().run_line_magic('pinfo', 'foo')\n"]) - -DETAILED_HELP = ( - ["foo??\n"], - (1, 0), - ["get_ipython().run_line_magic('pinfo2', 'foo')\n"], -) - -MAGIC_HELP = (["%foo?\n"], (1, 0), ["get_ipython().run_line_magic('pinfo', '%foo')\n"]) - -HELP_IN_EXPR = ( - ["a = b + c?\n"], - (1, 0), - ["get_ipython().run_line_magic('pinfo', 'c')\n"], -) - -HELP_CONTINUED_LINE = ( - """\ -a = \\ -zip? -""".splitlines( - keepends=True - ), - (1, 0), - [r"get_ipython().run_line_magic('pinfo', 'zip')" + "\n"], -) - -HELP_MULTILINE = ( - """\ -(a, -b) = zip? -""".splitlines( - keepends=True - ), - (1, 0), - [r"get_ipython().run_line_magic('pinfo', 'zip')" + "\n"], -) - -HELP_UNICODE = ( - ["π.foo?\n"], - (1, 0), - ["get_ipython().run_line_magic('pinfo', 'π.foo')\n"], -) - - -def null_cleanup_transformer(lines): - """ - A cleanup transform that returns an empty list. - """ - return [] - - -def test_check_make_token_by_line_never_ends_empty(): - """ - Check that not sequence of single or double characters ends up leading to en empty list of tokens - """ - from string import printable - - for c in printable: - assert make_tokens_by_line(c)[-1] != [] - for k in printable: - assert make_tokens_by_line(c + k)[-1] != [] - - -def check_find(transformer, case, match=True): - sample, expected_start, _ = case - tbl = make_tokens_by_line(sample) - res = transformer.find(tbl) - if match: - # start_line is stored 0-indexed, expected values are 1-indexed - assert (res.start_line + 1, res.start_col) == expected_start - return res - else: - assert res is None - - -def check_transform(transformer_cls, case): - lines, start, expected = case - transformer = transformer_cls(start) - assert transformer.transform(lines) == expected - - -def test_continued_line(): - lines = MULTILINE_MAGIC_ASSIGN[0] - assert ipt2.find_end_of_continued_line(lines, 1) == 2 - - assert ipt2.assemble_continued_line(lines, (1, 5), 2) == "foo bar" - - -def test_find_assign_magic(): - check_find(ipt2.MagicAssign, MULTILINE_MAGIC_ASSIGN) - check_find(ipt2.MagicAssign, MULTILINE_SYSTEM_ASSIGN, match=False) - check_find(ipt2.MagicAssign, MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT, match=False) - - -def test_transform_assign_magic(): - check_transform(ipt2.MagicAssign, MULTILINE_MAGIC_ASSIGN) - - -def test_find_assign_system(): - check_find(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN) - check_find(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT) - check_find(ipt2.SystemAssign, (["a = !ls\n"], (1, 5), None)) - check_find(ipt2.SystemAssign, (["a=!ls\n"], (1, 2), None)) - check_find(ipt2.SystemAssign, MULTILINE_MAGIC_ASSIGN, match=False) - - -def test_transform_assign_system(): - check_transform(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN) - check_transform(ipt2.SystemAssign, MULTILINE_SYSTEM_ASSIGN_AFTER_DEDENT) - - -def test_find_magic_escape(): - check_find(ipt2.EscapedCommand, MULTILINE_MAGIC) - check_find(ipt2.EscapedCommand, INDENTED_MAGIC) - check_find(ipt2.EscapedCommand, MULTILINE_MAGIC_ASSIGN, match=False) - - -def test_transform_magic_escape(): - check_transform(ipt2.EscapedCommand, MULTILINE_MAGIC) - check_transform(ipt2.EscapedCommand, INDENTED_MAGIC) - check_transform(ipt2.EscapedCommand, CRLF_MAGIC) - - -def test_find_autocalls(): - for case in [AUTOCALL_QUOTE, AUTOCALL_QUOTE2, AUTOCALL_PAREN]: - print("Testing %r" % case[0]) - check_find(ipt2.EscapedCommand, case) - - -def test_transform_autocall(): - for case in [AUTOCALL_QUOTE, AUTOCALL_QUOTE2, AUTOCALL_PAREN]: - print("Testing %r" % case[0]) - check_transform(ipt2.EscapedCommand, case) - - -def test_find_help(): - for case in [SIMPLE_HELP, DETAILED_HELP, MAGIC_HELP, HELP_IN_EXPR]: - check_find(ipt2.HelpEnd, case) - - tf = check_find(ipt2.HelpEnd, HELP_CONTINUED_LINE) - assert tf.q_line == 1 - assert tf.q_col == 3 - - tf = check_find(ipt2.HelpEnd, HELP_MULTILINE) - assert tf.q_line == 1 - assert tf.q_col == 8 - - # ? in a comment does not trigger help - check_find(ipt2.HelpEnd, (["foo # bar?\n"], None, None), match=False) - # Nor in a string - check_find(ipt2.HelpEnd, (["foo = '''bar?\n"], None, None), match=False) - - -def test_transform_help(): - tf = ipt2.HelpEnd((1, 0), (1, 9)) - assert tf.transform(HELP_IN_EXPR[0]) == HELP_IN_EXPR[2] - - tf = ipt2.HelpEnd((1, 0), (2, 3)) - assert tf.transform(HELP_CONTINUED_LINE[0]) == HELP_CONTINUED_LINE[2] - - tf = ipt2.HelpEnd((1, 0), (2, 8)) - assert tf.transform(HELP_MULTILINE[0]) == HELP_MULTILINE[2] - - tf = ipt2.HelpEnd((1, 0), (1, 0)) - assert tf.transform(HELP_UNICODE[0]) == HELP_UNICODE[2] - - -def test_find_assign_op_dedent(): - """ - be careful that empty token like dedent are not counted as parens - """ - - class Tk: - def __init__(self, s): - self.string = s - - assert _find_assign_op([Tk(s) for s in ("", "a", "=", "b")]) == 2 - assert ( - _find_assign_op([Tk(s) for s in ("", "(", "a", "=", "b", ")", "=", "5")]) == 6 - ) - - -extra_closing_paren_param = ( - pytest.param("(\n))", "invalid", None) - if sys.version_info >= (3, 12) - else pytest.param("(\n))", "incomplete", 0) -) -examples = [ - pytest.param("a = 1", "complete", None), - pytest.param("for a in range(5):", "incomplete", 4), - pytest.param("for a in range(5):\n if a > 0:", "incomplete", 8), - pytest.param("raise = 2", "invalid", None), - pytest.param("a = [1,\n2,", "incomplete", 0), - extra_closing_paren_param, - pytest.param("\\\r\n", "incomplete", 0), - pytest.param("a = '''\n hi", "incomplete", 3), - pytest.param("def a():\n x=1\n global x", "invalid", None), - pytest.param( - "a \\ ", - "invalid", - None, - marks=pytest.mark.xfail( - reason="Bug in python 3.9.8 – bpo 45738", - condition=sys.version_info in [(3, 11, 0, "alpha", 2)], - raises=SystemError, - strict=True, - ), - ), # Nothing allowed after backslash, - pytest.param("1\\\n+2", "complete", None), -] - - -@pytest.mark.parametrize("code, expected, number", examples) -def test_check_complete_param(code, expected, number): - cc = ipt2.TransformerManager().check_complete - assert cc(code) == (expected, number) - - -@pytest.mark.xfail(platform.python_implementation() == "PyPy", reason="fail on pypy") -@pytest.mark.xfail( - reason="Bug in python 3.9.8 – bpo 45738", - condition=sys.version_info in [(3, 11, 0, "alpha", 2)], - raises=SystemError, - strict=True, -) -def test_check_complete(): - cc = ipt2.TransformerManager().check_complete - - example = dedent( - """ - if True: - a=1""" - ) - - assert cc(example) == ("incomplete", 4) - assert cc(example + "\n") == ("complete", None) - assert cc(example + "\n ") == ("complete", None) - - # no need to loop on all the letters/numbers. - short = "12abAB" + string.printable[62:] - for c in short: - # test does not raise: - cc(c) - for k in short: - cc(c + k) - - assert cc("def f():\n x=0\n \\\n ") == ("incomplete", 2) - - -@pytest.mark.xfail(platform.python_implementation() == "PyPy", reason="fail on pypy") -@pytest.mark.parametrize( - "value, expected", - [ - ('''def foo():\n """''', ("incomplete", 4)), - ("""async with example:\n pass""", ("incomplete", 4)), - ("""async with example:\n pass\n """, ("complete", None)), - ], -) -def test_check_complete_II(value, expected): - """ - Test that multiple line strings are properly handled. - - Separate test function for convenience - - """ - cc = ipt2.TransformerManager().check_complete - assert cc(value) == expected - - -@pytest.mark.parametrize( - "value, expected", - [ - (")", ("invalid", None)), - ("]", ("invalid", None)), - ("}", ("invalid", None)), - (")(", ("invalid", None)), - ("][", ("invalid", None)), - ("}{", ("invalid", None)), - ("]()(", ("invalid", None)), - ("())(", ("invalid", None)), - (")[](", ("invalid", None)), - ("()](", ("invalid", None)), - ], -) -def test_check_complete_invalidates_sunken_brackets(value, expected): - """ - Test that a single line with more closing brackets than the opening ones is - interpreted as invalid - """ - cc = ipt2.TransformerManager().check_complete - assert cc(value) == expected - - -def test_null_cleanup_transformer(): - manager = ipt2.TransformerManager() - manager.cleanup_transforms.insert(0, null_cleanup_transformer) - assert manager.transform_cell("") == "" - - -def test_side_effects_I(): - count = 0 - - def counter(lines): - nonlocal count - count += 1 - return lines - - counter.has_side_effects = True - - manager = ipt2.TransformerManager() - manager.cleanup_transforms.insert(0, counter) - assert manager.check_complete("a=1\n") == ("complete", None) - assert count == 0 - - -def test_side_effects_II(): - count = 0 - - def counter(lines): - nonlocal count - count += 1 - return lines - - counter.has_side_effects = True - - manager = ipt2.TransformerManager() - manager.line_transforms.insert(0, counter) - assert manager.check_complete("b=1\n") == ("complete", None) - assert count == 0 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2_line.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2_line.py deleted file mode 100644 index ec7a873..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_inputtransformer2_line.py +++ /dev/null @@ -1,167 +0,0 @@ -"""Tests for the line-based transformers in IPython.core.inputtransformer2 - -Line-based transformers are the simpler ones; token-based transformers are -more complex. See test_inputtransformer2 for tests for token-based transformers. -""" - -from IPython.core import inputtransformer2 as ipt2 - -CELL_MAGIC = ("""\ -%%foo arg -body 1 -body 2 -""", """\ -get_ipython().run_cell_magic('foo', 'arg', 'body 1\\nbody 2\\n') -""") - -def test_cell_magic(): - for sample, expected in [CELL_MAGIC]: - assert ipt2.cell_magic(sample.splitlines(keepends=True)) == expected.splitlines( - keepends=True - ) - -CLASSIC_PROMPT = ("""\ ->>> for a in range(5): -... print(a) -""", """\ -for a in range(5): - print(a) -""") - -CLASSIC_PROMPT_L2 = ("""\ -for a in range(5): -... print(a) -... print(a ** 2) -""", """\ -for a in range(5): - print(a) - print(a ** 2) -""") - -def test_classic_prompt(): - for sample, expected in [CLASSIC_PROMPT, CLASSIC_PROMPT_L2]: - assert ipt2.classic_prompt( - sample.splitlines(keepends=True) - ) == expected.splitlines(keepends=True) - -IPYTHON_PROMPT = ("""\ -In [1]: for a in range(5): - ...: print(a) -""", """\ -for a in range(5): - print(a) -""") - -IPYTHON_PROMPT_L2 = ("""\ -for a in range(5): - ...: print(a) - ...: print(a ** 2) -""", """\ -for a in range(5): - print(a) - print(a ** 2) -""") - - -IPYTHON_PROMPT_VI_INS = ( - """\ -[ins] In [11]: def a(): - ...: 123 - ...: - ...: 123 -""", - """\ -def a(): - 123 - -123 -""", -) - -IPYTHON_PROMPT_VI_NAV = ( - """\ -[nav] In [11]: def a(): - ...: 123 - ...: - ...: 123 -""", - """\ -def a(): - 123 - -123 -""", -) - - -def test_ipython_prompt(): - for sample, expected in [ - IPYTHON_PROMPT, - IPYTHON_PROMPT_L2, - IPYTHON_PROMPT_VI_INS, - IPYTHON_PROMPT_VI_NAV, - ]: - assert ipt2.ipython_prompt( - sample.splitlines(keepends=True) - ) == expected.splitlines(keepends=True) - - -INDENT_SPACES = ("""\ - if True: - a = 3 -""", """\ -if True: - a = 3 -""") - -INDENT_TABS = ("""\ -\tif True: -\t\tb = 4 -""", """\ -if True: -\tb = 4 -""") - -def test_leading_indent(): - for sample, expected in [INDENT_SPACES, INDENT_TABS]: - assert ipt2.leading_indent( - sample.splitlines(keepends=True) - ) == expected.splitlines(keepends=True) - -LEADING_EMPTY_LINES = ("""\ - \t - -if True: - a = 3 - -b = 4 -""", """\ -if True: - a = 3 - -b = 4 -""") - -ONLY_EMPTY_LINES = ("""\ - \t - -""", """\ - \t - -""") - -def test_leading_empty_lines(): - for sample, expected in [LEADING_EMPTY_LINES, ONLY_EMPTY_LINES]: - assert ipt2.leading_empty_lines( - sample.splitlines(keepends=True) - ) == expected.splitlines(keepends=True) - -CRLF_MAGIC = ([ - "%%ls\r\n" -], [ - "get_ipython().run_cell_magic('ls', '', '')\n" -]) - -def test_crlf_magic(): - for sample, expected in [CRLF_MAGIC]: - assert ipt2.cell_magic(sample) == expected diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_interactiveshell.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_interactiveshell.py deleted file mode 100644 index f87d96f..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_interactiveshell.py +++ /dev/null @@ -1,1221 +0,0 @@ -# -*- coding: utf-8 -*- -"""Tests for the key interactiveshell module. - -Historically the main classes in interactiveshell have been under-tested. This -module should grow as many single-method tests as possible to trap many of the -recurring bugs we seem to encounter with high-level interaction. -""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - -import asyncio -import ast -import os -import signal -import shutil -import sys -import tempfile -import unittest -import pytest -from unittest import mock - -from os.path import join - -from IPython.core.error import InputRejected -from IPython.core.inputtransformer import InputTransformer -from IPython.core import interactiveshell -from IPython.core.oinspect import OInfo -from IPython.testing.decorators import ( - skipif, - skip_win32, - onlyif_unicode_paths, - onlyif_cmds_exist, - skip_if_not_osx, -) -from IPython.testing import tools as tt -from IPython.utils.process import find_cmd - -#----------------------------------------------------------------------------- -# Globals -#----------------------------------------------------------------------------- -# This is used by every single test, no point repeating it ad nauseam - -#----------------------------------------------------------------------------- -# Tests -#----------------------------------------------------------------------------- - -class DerivedInterrupt(KeyboardInterrupt): - pass - -class InteractiveShellTestCase(unittest.TestCase): - def test_naked_string_cells(self): - """Test that cells with only naked strings are fully executed""" - # First, single-line inputs - ip.run_cell('"a"\n') - self.assertEqual(ip.user_ns['_'], 'a') - # And also multi-line cells - ip.run_cell('"""a\nb"""\n') - self.assertEqual(ip.user_ns['_'], 'a\nb') - - def test_run_empty_cell(self): - """Just make sure we don't get a horrible error with a blank - cell of input. Yes, I did overlook that.""" - old_xc = ip.execution_count - res = ip.run_cell('') - self.assertEqual(ip.execution_count, old_xc) - self.assertEqual(res.execution_count, None) - - def test_run_cell_multiline(self): - """Multi-block, multi-line cells must execute correctly. - """ - src = '\n'.join(["x=1", - "y=2", - "if 1:", - " x += 1", - " y += 1",]) - res = ip.run_cell(src) - self.assertEqual(ip.user_ns['x'], 2) - self.assertEqual(ip.user_ns['y'], 3) - self.assertEqual(res.success, True) - self.assertEqual(res.result, None) - - def test_multiline_string_cells(self): - "Code sprinkled with multiline strings should execute (GH-306)" - ip.run_cell('tmp=0') - self.assertEqual(ip.user_ns['tmp'], 0) - res = ip.run_cell('tmp=1;"""a\nb"""\n') - self.assertEqual(ip.user_ns['tmp'], 1) - self.assertEqual(res.success, True) - self.assertEqual(res.result, "a\nb") - - def test_dont_cache_with_semicolon(self): - "Ending a line with semicolon should not cache the returned object (GH-307)" - oldlen = len(ip.user_ns['Out']) - for cell in ['1;', '1;1;']: - res = ip.run_cell(cell, store_history=True) - newlen = len(ip.user_ns['Out']) - self.assertEqual(oldlen, newlen) - self.assertIsNone(res.result) - i = 0 - #also test the default caching behavior - for cell in ['1', '1;1']: - ip.run_cell(cell, store_history=True) - newlen = len(ip.user_ns['Out']) - i += 1 - self.assertEqual(oldlen+i, newlen) - - def test_syntax_error(self): - res = ip.run_cell("raise = 3") - self.assertIsInstance(res.error_before_exec, SyntaxError) - - def test_open_standard_input_stream(self): - res = ip.run_cell("open(0)") - self.assertIsInstance(res.error_in_exec, ValueError) - - def test_open_standard_output_stream(self): - res = ip.run_cell("open(1)") - self.assertIsInstance(res.error_in_exec, ValueError) - - def test_open_standard_error_stream(self): - res = ip.run_cell("open(2)") - self.assertIsInstance(res.error_in_exec, ValueError) - - def test_In_variable(self): - "Verify that In variable grows with user input (GH-284)" - oldlen = len(ip.user_ns['In']) - ip.run_cell('1;', store_history=True) - newlen = len(ip.user_ns['In']) - self.assertEqual(oldlen+1, newlen) - self.assertEqual(ip.user_ns['In'][-1],'1;') - - def test_magic_names_in_string(self): - ip.run_cell('a = """\n%exit\n"""') - self.assertEqual(ip.user_ns['a'], '\n%exit\n') - - def test_trailing_newline(self): - """test that running !(command) does not raise a SyntaxError""" - ip.run_cell('!(true)\n', False) - ip.run_cell('!(true)\n\n\n', False) - - def test_gh_597(self): - """Pretty-printing lists of objects with non-ascii reprs may cause - problems.""" - class Spam(object): - def __repr__(self): - return "\xe9"*50 - import IPython.core.formatters - f = IPython.core.formatters.PlainTextFormatter() - f([Spam(), Spam()]) - - def test_future_flags(self): - """Check that future flags are used for parsing code (gh-777)""" - ip.run_cell('from __future__ import barry_as_FLUFL') - try: - ip.run_cell('prfunc_return_val = 1 <> 2') - assert 'prfunc_return_val' in ip.user_ns - finally: - # Reset compiler flags so we don't mess up other tests. - ip.compile.reset_compiler_flags() - - def test_can_pickle(self): - "Can we pickle objects defined interactively (GH-29)" - ip = get_ipython() - ip.reset() - ip.run_cell(("class Mylist(list):\n" - " def __init__(self,x=[]):\n" - " list.__init__(self,x)")) - ip.run_cell("w=Mylist([1,2,3])") - - from pickle import dumps - - # We need to swap in our main module - this is only necessary - # inside the test framework, because IPython puts the interactive module - # in place (but the test framework undoes this). - _main = sys.modules['__main__'] - sys.modules['__main__'] = ip.user_module - try: - res = dumps(ip.user_ns["w"]) - finally: - sys.modules['__main__'] = _main - self.assertTrue(isinstance(res, bytes)) - - def test_global_ns(self): - "Code in functions must be able to access variables outside them." - ip = get_ipython() - ip.run_cell("a = 10") - ip.run_cell(("def f(x):\n" - " return x + a")) - ip.run_cell("b = f(12)") - self.assertEqual(ip.user_ns["b"], 22) - - def test_bad_custom_tb(self): - """Check that InteractiveShell is protected from bad custom exception handlers""" - ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0) - self.assertEqual(ip.custom_exceptions, (IOError,)) - with tt.AssertPrints("Custom TB Handler failed", channel='stderr'): - ip.run_cell(u'raise IOError("foo")') - self.assertEqual(ip.custom_exceptions, ()) - - def test_bad_custom_tb_return(self): - """Check that InteractiveShell is protected from bad return types in custom exception handlers""" - ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1) - self.assertEqual(ip.custom_exceptions, (NameError,)) - with tt.AssertPrints("Custom TB Handler failed", channel='stderr'): - ip.run_cell(u'a=abracadabra') - self.assertEqual(ip.custom_exceptions, ()) - - def test_drop_by_id(self): - myvars = {"a":object(), "b":object(), "c": object()} - ip.push(myvars, interactive=False) - for name in myvars: - assert name in ip.user_ns, name - assert name in ip.user_ns_hidden, name - ip.user_ns['b'] = 12 - ip.drop_by_id(myvars) - for name in ["a", "c"]: - assert name not in ip.user_ns, name - assert name not in ip.user_ns_hidden, name - assert ip.user_ns['b'] == 12 - ip.reset() - - def test_var_expand(self): - ip.user_ns['f'] = u'Ca\xf1o' - self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o') - self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o') - self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1') - self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2') - - self.assertEqual(ip.var_expand(u"grep x | awk '{print $1}'"), u"grep x | awk '{print $1}'") - - ip.user_ns['f'] = b'Ca\xc3\xb1o' - # This should not raise any exception: - ip.var_expand(u'echo $f') - - def test_var_expand_local(self): - """Test local variable expansion in !system and %magic calls""" - # !system - ip.run_cell( - "def test():\n" - ' lvar = "ttt"\n' - " ret = !echo {lvar}\n" - " return ret[0]\n" - ) - res = ip.user_ns["test"]() - self.assertIn("ttt", res) - - # %magic - ip.run_cell( - "def makemacro():\n" - ' macroname = "macro_var_expand_locals"\n' - " %macro {macroname} codestr\n" - ) - ip.user_ns["codestr"] = "str(12)" - ip.run_cell("makemacro()") - self.assertIn("macro_var_expand_locals", ip.user_ns) - - def test_var_expand_self(self): - """Test variable expansion with the name 'self', which was failing. - - See https://github.com/ipython/ipython/issues/1878#issuecomment-7698218 - """ - ip.run_cell( - "class cTest:\n" - ' classvar="see me"\n' - " def test(self):\n" - " res = !echo Variable: {self.classvar}\n" - " return res[0]\n" - ) - self.assertIn("see me", ip.user_ns["cTest"]().test()) - - def test_bad_var_expand(self): - """var_expand on invalid formats shouldn't raise""" - # SyntaxError - self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}") - # NameError - self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}") - # ZeroDivisionError - self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}") - - def test_silent_postexec(self): - """run_cell(silent=True) doesn't invoke pre/post_run_cell callbacks""" - pre_explicit = mock.Mock() - pre_always = mock.Mock() - post_explicit = mock.Mock() - post_always = mock.Mock() - all_mocks = [pre_explicit, pre_always, post_explicit, post_always] - - ip.events.register('pre_run_cell', pre_explicit) - ip.events.register('pre_execute', pre_always) - ip.events.register('post_run_cell', post_explicit) - ip.events.register('post_execute', post_always) - - try: - ip.run_cell("1", silent=True) - assert pre_always.called - assert not pre_explicit.called - assert post_always.called - assert not post_explicit.called - # double-check that non-silent exec did what we expected - # silent to avoid - ip.run_cell("1") - assert pre_explicit.called - assert post_explicit.called - info, = pre_explicit.call_args[0] - result, = post_explicit.call_args[0] - self.assertEqual(info, result.info) - # check that post hooks are always called - [m.reset_mock() for m in all_mocks] - ip.run_cell("syntax error") - assert pre_always.called - assert pre_explicit.called - assert post_always.called - assert post_explicit.called - info, = pre_explicit.call_args[0] - result, = post_explicit.call_args[0] - self.assertEqual(info, result.info) - finally: - # remove post-exec - ip.events.unregister('pre_run_cell', pre_explicit) - ip.events.unregister('pre_execute', pre_always) - ip.events.unregister('post_run_cell', post_explicit) - ip.events.unregister('post_execute', post_always) - - def test_silent_noadvance(self): - """run_cell(silent=True) doesn't advance execution_count""" - ec = ip.execution_count - # silent should force store_history=False - ip.run_cell("1", store_history=True, silent=True) - - self.assertEqual(ec, ip.execution_count) - # double-check that non-silent exec did what we expected - # silent to avoid - ip.run_cell("1", store_history=True) - self.assertEqual(ec+1, ip.execution_count) - - def test_silent_nodisplayhook(self): - """run_cell(silent=True) doesn't trigger displayhook""" - d = dict(called=False) - - trap = ip.display_trap - save_hook = trap.hook - - def failing_hook(*args, **kwargs): - d['called'] = True - - try: - trap.hook = failing_hook - res = ip.run_cell("1", silent=True) - self.assertFalse(d['called']) - self.assertIsNone(res.result) - # double-check that non-silent exec did what we expected - # silent to avoid - ip.run_cell("1") - self.assertTrue(d['called']) - finally: - trap.hook = save_hook - - def test_ofind_line_magic(self): - from IPython.core.magic import register_line_magic - - @register_line_magic - def lmagic(line): - "A line magic" - - # Get info on line magic - lfind = ip._ofind("lmagic") - info = OInfo( - found=True, - isalias=False, - ismagic=True, - namespace="IPython internal", - obj=lmagic, - parent=None, - ) - self.assertEqual(lfind, info) - - def test_ofind_cell_magic(self): - from IPython.core.magic import register_cell_magic - - @register_cell_magic - def cmagic(line, cell): - "A cell magic" - - # Get info on cell magic - find = ip._ofind("cmagic") - info = OInfo( - found=True, - isalias=False, - ismagic=True, - namespace="IPython internal", - obj=cmagic, - parent=None, - ) - self.assertEqual(find, info) - - def test_ofind_property_with_error(self): - class A(object): - @property - def foo(self): - raise NotImplementedError() # pragma: no cover - - a = A() - - found = ip._ofind("a.foo", [("locals", locals())]) - info = OInfo( - found=True, - isalias=False, - ismagic=False, - namespace="locals", - obj=A.foo, - parent=a, - ) - self.assertEqual(found, info) - - def test_ofind_multiple_attribute_lookups(self): - class A(object): - @property - def foo(self): - raise NotImplementedError() # pragma: no cover - - a = A() - a.a = A() - a.a.a = A() - - found = ip._ofind("a.a.a.foo", [("locals", locals())]) - info = OInfo( - found=True, - isalias=False, - ismagic=False, - namespace="locals", - obj=A.foo, - parent=a.a.a, - ) - self.assertEqual(found, info) - - def test_ofind_slotted_attributes(self): - class A(object): - __slots__ = ['foo'] - def __init__(self): - self.foo = 'bar' - - a = A() - found = ip._ofind("a.foo", [("locals", locals())]) - info = OInfo( - found=True, - isalias=False, - ismagic=False, - namespace="locals", - obj=a.foo, - parent=a, - ) - self.assertEqual(found, info) - - found = ip._ofind("a.bar", [("locals", locals())]) - expected = OInfo( - found=False, - isalias=False, - ismagic=False, - namespace=None, - obj=None, - parent=a, - ) - assert found == expected - - def test_ofind_prefers_property_to_instance_level_attribute(self): - class A(object): - @property - def foo(self): - return 'bar' - a = A() - a.__dict__["foo"] = "baz" - self.assertEqual(a.foo, "bar") - found = ip._ofind("a.foo", [("locals", locals())]) - self.assertIs(found.obj, A.foo) - - def test_custom_syntaxerror_exception(self): - called = [] - def my_handler(shell, etype, value, tb, tb_offset=None): - called.append(etype) - shell.showtraceback((etype, value, tb), tb_offset=tb_offset) - - ip.set_custom_exc((SyntaxError,), my_handler) - try: - ip.run_cell("1f") - # Check that this was called, and only once. - self.assertEqual(called, [SyntaxError]) - finally: - # Reset the custom exception hook - ip.set_custom_exc((), None) - - def test_custom_exception(self): - called = [] - def my_handler(shell, etype, value, tb, tb_offset=None): - called.append(etype) - shell.showtraceback((etype, value, tb), tb_offset=tb_offset) - - ip.set_custom_exc((ValueError,), my_handler) - try: - res = ip.run_cell("raise ValueError('test')") - # Check that this was called, and only once. - self.assertEqual(called, [ValueError]) - # Check that the error is on the result object - self.assertIsInstance(res.error_in_exec, ValueError) - finally: - # Reset the custom exception hook - ip.set_custom_exc((), None) - - @mock.patch("builtins.print") - def test_showtraceback_with_surrogates(self, mocked_print): - values = [] - - def mock_print_func(value, sep=" ", end="\n", file=sys.stdout, flush=False): - values.append(value) - if value == chr(0xD8FF): - raise UnicodeEncodeError("utf-8", chr(0xD8FF), 0, 1, "") - - # mock builtins.print - mocked_print.side_effect = mock_print_func - - # ip._showtraceback() is replaced in globalipapp.py. - # Call original method to test. - interactiveshell.InteractiveShell._showtraceback(ip, None, None, chr(0xD8FF)) - - self.assertEqual(mocked_print.call_count, 2) - self.assertEqual(values, [chr(0xD8FF), "\\ud8ff"]) - - def test_mktempfile(self): - filename = ip.mktempfile() - # Check that we can open the file again on Windows - with open(filename, "w", encoding="utf-8") as f: - f.write("abc") - - filename = ip.mktempfile(data="blah") - with open(filename, "r", encoding="utf-8") as f: - self.assertEqual(f.read(), "blah") - - def test_new_main_mod(self): - # Smoketest to check that this accepts a unicode module name - name = u'jiefmw' - mod = ip.new_main_mod(u'%s.py' % name, name) - self.assertEqual(mod.__name__, name) - - def test_get_exception_only(self): - try: - raise KeyboardInterrupt - except KeyboardInterrupt: - msg = ip.get_exception_only() - self.assertEqual(msg, 'KeyboardInterrupt\n') - - try: - raise DerivedInterrupt("foo") - except KeyboardInterrupt: - msg = ip.get_exception_only() - self.assertEqual(msg, 'IPython.core.tests.test_interactiveshell.DerivedInterrupt: foo\n') - - def test_inspect_text(self): - ip.run_cell('a = 5') - text = ip.object_inspect_text('a') - self.assertIsInstance(text, str) - - def test_last_execution_result(self): - """ Check that last execution result gets set correctly (GH-10702) """ - result = ip.run_cell('a = 5; a') - self.assertTrue(ip.last_execution_succeeded) - self.assertEqual(ip.last_execution_result.result, 5) - - result = ip.run_cell('a = x_invalid_id_x') - self.assertFalse(ip.last_execution_succeeded) - self.assertFalse(ip.last_execution_result.success) - self.assertIsInstance(ip.last_execution_result.error_in_exec, NameError) - - def test_reset_aliasing(self): - """ Check that standard posix aliases work after %reset. """ - if os.name != 'posix': - return - - ip.reset() - for cmd in ('clear', 'more', 'less', 'man'): - res = ip.run_cell('%' + cmd) - self.assertEqual(res.success, True) - - -@pytest.mark.skipif( - sys.implementation.name == "pypy" - and ((7, 3, 13) < sys.implementation.version < (7, 3, 16)), - reason="Unicode issues with scandir on PyPy, see https://github.com/pypy/pypy/issues/4860", -) -class TestSafeExecfileNonAsciiPath(unittest.TestCase): - @onlyif_unicode_paths - def setUp(self): - self.BASETESTDIR = tempfile.mkdtemp() - self.TESTDIR = join(self.BASETESTDIR, u"åäö") - os.mkdir(self.TESTDIR) - with open( - join(self.TESTDIR, "åäötestscript.py"), "w", encoding="utf-8" - ) as sfile: - sfile.write("pass\n") - self.oldpath = os.getcwd() - os.chdir(self.TESTDIR) - self.fname = u"åäötestscript.py" - - def tearDown(self): - os.chdir(self.oldpath) - shutil.rmtree(self.BASETESTDIR) - - @onlyif_unicode_paths - def test_1(self): - """Test safe_execfile with non-ascii path - """ - ip.safe_execfile(self.fname, {}, raise_exceptions=True) - -class ExitCodeChecks(tt.TempFileMixin): - - def setUp(self): - self.system = ip.system_raw - - def test_exit_code_ok(self): - self.system('exit 0') - self.assertEqual(ip.user_ns['_exit_code'], 0) - - def test_exit_code_error(self): - self.system('exit 1') - self.assertEqual(ip.user_ns['_exit_code'], 1) - - @skipif(not hasattr(signal, 'SIGALRM')) - def test_exit_code_signal(self): - self.mktmp("import signal, time\n" - "signal.setitimer(signal.ITIMER_REAL, 0.1)\n" - "time.sleep(1)\n") - self.system("%s %s" % (sys.executable, self.fname)) - self.assertEqual(ip.user_ns['_exit_code'], -signal.SIGALRM) - - @onlyif_cmds_exist("csh") - def test_exit_code_signal_csh(self): # pragma: no cover - SHELL = os.environ.get("SHELL", None) - os.environ["SHELL"] = find_cmd("csh") - try: - self.test_exit_code_signal() - finally: - if SHELL is not None: - os.environ['SHELL'] = SHELL - else: - del os.environ['SHELL'] - - -class TestSystemRaw(ExitCodeChecks): - - def setUp(self): - super().setUp() - self.system = ip.system_raw - - @onlyif_unicode_paths - def test_1(self): - """Test system_raw with non-ascii cmd - """ - cmd = u'''python -c "'åäö'" ''' - ip.system_raw(cmd) - - @mock.patch('subprocess.call', side_effect=KeyboardInterrupt) - @mock.patch('os.system', side_effect=KeyboardInterrupt) - def test_control_c(self, *mocks): - try: - self.system("sleep 1 # won't happen") - except KeyboardInterrupt: # pragma: no cove - self.fail( - "system call should intercept " - "keyboard interrupt from subprocess.call" - ) - self.assertEqual(ip.user_ns["_exit_code"], -signal.SIGINT) - - -@pytest.mark.parametrize("magic_cmd", ["pip", "conda", "cd"]) -def test_magic_warnings(magic_cmd): - if sys.platform == "win32": - to_mock = "os.system" - expected_arg, expected_kwargs = magic_cmd, dict() - else: - to_mock = "subprocess.call" - expected_arg, expected_kwargs = magic_cmd, dict( - shell=True, executable=os.environ.get("SHELL", None) - ) - - with mock.patch(to_mock, return_value=0) as mock_sub: - with pytest.warns(Warning, match=r"You executed the system command"): - ip.system_raw(magic_cmd) - mock_sub.assert_called_once_with(expected_arg, **expected_kwargs) - - -# TODO: Exit codes are currently ignored on Windows. -class TestSystemPipedExitCode(ExitCodeChecks): - - def setUp(self): - super().setUp() - self.system = ip.system_piped - - @skip_win32 - def test_exit_code_ok(self): - ExitCodeChecks.test_exit_code_ok(self) - - @skip_win32 - def test_exit_code_error(self): - ExitCodeChecks.test_exit_code_error(self) - - @skip_win32 - def test_exit_code_signal(self): - ExitCodeChecks.test_exit_code_signal(self) - -class TestModules(tt.TempFileMixin): - def test_extraneous_loads(self): - """Test we're not loading modules on startup that we shouldn't. - """ - self.mktmp("import sys\n" - "print('numpy' in sys.modules)\n" - "print('ipyparallel' in sys.modules)\n" - "print('ipykernel' in sys.modules)\n" - ) - out = "False\nFalse\nFalse\n" - tt.ipexec_validate(self.fname, out) - -class Negator(ast.NodeTransformer): - """Negates all number literals in an AST.""" - - def visit_Num(self, node): - node.value = -node.value - return node - - def visit_Constant(self, node): - if isinstance(node.value, int): - return self.visit_Num(node) - return node - -class TestAstTransform(unittest.TestCase): - def setUp(self): - self.negator = Negator() - ip.ast_transformers.append(self.negator) - - def tearDown(self): - ip.ast_transformers.remove(self.negator) - - def test_non_int_const(self): - with tt.AssertPrints("hello"): - ip.run_cell('print("hello")') - - def test_run_cell(self): - with tt.AssertPrints("-34"): - ip.run_cell("print(12 + 22)") - - # A named reference to a number shouldn't be transformed. - ip.user_ns["n"] = 55 - with tt.AssertNotPrints("-55"): - ip.run_cell("print(n)") - - def test_timeit(self): - called = set() - def f(x): - called.add(x) - ip.push({'f':f}) - - with tt.AssertPrints("std. dev. of"): - ip.run_line_magic("timeit", "-n1 f(1)") - self.assertEqual(called, {-1}) - called.clear() - - with tt.AssertPrints("std. dev. of"): - ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)") - self.assertEqual(called, {-2, -3}) - - def test_time(self): - called = [] - def f(x): - called.append(x) - ip.push({'f':f}) - - # Test with an expression - with tt.AssertPrints("Wall time: "): - ip.run_line_magic("time", "f(5+9)") - self.assertEqual(called, [-14]) - called[:] = [] - - # Test with a statement (different code path) - with tt.AssertPrints("Wall time: "): - ip.run_line_magic("time", "a = f(-3 + -2)") - self.assertEqual(called, [5]) - - def test_macro(self): - ip.push({'a':10}) - # The AST transformation makes this do a+=-1 - ip.define_macro("amacro", "a+=1\nprint(a)") - - with tt.AssertPrints("9"): - ip.run_cell("amacro") - with tt.AssertPrints("8"): - ip.run_cell("amacro") - -class TestMiscTransform(unittest.TestCase): - - - def test_transform_only_once(self): - cleanup = 0 - line_t = 0 - def count_cleanup(lines): - nonlocal cleanup - cleanup += 1 - return lines - - def count_line_t(lines): - nonlocal line_t - line_t += 1 - return lines - - ip.input_transformer_manager.cleanup_transforms.append(count_cleanup) - ip.input_transformer_manager.line_transforms.append(count_line_t) - - ip.run_cell('1') - - assert cleanup == 1 - assert line_t == 1 - -class IntegerWrapper(ast.NodeTransformer): - """Wraps all integers in a call to Integer()""" - - # for Python 3.7 and earlier - - # for Python 3.7 and earlier - def visit_Num(self, node): - if isinstance(node.n, int): - return ast.Call(func=ast.Name(id='Integer', ctx=ast.Load()), - args=[node], keywords=[]) - return node - - # For Python 3.8+ - def visit_Constant(self, node): - if isinstance(node.value, int): - return self.visit_Num(node) - return node - - -class TestAstTransform2(unittest.TestCase): - def setUp(self): - self.intwrapper = IntegerWrapper() - ip.ast_transformers.append(self.intwrapper) - - self.calls = [] - def Integer(*args): - self.calls.append(args) - return args - ip.push({"Integer": Integer}) - - def tearDown(self): - ip.ast_transformers.remove(self.intwrapper) - del ip.user_ns['Integer'] - - def test_run_cell(self): - ip.run_cell("n = 2") - self.assertEqual(self.calls, [(2,)]) - - # This shouldn't throw an error - ip.run_cell("o = 2.0") - self.assertEqual(ip.user_ns['o'], 2.0) - - def test_run_cell_non_int(self): - ip.run_cell("n = 'a'") - assert self.calls == [] - - def test_timeit(self): - called = set() - def f(x): - called.add(x) - ip.push({'f':f}) - - with tt.AssertPrints("std. dev. of"): - ip.run_line_magic("timeit", "-n1 f(1)") - self.assertEqual(called, {(1,)}) - called.clear() - - with tt.AssertPrints("std. dev. of"): - ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)") - self.assertEqual(called, {(2,), (3,)}) - -class ErrorTransformer(ast.NodeTransformer): - """Throws an error when it sees a number.""" - - def visit_Constant(self, node): - if isinstance(node.value, int): - raise ValueError("test") - return node - - -class TestAstTransformError(unittest.TestCase): - def test_unregistering(self): - err_transformer = ErrorTransformer() - ip.ast_transformers.append(err_transformer) - - with self.assertWarnsRegex(UserWarning, "It will be unregistered"): - ip.run_cell("1 + 2") - - # This should have been removed. - self.assertNotIn(err_transformer, ip.ast_transformers) - - -class StringRejector(ast.NodeTransformer): - """Throws an InputRejected when it sees a string literal. - - Used to verify that NodeTransformers can signal that a piece of code should - not be executed by throwing an InputRejected. - """ - - def visit_Constant(self, node): - if isinstance(node.value, str): - raise InputRejected("test") - return node - - -class TestAstTransformInputRejection(unittest.TestCase): - - def setUp(self): - self.transformer = StringRejector() - ip.ast_transformers.append(self.transformer) - - def tearDown(self): - ip.ast_transformers.remove(self.transformer) - - def test_input_rejection(self): - """Check that NodeTransformers can reject input.""" - - expect_exception_tb = tt.AssertPrints("InputRejected: test") - expect_no_cell_output = tt.AssertNotPrints("'unsafe'", suppress=False) - - # Run the same check twice to verify that the transformer is not - # disabled after raising. - with expect_exception_tb, expect_no_cell_output: - ip.run_cell("'unsafe'") - - with expect_exception_tb, expect_no_cell_output: - res = ip.run_cell("'unsafe'") - - self.assertIsInstance(res.error_before_exec, InputRejected) - -def test__IPYTHON__(): - # This shouldn't raise a NameError, that's all - __IPYTHON__ - - -class DummyRepr(object): - def __repr__(self): - return "DummyRepr" - - def _repr_html_(self): - return "dummy" - - def _repr_javascript_(self): - return "console.log('hi');", {'key': 'value'} - - -def test_user_variables(): - # enable all formatters - ip.display_formatter.active_types = ip.display_formatter.format_types - - ip.user_ns['dummy'] = d = DummyRepr() - keys = {'dummy', 'doesnotexist'} - r = ip.user_expressions({ key:key for key in keys}) - - assert keys == set(r.keys()) - dummy = r["dummy"] - assert {"status", "data", "metadata"} == set(dummy.keys()) - assert dummy["status"] == "ok" - data = dummy["data"] - metadata = dummy["metadata"] - assert data.get("text/html") == d._repr_html_() - js, jsmd = d._repr_javascript_() - assert data.get("application/javascript") == js - assert metadata.get("application/javascript") == jsmd - - dne = r["doesnotexist"] - assert dne["status"] == "error" - assert dne["ename"] == "NameError" - - # back to text only - ip.display_formatter.active_types = ['text/plain'] - -def test_user_expression(): - # enable all formatters - ip.display_formatter.active_types = ip.display_formatter.format_types - query = { - 'a' : '1 + 2', - 'b' : '1/0', - } - r = ip.user_expressions(query) - import pprint - pprint.pprint(r) - assert set(r.keys()) == set(query.keys()) - a = r["a"] - assert {"status", "data", "metadata"} == set(a.keys()) - assert a["status"] == "ok" - data = a["data"] - metadata = a["metadata"] - assert data.get("text/plain") == "3" - - b = r["b"] - assert b["status"] == "error" - assert b["ename"] == "ZeroDivisionError" - - # back to text only - ip.display_formatter.active_types = ['text/plain'] - - -class TestSyntaxErrorTransformer(unittest.TestCase): - """Check that SyntaxError raised by an input transformer is handled by run_cell()""" - - @staticmethod - def transformer(lines): - for line in lines: - pos = line.find('syntaxerror') - if pos >= 0: - e = SyntaxError('input contains "syntaxerror"') - e.text = line - e.offset = pos + 1 - raise e - return lines - - def setUp(self): - ip.input_transformers_post.append(self.transformer) - - def tearDown(self): - ip.input_transformers_post.remove(self.transformer) - - def test_syntaxerror_input_transformer(self): - with tt.AssertPrints('1234'): - ip.run_cell('1234') - with tt.AssertPrints('SyntaxError: invalid syntax'): - ip.run_cell('1 2 3') # plain python syntax error - with tt.AssertPrints('SyntaxError: input contains "syntaxerror"'): - ip.run_cell('2345 # syntaxerror') # input transformer syntax error - with tt.AssertPrints('3456'): - ip.run_cell('3456') - - -class TestWarningSuppression(unittest.TestCase): - def test_warning_suppression(self): - ip.run_cell("import warnings") - try: - with self.assertWarnsRegex(UserWarning, "asdf"): - ip.run_cell("warnings.warn('asdf')") - # Here's the real test -- if we run that again, we should get the - # warning again. Traditionally, each warning was only issued once per - # IPython session (approximately), even if the user typed in new and - # different code that should have also triggered the warning, leading - # to much confusion. - with self.assertWarnsRegex(UserWarning, "asdf"): - ip.run_cell("warnings.warn('asdf')") - finally: - ip.run_cell("del warnings") - - - def test_deprecation_warning(self): - ip.run_cell(""" -import warnings -def wrn(): - warnings.warn( - "I AM A WARNING", - DeprecationWarning - ) - """) - try: - with self.assertWarnsRegex(DeprecationWarning, "I AM A WARNING"): - ip.run_cell("wrn()") - finally: - ip.run_cell("del warnings") - ip.run_cell("del wrn") - - -class TestImportNoDeprecate(tt.TempFileMixin): - - def setUp(self): - """Make a valid python temp file.""" - self.mktmp(""" -import warnings -def wrn(): - warnings.warn( - "I AM A WARNING", - DeprecationWarning - ) -""") - super().setUp() - - def test_no_dep(self): - """ - No deprecation warning should be raised from imported functions - """ - ip.run_cell("from {} import wrn".format(self.fname)) - - with tt.AssertNotPrints("I AM A WARNING"): - ip.run_cell("wrn()") - ip.run_cell("del wrn") - - -def test_custom_exc_count(): - hook = mock.Mock(return_value=None) - ip.set_custom_exc((SyntaxError,), hook) - before = ip.execution_count - ip.run_cell("def foo()", store_history=True) - # restore default excepthook - ip.set_custom_exc((), None) - assert hook.call_count == 1 - assert ip.execution_count == before + 1 - - -def test_run_cell_async(): - ip.run_cell("import asyncio") - coro = ip.run_cell_async("await asyncio.sleep(0.01)\n5") - assert asyncio.iscoroutine(coro) - loop = asyncio.new_event_loop() - result = loop.run_until_complete(coro) - assert isinstance(result, interactiveshell.ExecutionResult) - assert result.result == 5 - - -def test_run_cell_await(): - ip.run_cell("import asyncio") - result = ip.run_cell("await asyncio.sleep(0.01); 10") - assert ip.user_ns["_"] == 10 - - -def test_run_cell_asyncio_run(): - ip.run_cell("import asyncio") - result = ip.run_cell("await asyncio.sleep(0.01); 1") - assert ip.user_ns["_"] == 1 - result = ip.run_cell("asyncio.run(asyncio.sleep(0.01)); 2") - assert ip.user_ns["_"] == 2 - result = ip.run_cell("await asyncio.sleep(0.01); 3") - assert ip.user_ns["_"] == 3 - - -def test_should_run_async(): - assert not ip.should_run_async("a = 5", transformed_cell="a = 5") - assert ip.should_run_async("await x", transformed_cell="await x") - assert ip.should_run_async( - "import asyncio; await asyncio.sleep(1)", - transformed_cell="import asyncio; await asyncio.sleep(1)", - ) - - -def test_set_custom_completer(): - num_completers = len(ip.Completer.matchers) - - def foo(*args, **kwargs): - return "I'm a completer!" - - ip.set_custom_completer(foo, 0) - - # check that we've really added a new completer - assert len(ip.Completer.matchers) == num_completers + 1 - - # check that the first completer is the function we defined - assert ip.Completer.matchers[0]() == "I'm a completer!" - - # clean up - ip.Completer.custom_matchers.pop() - - -class TestShowTracebackAttack(unittest.TestCase): - """Test that the interactive shell is resilient against the client attack of - manipulating the showtracebacks method. These attacks shouldn't result in an - unhandled exception in the kernel.""" - - def setUp(self): - self.orig_showtraceback = interactiveshell.InteractiveShell.showtraceback - - def tearDown(self): - interactiveshell.InteractiveShell.showtraceback = self.orig_showtraceback - - def test_set_show_tracebacks_none(self): - """Test the case of the client setting showtracebacks to None""" - - result = ip.run_cell( - """ - import IPython.core.interactiveshell - IPython.core.interactiveshell.InteractiveShell.showtraceback = None - - assert False, "This should not raise an exception" - """ - ) - print(result) - - assert result.result is None - assert isinstance(result.error_in_exec, TypeError) - assert str(result.error_in_exec) == "'NoneType' object is not callable" - - def test_set_show_tracebacks_noop(self): - """Test the case of the client setting showtracebacks to a no op lambda""" - - result = ip.run_cell( - """ - import IPython.core.interactiveshell - IPython.core.interactiveshell.InteractiveShell.showtraceback = lambda *args, **kwargs: None - - assert False, "This should not raise an exception" - """ - ) - print(result) - - assert result.result is None - assert isinstance(result.error_in_exec, AssertionError) - assert str(result.error_in_exec) == "This should not raise an exception" - - -@skip_if_not_osx -def test_enable_gui_osx(): - simple_prompt = ip.simple_prompt - ip.simple_prompt = False - - ip.enable_gui("osx") - assert ip.active_eventloop == "osx" - ip.enable_gui() - - # The following line fails for IPython <= 8.25.0 - ip.enable_gui("macosx") - assert ip.active_eventloop == "osx" - ip.enable_gui() - - ip.simple_prompt = simple_prompt diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_iplib.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_iplib.py deleted file mode 100644 index a5e51fb..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_iplib.py +++ /dev/null @@ -1,246 +0,0 @@ -"""Tests for the key interactiveshell module, where the main ipython class is defined. -""" - -import stack_data -import sys - -SV_VERSION = tuple([int(x) for x in stack_data.__version__.split(".")[0:2]]) - - -def test_reset(): - """reset must clear most namespaces.""" - - # Check that reset runs without error - ip.reset() - - # Once we've reset it (to clear of any junk that might have been there from - # other tests, we can count how many variables are in the user's namespace - nvars_user_ns = len(ip.user_ns) - nvars_hidden = len(ip.user_ns_hidden) - - # Now add a few variables to user_ns, and check that reset clears them - ip.user_ns['x'] = 1 - ip.user_ns['y'] = 1 - ip.reset() - - # Finally, check that all namespaces have only as many variables as we - # expect to find in them: - assert len(ip.user_ns) == nvars_user_ns - assert len(ip.user_ns_hidden) == nvars_hidden - - -# Tests for reporting of exceptions in various modes, handling of SystemExit, -# and %tb functionality. This is really a mix of testing ultraTB and interactiveshell. - -def doctest_tb_plain(): - """ - In [18]: xmode plain - Exception reporting mode: Plain - - In [19]: run simpleerr.py - Traceback (most recent call last): - File ...:... - bar(mode) - File ...:... in bar - div0() - File ...:... in div0 - x/y - ZeroDivisionError: ... - """ - - -def doctest_tb_context(): - """ - In [3]: xmode context - Exception reporting mode: Context - - In [4]: run simpleerr.py - --------------------------------------------------------------------------- - ZeroDivisionError Traceback (most recent call last) - - ... - 30 except IndexError: - 31 mode = 'div' - ---> 33 bar(mode) - - ... in bar(mode) - 15 "bar" - 16 if mode=='div': - ---> 17 div0() - 18 elif mode=='exit': - 19 try: - - ... in div0() - 6 x = 1 - 7 y = 0 - ----> 8 x/y - - ZeroDivisionError: ...""" - - -def doctest_tb_verbose(): - """ - In [5]: xmode verbose - Exception reporting mode: Verbose - - In [6]: run simpleerr.py - --------------------------------------------------------------------------- - ZeroDivisionError Traceback (most recent call last) - - ... - 30 except IndexError: - 31 mode = 'div' - ---> 33 bar(mode) - mode = 'div' - - ... in bar(mode='div') - 15 "bar" - 16 if mode=='div': - ---> 17 div0() - 18 elif mode=='exit': - 19 try: - - ... in div0() - 6 x = 1 - 7 y = 0 - ----> 8 x/y - x = 1 - y = 0 - - ZeroDivisionError: ... - """ - - -def doctest_tb_sysexit(): - """ - In [17]: %xmode plain - Exception reporting mode: Plain - - In [18]: %run simpleerr.py exit - An exception has occurred, use %tb to see the full traceback. - SystemExit: (1, 'Mode = exit') - - In [19]: %run simpleerr.py exit 2 - An exception has occurred, use %tb to see the full traceback. - SystemExit: (2, 'Mode = exit') - - In [20]: %tb - Traceback (most recent call last): - File ...:... in execfile - exec(compiler(f.read(), fname, "exec"), glob, loc) - File ...:... - bar(mode) - File ...:... in bar - sysexit(stat, mode) - File ...:... in sysexit - raise SystemExit(stat, f"Mode = {mode}") - SystemExit: (2, 'Mode = exit') - - In [21]: %xmode context - Exception reporting mode: Context - - In [22]: %tb - --------------------------------------------------------------------------- - SystemExit Traceback (most recent call last) - File ..., in execfile(fname, glob, loc, compiler) - ... with open(fname, "rb") as f: - ... compiler = compiler or compile - ---> ... exec(compiler(f.read(), fname, "exec"), glob, loc) - ... - 30 except IndexError: - 31 mode = 'div' - ---> 33 bar(mode) - - ...bar(mode) - 21 except: - 22 stat = 1 - ---> 23 sysexit(stat, mode) - 24 else: - 25 raise ValueError('Unknown mode') - - ...sysexit(stat, mode) - 10 def sysexit(stat, mode): - ---> 11 raise SystemExit(stat, f"Mode = {mode}") - - SystemExit: (2, 'Mode = exit') - """ - - -if SV_VERSION < (0, 6): - - def doctest_tb_sysexit_verbose_stack_data_05(): - """ - In [18]: %run simpleerr.py exit - An exception has occurred, use %tb to see the full traceback. - SystemExit: (1, 'Mode = exit') - - In [19]: %run simpleerr.py exit 2 - An exception has occurred, use %tb to see the full traceback. - SystemExit: (2, 'Mode = exit') - - In [23]: %xmode verbose - Exception reporting mode: Verbose - - In [24]: %tb - --------------------------------------------------------------------------- - SystemExit Traceback (most recent call last) - - ... - 30 except IndexError: - 31 mode = 'div' - ---> 33 bar(mode) - mode = 'exit' - - ... in bar(mode='exit') - ... except: - ... stat = 1 - ---> ... sysexit(stat, mode) - mode = 'exit' - stat = 2 - ... else: - ... raise ValueError('Unknown mode') - - ... in sysexit(stat=2, mode='exit') - 10 def sysexit(stat, mode): - ---> 11 raise SystemExit(stat, f"Mode = {mode}") - stat = 2 - - SystemExit: (2, 'Mode = exit') - """ - - -def test_run_cell(): - import textwrap - - ip.run_cell("a = 10\na+=1") - ip.run_cell("assert a == 11\nassert 1") - - assert ip.user_ns["a"] == 11 - complex = textwrap.dedent( - """ - if 1: - print "hello" - if 1: - print "world" - - if 2: - print "foo" - - if 3: - print "bar" - - if 4: - print "bar" - - """ - ) - # Simply verifies that this kind of input is run - ip.run_cell(complex) - - -def test_db(): - """Test the internal database used for variable persistence.""" - ip.db["__unittest_"] = 12 - assert ip.db["__unittest_"] == 12 - del ip.db["__unittest_"] - assert "__unittest_" not in ip.db diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_logger.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_logger.py deleted file mode 100644 index 003f603..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_logger.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -"""Test IPython.core.logger""" - -import os.path - -import pytest -from tempfile import TemporaryDirectory - - -def test_logstart_inaccessible_file(): - with pytest.raises(IOError): - _ip.logger.logstart(logfname="/") # Opening that filename will fail. - - try: - _ip.run_cell("a=1") # Check it doesn't try to log this - finally: - _ip.logger.log_active = False # If this fails, don't let later tests fail - -def test_logstart_unicode(): - with TemporaryDirectory() as tdir: - logfname = os.path.join(tdir, "test_unicode.log") - _ip.run_cell("'abc€'") - try: - _ip.run_line_magic("logstart", "-to %s" % logfname) - _ip.run_cell("'abc€'") - finally: - _ip.logger.logstop() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic.py deleted file mode 100644 index 4e16700..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic.py +++ /dev/null @@ -1,1623 +0,0 @@ -# -*- coding: utf-8 -*- -"""Tests for various magic functions.""" - -import gc -import io -import os -import re -import shlex -import signal -import sys -import warnings -from importlib import invalidate_caches -from io import StringIO -from pathlib import Path -from time import sleep -from threading import Thread -from subprocess import CalledProcessError -from textwrap import dedent -from time import sleep -from threading import Thread -from unittest import TestCase, mock - -import pytest - -from IPython import get_ipython -from IPython.core import magic -from IPython.core.error import UsageError -from IPython.core.magic import ( - Magics, - cell_magic, - line_magic, - magics_class, - register_cell_magic, - register_line_magic, -) -from IPython.core.magics import code, execution, logging, osm, script -from IPython.testing import decorators as dec -from IPython.testing import tools as tt -from IPython.utils.io import capture_output -from IPython.utils.process import find_cmd -from IPython.utils.tempdir import TemporaryDirectory, TemporaryWorkingDirectory -from IPython.utils.syspathcontext import prepended_to_syspath - -from .test_debugger import PdbTestInput - -from tempfile import NamedTemporaryFile - -@magic.magics_class -class DummyMagics(magic.Magics): pass - -def test_extract_code_ranges(): - instr = "1 3 5-6 7-9 10:15 17: :10 10- -13 :" - expected = [ - (0, 1), - (2, 3), - (4, 6), - (6, 9), - (9, 14), - (16, None), - (None, 9), - (9, None), - (None, 13), - (None, None), - ] - actual = list(code.extract_code_ranges(instr)) - assert actual == expected - -def test_extract_symbols(): - source = """import foo\na = 10\ndef b():\n return 42\n\n\nclass A: pass\n\n\n""" - symbols_args = ["a", "b", "A", "A,b", "A,a", "z"] - expected = [([], ['a']), - (["def b():\n return 42\n"], []), - (["class A: pass\n"], []), - (["class A: pass\n", "def b():\n return 42\n"], []), - (["class A: pass\n"], ['a']), - ([], ['z'])] - for symbols, exp in zip(symbols_args, expected): - assert code.extract_symbols(source, symbols) == exp - - -def test_extract_symbols_raises_exception_with_non_python_code(): - source = ("=begin A Ruby program :)=end\n" - "def hello\n" - "puts 'Hello world'\n" - "end") - with pytest.raises(SyntaxError): - code.extract_symbols(source, "hello") - - -def test_magic_not_found(): - # magic not found raises UsageError - with pytest.raises(UsageError): - _ip.run_line_magic("doesntexist", "") - - # ensure result isn't success when a magic isn't found - result = _ip.run_cell('%doesntexist') - assert isinstance(result.error_in_exec, UsageError) - - -def test_cell_magic_not_found(): - # magic not found raises UsageError - with pytest.raises(UsageError): - _ip.run_cell_magic('doesntexist', 'line', 'cell') - - # ensure result isn't success when a magic isn't found - result = _ip.run_cell('%%doesntexist') - assert isinstance(result.error_in_exec, UsageError) - - -def test_magic_error_status(): - def fail(shell): - 1/0 - _ip.register_magic_function(fail) - result = _ip.run_cell('%fail') - assert isinstance(result.error_in_exec, ZeroDivisionError) - - -def test_config(): - """ test that config magic does not raise - can happen if Configurable init is moved too early into - Magics.__init__ as then a Config object will be registered as a - magic. - """ - ## should not raise. - _ip.run_line_magic("config", "") - - -def test_config_available_configs(): - """ test that config magic prints available configs in unique and - sorted order. """ - with capture_output() as captured: - _ip.run_line_magic("config", "") - - stdout = captured.stdout - config_classes = stdout.strip().split('\n')[1:] - assert config_classes == sorted(set(config_classes)) - -def test_config_print_class(): - """ test that config with a classname prints the class's options. """ - with capture_output() as captured: - _ip.run_line_magic("config", "TerminalInteractiveShell") - - stdout = captured.stdout - assert re.match( - "TerminalInteractiveShell.* options", stdout.splitlines()[0] - ), f"{stdout}\n\n1st line of stdout not like 'TerminalInteractiveShell.* options'" - - -def test_rehashx(): - # clear up everything - _ip.alias_manager.clear_aliases() - del _ip.db['syscmdlist'] - - _ip.run_line_magic("rehashx", "") - # Practically ALL ipython development systems will have more than 10 aliases - - assert len(_ip.alias_manager.aliases) > 10 - for name, cmd in _ip.alias_manager.aliases: - # we must strip dots from alias names - assert "." not in name - - # rehashx must fill up syscmdlist - scoms = _ip.db['syscmdlist'] - assert len(scoms) > 10 - - -def test_magic_parse_options(): - """Test that we don't mangle paths when parsing magic options.""" - ip = get_ipython() - path = 'c:\\x' - m = DummyMagics(ip) - opts = m.parse_options('-f %s' % path,'f:')[0] - # argv splitting is os-dependent - if os.name == 'posix': - expected = 'c:x' - else: - expected = path - assert opts["f"] == expected - - -def test_magic_parse_long_options(): - """Magic.parse_options can handle --foo=bar long options""" - ip = get_ipython() - m = DummyMagics(ip) - opts, _ = m.parse_options("--foo --bar=bubble", "a", "foo", "bar=") - assert "foo" in opts - assert "bar" in opts - assert opts["bar"] == "bubble" - - -def doctest_hist_f(): - """Test %hist -f with temporary filename. - - In [9]: import tempfile - - In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-') - - In [11]: %hist -nl -f $tfile 3 - - In [13]: import os; os.unlink(tfile) - """ - - -def doctest_hist_op(): - """Test %hist -op - - In [1]: class b(float): - ...: pass - ...: - - In [2]: class s(object): - ...: def __str__(self): - ...: return 's' - ...: - - In [3]: - - In [4]: class r(b): - ...: def __repr__(self): - ...: return 'r' - ...: - - In [5]: class sr(s,r): pass - ...: - - In [6]: - - In [7]: bb=b() - - In [8]: ss=s() - - In [9]: rr=r() - - In [10]: ssrr=sr() - - In [11]: 4.5 - Out[11]: 4.5 - - In [12]: str(ss) - Out[12]: 's' - - In [13]: - - In [14]: %hist -op - >>> class b: - ... pass - ... - >>> class s(b): - ... def __str__(self): - ... return 's' - ... - >>> - >>> class r(b): - ... def __repr__(self): - ... return 'r' - ... - >>> class sr(s,r): pass - >>> - >>> bb=b() - >>> ss=s() - >>> rr=r() - >>> ssrr=sr() - >>> 4.5 - 4.5 - >>> str(ss) - 's' - >>> - """ - -def test_hist_pof(): - ip = get_ipython() - ip.run_cell("1+2", store_history=True) - #raise Exception(ip.history_manager.session_number) - #raise Exception(list(ip.history_manager._get_range_session())) - with TemporaryDirectory() as td: - tf = os.path.join(td, 'hist.py') - ip.run_line_magic('history', '-pof %s' % tf) - assert os.path.isfile(tf) - - -def test_macro(): - ip = get_ipython() - ip.history_manager.reset() # Clear any existing history. - cmds = ["a=1", "def b():\n return a**2", "print(a,b())"] - for i, cmd in enumerate(cmds, start=1): - ip.history_manager.store_inputs(i, cmd) - ip.run_line_magic("macro", "test 1-3") - assert ip.user_ns["test"].value == "\n".join(cmds) + "\n" - - # List macros - assert "test" in ip.run_line_magic("macro", "") - - -def test_macro_run(): - """Test that we can run a multi-line macro successfully.""" - ip = get_ipython() - ip.history_manager.reset() - cmds = ["a=10", "a+=1", "print(a)", "%macro test 2-3"] - for cmd in cmds: - ip.run_cell(cmd, store_history=True) - assert ip.user_ns["test"].value == "a+=1\nprint(a)\n" - with tt.AssertPrints("12"): - ip.run_cell("test") - with tt.AssertPrints("13"): - ip.run_cell("test") - - -def test_magic_magic(): - """Test %magic""" - ip = get_ipython() - with capture_output() as captured: - ip.run_line_magic("magic", "") - - stdout = captured.stdout - assert "%magic" in stdout - assert "IPython" in stdout - assert "Available" in stdout - - -@dec.skipif_not_numpy -def test_numpy_reset_array_undec(): - "Test '%reset array' functionality" - _ip.ex("import numpy as np") - _ip.ex("a = np.empty(2)") - assert "a" in _ip.user_ns - _ip.run_line_magic("reset", "-f array") - assert "a" not in _ip.user_ns - - -def test_reset_out(): - "Test '%reset out' magic" - _ip.run_cell("parrot = 'dead'", store_history=True) - # test '%reset -f out', make an Out prompt - _ip.run_cell("parrot", store_history=True) - assert "dead" in [_ip.user_ns[x] for x in ("_", "__", "___")] - _ip.run_line_magic("reset", "-f out") - assert "dead" not in [_ip.user_ns[x] for x in ("_", "__", "___")] - assert len(_ip.user_ns["Out"]) == 0 - - -def test_reset_in(): - "Test '%reset in' magic" - # test '%reset -f in' - _ip.run_cell("parrot", store_history=True) - assert "parrot" in [_ip.user_ns[x] for x in ("_i", "_ii", "_iii")] - _ip.run_line_magic("reset", "-f in") - assert "parrot" not in [_ip.user_ns[x] for x in ("_i", "_ii", "_iii")] - assert len(set(_ip.user_ns["In"])) == 1 - - -def test_reset_dhist(): - "Test '%reset dhist' magic" - _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing - _ip.run_line_magic("cd", os.path.dirname(pytest.__file__)) - _ip.run_line_magic("cd", "-") - assert len(_ip.user_ns["_dh"]) > 0 - _ip.run_line_magic("reset", "-f dhist") - assert len(_ip.user_ns["_dh"]) == 0 - _ip.run_cell("_dh = [d for d in tmp]") # restore - - -def test_reset_in_length(): - "Test that '%reset in' preserves In[] length" - _ip.run_cell("print 'foo'") - _ip.run_cell("reset -f in") - assert len(_ip.user_ns["In"]) == _ip.displayhook.prompt_count + 1 - - -class TestResetErrors(TestCase): - - def test_reset_redefine(self): - - @magics_class - class KernelMagics(Magics): - @line_magic - def less(self, shell): pass - - _ip.register_magics(KernelMagics) - - with self.assertLogs() as cm: - # hack, we want to just capture logs, but assertLogs fails if not - # logs get produce. - # so log one things we ignore. - import logging as log_mod - log = log_mod.getLogger() - log.info('Nothing') - # end hack. - _ip.run_cell("reset -f") - - assert len(cm.output) == 1 - for out in cm.output: - assert "Invalid alias" not in out - -def test_tb_syntaxerror(): - """test %tb after a SyntaxError""" - ip = get_ipython() - ip.run_cell("for") - - # trap and validate stdout - save_stdout = sys.stdout - try: - sys.stdout = StringIO() - ip.run_cell("%tb") - out = sys.stdout.getvalue() - finally: - sys.stdout = save_stdout - # trim output, and only check the last line - last_line = out.rstrip().splitlines()[-1].strip() - assert last_line == "SyntaxError: invalid syntax" - - -def test_time(): - ip = get_ipython() - - with tt.AssertPrints("Wall time: "): - ip.run_cell("%time None") - - ip.run_cell("def f(kmjy):\n" - " %time print (2*kmjy)") - - with tt.AssertPrints("Wall time: "): - with tt.AssertPrints("hihi", suppress=False): - ip.run_cell("f('hi')") - - -# ';' at the end of %time prevents instruction value to be printed. -# This tests fix for #13837. -def test_time_no_output_with_semicolon(): - ip = get_ipython() - - # Test %time cases - with tt.AssertPrints(" 123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%time 123000+456") - - with tt.AssertNotPrints(" 123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%time 123000+456;") - - with tt.AssertPrints(" 123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%time 123000+456 # Comment") - - with tt.AssertNotPrints(" 123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%time 123000+456; # Comment") - - with tt.AssertPrints(" 123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%time 123000+456 # ;Comment") - - # Test %%time cases - with tt.AssertPrints("123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%%time\n123000+456\n\n\n") - - with tt.AssertNotPrints("123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%%time\n123000+456;\n\n\n") - - with tt.AssertPrints("123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%%time\n123000+456 # Comment\n\n\n") - - with tt.AssertNotPrints("123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%%time\n123000+456; # Comment\n\n\n") - - with tt.AssertPrints("123456"): - with tt.AssertPrints("Wall time: ", suppress=False): - with tt.AssertPrints("CPU times: ", suppress=False): - ip.run_cell("%%time\n123000+456 # ;Comment\n\n\n") - - -def test_time_last_not_expression(): - ip.run_cell("%%time\n" - "var_1 = 1\n" - "var_2 = 2\n") - assert ip.user_ns['var_1'] == 1 - del ip.user_ns['var_1'] - assert ip.user_ns['var_2'] == 2 - del ip.user_ns['var_2'] - - -@dec.skip_win32 -def test_time2(): - ip = get_ipython() - - with tt.AssertPrints("CPU times: user "): - ip.run_cell("%time None") - -def test_time3(): - """Erroneous magic function calls, issue gh-3334""" - ip = get_ipython() - ip.user_ns.pop('run', None) - - with tt.AssertNotPrints("not found", channel='stderr'): - ip.run_cell("%%time\n" - "run = 0\n" - "run += 1") - -def test_multiline_time(): - """Make sure last statement from time return a value.""" - ip = get_ipython() - ip.user_ns.pop('run', None) - - ip.run_cell( - dedent( - """\ - %%time - a = "ho" - b = "hey" - a+b - """ - ) - ) - assert ip.user_ns_hidden["_"] == "hohey" - - -def test_time_local_ns(): - """ - Test that local_ns is actually global_ns when running a cell magic - """ - ip = get_ipython() - ip.run_cell("%%time\n" "myvar = 1") - assert ip.user_ns["myvar"] == 1 - del ip.user_ns["myvar"] - - -def test_time_microseconds_display(): - """Ensure ASCII is used when necessary""" - with mock.patch("sys.stdout", io.TextIOWrapper(StringIO(), encoding="utf-8")): - assert execution._format_time(0.000001) == "1 \u03bcs" - with mock.patch("sys.stdout", io.TextIOWrapper(StringIO(), encoding="ascii")): - assert execution._format_time(0.000001) == "1 us" - - -# Test %%capture magic. Added to test issue #13926 -def test_capture(): - ip = get_ipython() - - # Test %%capture nominal case - ip.run_cell("%%capture abc\n1+2") - with tt.AssertPrints("True", suppress=False): - ip.run_cell("'abc' in locals()") - with tt.AssertPrints("True", suppress=False): - ip.run_cell("'outputs' in dir(abc)") - with tt.AssertPrints("3", suppress=False): - ip.run_cell("abc.outputs[0]") - - # Test %%capture with ';' at end of expression - ip.run_cell("%%capture abc\n7+8;") - with tt.AssertPrints("False", suppress=False): - ip.run_cell("'abc' in locals()") - - -def test_doctest_mode(): - "Toggle doctest_mode twice, it should be a no-op and run without error" - _ip.run_line_magic("doctest_mode", "") - _ip.run_line_magic("doctest_mode", "") - - -def test_parse_options(): - """Tests for basic options parsing in magics.""" - # These are only the most minimal of tests, more should be added later. At - # the very least we check that basic text/unicode calls work OK. - m = DummyMagics(_ip) - assert m.parse_options("foo", "")[1] == "foo" - assert m.parse_options("foo", "")[1] == "foo" - - -def test_parse_options_preserve_non_option_string(): - """Test to assert preservation of non-option part of magic-block, while parsing magic options.""" - m = DummyMagics(_ip) - opts, stmt = m.parse_options( - " -n1 -r 13 _ = 314 + foo", "n:r:", preserve_non_opts=True - ) - assert opts == {"n": "1", "r": "13"} - assert stmt == "_ = 314 + foo" - - -def test_run_magic_preserve_code_block(): - """Test to assert preservation of non-option part of magic-block, while running magic.""" - _ip.user_ns["spaces"] = [] - _ip.run_line_magic( - "timeit", "-n1 -r1 spaces.append([s.count(' ') for s in ['document']])" - ) - assert _ip.user_ns["spaces"] == [[0]] - - -def test_dirops(): - """Test various directory handling operations.""" - # curpath = lambda :os.path.splitdrive(os.getcwd())[1].replace('\\','/') - curpath = os.getcwd - startdir = os.getcwd() - ipdir = os.path.realpath(_ip.ipython_dir) - try: - _ip.run_line_magic("cd", '"%s"' % ipdir) - assert curpath() == ipdir - _ip.run_line_magic("cd", "-") - assert curpath() == startdir - _ip.run_line_magic("pushd", '"%s"' % ipdir) - assert curpath() == ipdir - _ip.run_line_magic("popd", "") - assert curpath() == startdir - finally: - os.chdir(startdir) - - -def test_cd_force_quiet(): - """Test OSMagics.cd_force_quiet option""" - _ip.config.OSMagics.cd_force_quiet = True - osmagics = osm.OSMagics(shell=_ip) - - startdir = os.getcwd() - ipdir = os.path.realpath(_ip.ipython_dir) - - try: - with tt.AssertNotPrints(ipdir): - osmagics.cd('"%s"' % ipdir) - with tt.AssertNotPrints(startdir): - osmagics.cd('-') - finally: - os.chdir(startdir) - - -def test_xmode(): - # Calling xmode three times should be a no-op - xmode = _ip.InteractiveTB.mode - for i in range(4): - _ip.run_line_magic("xmode", "") - assert _ip.InteractiveTB.mode == xmode - -def test_reset_hard(): - monitor = [] - class A(object): - def __del__(self): - monitor.append(1) - def __repr__(self): - return "" - - _ip.user_ns["a"] = A() - _ip.run_cell("a") - - assert monitor == [] - _ip.run_line_magic("reset", "-f") - assert monitor == [1] - -class TestXdel(tt.TempFileMixin): - def test_xdel(self): - """Test that references from %run are cleared by xdel.""" - src = ("class A(object):\n" - " monitor = []\n" - " def __del__(self):\n" - " self.monitor.append(1)\n" - "a = A()\n") - self.mktmp(src) - # %run creates some hidden references... - _ip.run_line_magic("run", "%s" % self.fname) - # ... as does the displayhook. - _ip.run_cell("a") - - monitor = _ip.user_ns["A"].monitor - assert monitor == [] - - _ip.run_line_magic("xdel", "a") - - # Check that a's __del__ method has been called. - gc.collect(0) - assert monitor == [1] - -def doctest_who(): - """doctest for %who - - In [1]: %reset -sf - - In [2]: alpha = 123 - - In [3]: beta = 'beta' - - In [4]: %who int - alpha - - In [5]: %who str - beta - - In [6]: %whos - Variable Type Data/Info - ---------------------------- - alpha int 123 - beta str beta - - In [7]: %who_ls - Out[7]: ['alpha', 'beta'] - """ - -def test_whos(): - """Check that whos is protected against objects where repr() fails.""" - class A(object): - def __repr__(self): - raise Exception() - _ip.user_ns['a'] = A() - _ip.run_line_magic("whos", "") - -def doctest_precision(): - """doctest for %precision - - In [1]: f = get_ipython().display_formatter.formatters['text/plain'] - - In [2]: %precision 5 - Out[2]: '%.5f' - - In [3]: f.float_format - Out[3]: '%.5f' - - In [4]: %precision %e - Out[4]: '%e' - - In [5]: f(3.1415927) - Out[5]: '3.141593e+00' - """ - - -def test_debug_magic(): - """Test debugging a small code with %debug - - In [1]: with PdbTestInput(['c']): - ...: %debug print("a b") #doctest: +ELLIPSIS - ...: - ... - ipdb> c - a b - In [2]: - """ - - -def test_debug_magic_locals(): - """Test debugging a small code with %debug with locals - - In [1]: with PdbTestInput(['c']): - ...: def fun(): - ...: res = 1 - ...: %debug print(res) - ...: fun() - ...: - ... - ipdb> c - 1 - In [2]: - """ - -def test_psearch(): - with tt.AssertPrints("dict.fromkeys"): - _ip.run_cell("dict.fr*?") - with tt.AssertPrints("π.is_integer"): - _ip.run_cell("π = 3.14;\nπ.is_integ*?") - -def test_timeit_shlex(): - """test shlex issues with timeit (#1109)""" - _ip.ex("def f(*a,**kw): pass") - _ip.run_line_magic("timeit", '-n1 "this is a bug".count(" ")') - _ip.run_line_magic("timeit", '-r1 -n1 f(" ", 1)') - _ip.run_line_magic("timeit", '-r1 -n1 f(" ", 1, " ", 2, " ")') - _ip.run_line_magic("timeit", '-r1 -n1 ("a " + "b")') - _ip.run_line_magic("timeit", '-r1 -n1 f("a " + "b")') - _ip.run_line_magic("timeit", '-r1 -n1 f("a " + "b ")') - - -def test_timeit_special_syntax(): - "Test %%timeit with IPython special syntax" - @register_line_magic - def lmagic(line): - ip = get_ipython() - ip.user_ns['lmagic_out'] = line - - # line mode test - _ip.run_line_magic("timeit", "-n1 -r1 %lmagic my line") - assert _ip.user_ns["lmagic_out"] == "my line" - # cell mode test - _ip.run_cell_magic("timeit", "-n1 -r1", "%lmagic my line2") - assert _ip.user_ns["lmagic_out"] == "my line2" - - -def test_timeit_return(): - """ - test whether timeit -o return object - """ - - res = _ip.run_line_magic('timeit','-n10 -r10 -o 1') - assert(res is not None) - -def test_timeit_quiet(): - """ - test quiet option of timeit magic - """ - with tt.AssertNotPrints("loops"): - _ip.run_cell("%timeit -n1 -r1 -q 1") - -def test_timeit_return_quiet(): - with tt.AssertNotPrints("loops"): - res = _ip.run_line_magic('timeit', '-n1 -r1 -q -o 1') - assert (res is not None) - -def test_timeit_invalid_return(): - with pytest.raises(SyntaxError): - _ip.run_line_magic('timeit', 'return') - -@dec.skipif(execution.profile is None) -def test_prun_special_syntax(): - "Test %%prun with IPython special syntax" - @register_line_magic - def lmagic(line): - ip = get_ipython() - ip.user_ns['lmagic_out'] = line - - # line mode test - _ip.run_line_magic("prun", "-q %lmagic my line") - assert _ip.user_ns["lmagic_out"] == "my line" - # cell mode test - _ip.run_cell_magic("prun", "-q", "%lmagic my line2") - assert _ip.user_ns["lmagic_out"] == "my line2" - - -@dec.skipif(execution.profile is None) -def test_prun_quotes(): - "Test that prun does not clobber string escapes (GH #1302)" - _ip.run_line_magic("prun", r"-q x = '\t'") - assert _ip.user_ns["x"] == "\t" - - -def test_extension(): - # Debugging information for failures of this test - print('sys.path:') - for p in sys.path: - print(' ', p) - print('CWD', os.getcwd()) - - pytest.raises(ImportError, _ip.run_line_magic, "load_ext", "daft_extension") - daft_path = os.path.join(os.path.dirname(__file__), "daft_extension") - sys.path.insert(0, daft_path) - try: - _ip.user_ns.pop('arq', None) - invalidate_caches() # Clear import caches - _ip.run_line_magic("load_ext", "daft_extension") - assert _ip.user_ns["arq"] == 185 - _ip.run_line_magic("unload_ext", "daft_extension") - assert 'arq' not in _ip.user_ns - finally: - sys.path.remove(daft_path) - - -def test_notebook_export_json(): - pytest.importorskip("nbformat") - _ip = get_ipython() - _ip.history_manager.reset() # Clear any existing history. - cmds = ["a=1", "def b():\n return a**2", "print('noël, été', b())"] - for i, cmd in enumerate(cmds, start=1): - _ip.history_manager.store_inputs(i, cmd) - with TemporaryDirectory() as td: - outfile = os.path.join(td, "nb.ipynb") - _ip.run_line_magic("notebook", "%s" % outfile) - - -class TestEnv(TestCase): - - def test_env(self): - env = _ip.run_line_magic("env", "") - self.assertTrue(isinstance(env, dict)) - - def test_env_secret(self): - env = _ip.run_line_magic("env", "") - hidden = "" - with mock.patch.dict( - os.environ, - { - "API_KEY": "abc123", - "SECRET_THING": "ssshhh", - "JUPYTER_TOKEN": "", - "VAR": "abc" - } - ): - env = _ip.run_line_magic("env", "") - assert env["API_KEY"] == hidden - assert env["SECRET_THING"] == hidden - assert env["JUPYTER_TOKEN"] == hidden - assert env["VAR"] == "abc" - - def test_env_get_set_simple(self): - env = _ip.run_line_magic("env", "var val1") - self.assertEqual(env, None) - self.assertEqual(os.environ["var"], "val1") - self.assertEqual(_ip.run_line_magic("env", "var"), "val1") - env = _ip.run_line_magic("env", "var=val2") - self.assertEqual(env, None) - self.assertEqual(os.environ['var'], 'val2') - - def test_env_get_set_complex(self): - env = _ip.run_line_magic("env", "var 'val1 '' 'val2") - self.assertEqual(env, None) - self.assertEqual(os.environ['var'], "'val1 '' 'val2") - self.assertEqual(_ip.run_line_magic("env", "var"), "'val1 '' 'val2") - env = _ip.run_line_magic("env", 'var=val2 val3="val4') - self.assertEqual(env, None) - self.assertEqual(os.environ['var'], 'val2 val3="val4') - - def test_env_set_bad_input(self): - self.assertRaises(UsageError, lambda: _ip.run_line_magic("set_env", "var")) - - def test_env_set_whitespace(self): - self.assertRaises(UsageError, lambda: _ip.run_line_magic("env", "var A=B")) - - -class CellMagicTestCase(TestCase): - - def check_ident(self, magic): - # Manually called, we get the result - out = _ip.run_cell_magic(magic, "a", "b") - assert out == ("a", "b") - # Via run_cell, it goes into the user's namespace via displayhook - _ip.run_cell("%%" + magic + " c\nd\n") - assert _ip.user_ns["_"] == ("c", "d\n") - - def test_cell_magic_func_deco(self): - "Cell magic using simple decorator" - @register_cell_magic - def cellm(line, cell): - return line, cell - - self.check_ident('cellm') - - def test_cell_magic_reg(self): - "Cell magic manually registered" - def cellm(line, cell): - return line, cell - - _ip.register_magic_function(cellm, 'cell', 'cellm2') - self.check_ident('cellm2') - - def test_cell_magic_class(self): - "Cell magics declared via a class" - @magics_class - class MyMagics(Magics): - - @cell_magic - def cellm3(self, line, cell): - return line, cell - - _ip.register_magics(MyMagics) - self.check_ident('cellm3') - - def test_cell_magic_class2(self): - "Cell magics declared via a class, #2" - @magics_class - class MyMagics2(Magics): - - @cell_magic('cellm4') - def cellm33(self, line, cell): - return line, cell - - _ip.register_magics(MyMagics2) - self.check_ident('cellm4') - # Check that nothing is registered as 'cellm33' - c33 = _ip.find_cell_magic('cellm33') - assert c33 == None - -def test_file(): - """Basic %%writefile""" - ip = get_ipython() - with TemporaryDirectory() as td: - fname = os.path.join(td, "file1") - ip.run_cell_magic( - "writefile", - fname, - "\n".join( - [ - "line1", - "line2", - ] - ), - ) - s = Path(fname).read_text(encoding="utf-8") - assert "line1\n" in s - assert "line2" in s - - -@dec.skip_win32 -def test_file_single_quote(): - """Basic %%writefile with embedded single quotes""" - ip = get_ipython() - with TemporaryDirectory() as td: - fname = os.path.join(td, "'file1'") - ip.run_cell_magic( - "writefile", - fname, - "\n".join( - [ - "line1", - "line2", - ] - ), - ) - s = Path(fname).read_text(encoding="utf-8") - assert "line1\n" in s - assert "line2" in s - - -@dec.skip_win32 -def test_file_double_quote(): - """Basic %%writefile with embedded double quotes""" - ip = get_ipython() - with TemporaryDirectory() as td: - fname = os.path.join(td, '"file1"') - ip.run_cell_magic( - "writefile", - fname, - "\n".join( - [ - "line1", - "line2", - ] - ), - ) - s = Path(fname).read_text(encoding="utf-8") - assert "line1\n" in s - assert "line2" in s - - -def test_file_var_expand(): - """%%writefile $filename""" - ip = get_ipython() - with TemporaryDirectory() as td: - fname = os.path.join(td, "file1") - ip.user_ns["filename"] = fname - ip.run_cell_magic( - "writefile", - "$filename", - "\n".join( - [ - "line1", - "line2", - ] - ), - ) - s = Path(fname).read_text(encoding="utf-8") - assert "line1\n" in s - assert "line2" in s - - -def test_file_unicode(): - """%%writefile with unicode cell""" - ip = get_ipython() - with TemporaryDirectory() as td: - fname = os.path.join(td, 'file1') - ip.run_cell_magic("writefile", fname, u'\n'.join([ - u'liné1', - u'liné2', - ])) - with io.open(fname, encoding='utf-8') as f: - s = f.read() - assert "liné1\n" in s - assert "liné2" in s - - -def test_file_amend(): - """%%writefile -a amends files""" - ip = get_ipython() - with TemporaryDirectory() as td: - fname = os.path.join(td, "file2") - ip.run_cell_magic( - "writefile", - fname, - "\n".join( - [ - "line1", - "line2", - ] - ), - ) - ip.run_cell_magic( - "writefile", - "-a %s" % fname, - "\n".join( - [ - "line3", - "line4", - ] - ), - ) - s = Path(fname).read_text(encoding="utf-8") - assert "line1\n" in s - assert "line3\n" in s - - -def test_file_spaces(): - """%%file with spaces in filename""" - ip = get_ipython() - with TemporaryWorkingDirectory() as td: - fname = "file name" - ip.run_cell_magic( - "file", - '"%s"' % fname, - "\n".join( - [ - "line1", - "line2", - ] - ), - ) - s = Path(fname).read_text(encoding="utf-8") - assert "line1\n" in s - assert "line2" in s - - -def test_script_config(): - ip = get_ipython() - ip.config.ScriptMagics.script_magics = ['whoda'] - sm = script.ScriptMagics(shell=ip) - assert "whoda" in sm.magics["cell"] - - -def _interrupt_after_1s(): - sleep(1) - signal.raise_signal(signal.SIGINT) - - -def test_script_raise_on_interrupt(): - ip = get_ipython() - - with pytest.raises(CalledProcessError): - thread = Thread(target=_interrupt_after_1s) - thread.start() - ip.run_cell_magic( - "script", f"{sys.executable}", "from time import sleep; sleep(2)" - ) - thread.join() - - -def test_script_do_not_raise_on_interrupt(): - ip = get_ipython() - - thread = Thread(target=_interrupt_after_1s) - thread.start() - ip.run_cell_magic( - "script", - f"--no-raise-error {sys.executable}", - "from time import sleep; sleep(2)", - ) - thread.join() - - -def test_script_out(): - ip = get_ipython() - ip.run_cell_magic("script", f"--out output {sys.executable}", "print('hi')") - assert ip.user_ns["output"].strip() == "hi" - - -def test_script_err(): - ip = get_ipython() - ip.run_cell_magic( - "script", - f"--err error {sys.executable}", - "import sys; print('hello', file=sys.stderr)", - ) - assert ip.user_ns["error"].strip() == "hello" - - -def test_script_out_err(): - ip = get_ipython() - ip.run_cell_magic( - "script", - f"--out output --err error {sys.executable}", - "\n".join( - [ - "import sys", - "print('hi')", - "print('hello', file=sys.stderr)", - ] - ), - ) - assert ip.user_ns["output"].strip() == "hi" - assert ip.user_ns["error"].strip() == "hello" - - -async def test_script_bg_out(): - ip = get_ipython() - ip.run_cell_magic("script", f"--bg --out output {sys.executable}", "print('hi')") - assert (await ip.user_ns["output"].read()).strip() == b"hi" - assert ip.user_ns["output"].at_eof() - - -async def test_script_bg_err(): - ip = get_ipython() - ip.run_cell_magic( - "script", - f"--bg --err error {sys.executable}", - "import sys; print('hello', file=sys.stderr)", - ) - assert (await ip.user_ns["error"].read()).strip() == b"hello" - assert ip.user_ns["error"].at_eof() - - -async def test_script_bg_out_err(): - ip = get_ipython() - ip.run_cell_magic( - "script", - f"--bg --out output --err error {sys.executable}", - "\n".join( - [ - "import sys", - "print('hi')", - "print('hello', file=sys.stderr)", - ] - ), - ) - assert (await ip.user_ns["output"].read()).strip() == b"hi" - assert (await ip.user_ns["error"].read()).strip() == b"hello" - assert ip.user_ns["output"].at_eof() - assert ip.user_ns["error"].at_eof() - - -async def test_script_bg_proc(): - ip = get_ipython() - ip.run_cell_magic( - "script", - f"--bg --out output --proc p {sys.executable}", - "\n".join( - [ - "import sys", - "print('hi')", - "print('hello', file=sys.stderr)", - ] - ), - ) - p = ip.user_ns["p"] - await p.wait() - assert p.returncode == 0 - assert (await p.stdout.read()).strip() == b"hi" - # not captured, so empty - assert (await p.stderr.read()) == b"" - assert p.stdout.at_eof() - assert p.stderr.at_eof() - - -def test_script_defaults(): - ip = get_ipython() - for cmd in ['sh', 'bash', 'perl', 'ruby']: - try: - find_cmd(cmd) - except Exception: - pass - else: - assert cmd in ip.magics_manager.magics["cell"] - - -async def test_script_streams_continiously(capsys): - ip = get_ipython() - # Windows is slow to start up a thread on CI - is_windows = os.name == "nt" - step = 3 if is_windows else 1 - code = dedent( - f"""\ - import time - for _ in range(3): - time.sleep({step}) - print(".", flush=True, end="") - """ - ) - - def print_numbers(): - for i in range(3): - sleep(step) - print(i, flush=True, end="") - - thread = Thread(target=print_numbers) - thread.start() - sleep(step / 2) - ip.run_cell_magic("script", f"{sys.executable}", code) - thread.join() - - captured = capsys.readouterr() - # If the streaming was line-wise or broken - # we would get `012...` - assert captured.out == "0.1.2." - - -@magics_class -class FooFoo(Magics): - """class with both %foo and %%foo magics""" - @line_magic('foo') - def line_foo(self, line): - "I am line foo" - pass - - @cell_magic("foo") - def cell_foo(self, line, cell): - "I am cell foo, not line foo" - pass - -def test_line_cell_info(): - """%%foo and %foo magics are distinguishable to inspect""" - ip = get_ipython() - ip.magics_manager.register(FooFoo) - oinfo = ip.object_inspect("foo") - assert oinfo["found"] is True - assert oinfo["ismagic"] is True - - oinfo = ip.object_inspect("%%foo") - assert oinfo["found"] is True - assert oinfo["ismagic"] is True - assert oinfo["docstring"] == FooFoo.cell_foo.__doc__ - - oinfo = ip.object_inspect("%foo") - assert oinfo["found"] is True - assert oinfo["ismagic"] is True - assert oinfo["docstring"] == FooFoo.line_foo.__doc__ - - -def test_multiple_magics(): - ip = get_ipython() - foo1 = FooFoo(ip) - foo2 = FooFoo(ip) - mm = ip.magics_manager - mm.register(foo1) - assert mm.magics["line"]["foo"].__self__ is foo1 - mm.register(foo2) - assert mm.magics["line"]["foo"].__self__ is foo2 - - -def test_alias_magic(): - """Test %alias_magic.""" - ip = get_ipython() - mm = ip.magics_manager - - # Basic operation: both cell and line magics are created, if possible. - ip.run_line_magic("alias_magic", "timeit_alias timeit") - assert "timeit_alias" in mm.magics["line"] - assert "timeit_alias" in mm.magics["cell"] - - # --cell is specified, line magic not created. - ip.run_line_magic("alias_magic", "--cell timeit_cell_alias timeit") - assert "timeit_cell_alias" not in mm.magics["line"] - assert "timeit_cell_alias" in mm.magics["cell"] - - # Test that line alias is created successfully. - ip.run_line_magic("alias_magic", "--line env_alias env") - assert ip.run_line_magic("env", "") == ip.run_line_magic("env_alias", "") - - # Test that line alias with parameters passed in is created successfully. - ip.run_line_magic( - "alias_magic", "--line history_alias history --params " + shlex.quote("3") - ) - assert "history_alias" in mm.magics["line"] - - -def test_save(): - """Test %save.""" - ip = get_ipython() - ip.history_manager.reset() # Clear any existing history. - cmds = ["a=1", "def b():\n return a**2", "print(a, b())"] - for i, cmd in enumerate(cmds, start=1): - ip.history_manager.store_inputs(i, cmd) - with TemporaryDirectory() as tmpdir: - file = os.path.join(tmpdir, "testsave.py") - ip.run_line_magic("save", "%s 1-10" % file) - content = Path(file).read_text(encoding="utf-8") - assert content.count(cmds[0]) == 1 - assert "coding: utf-8" in content - ip.run_line_magic("save", "-a %s 1-10" % file) - content = Path(file).read_text(encoding="utf-8") - assert content.count(cmds[0]) == 2 - assert "coding: utf-8" in content - - -def test_save_with_no_args(): - ip = get_ipython() - ip.history_manager.reset() # Clear any existing history. - cmds = ["a=1", "def b():\n return a**2", "print(a, b())", "%save"] - for i, cmd in enumerate(cmds, start=1): - ip.history_manager.store_inputs(i, cmd) - - with TemporaryDirectory() as tmpdir: - path = os.path.join(tmpdir, "testsave.py") - ip.run_line_magic("save", path) - content = Path(path).read_text(encoding="utf-8") - expected_content = dedent( - """\ - # coding: utf-8 - a=1 - def b(): - return a**2 - print(a, b()) - """ - ) - assert content == expected_content - - -def test_store(): - """Test %store.""" - ip = get_ipython() - ip.run_line_magic('load_ext', 'storemagic') - - # make sure the storage is empty - ip.run_line_magic("store", "-z") - ip.user_ns["var"] = 42 - ip.run_line_magic("store", "var") - ip.user_ns["var"] = 39 - ip.run_line_magic("store", "-r") - assert ip.user_ns["var"] == 42 - - ip.run_line_magic("store", "-d var") - ip.user_ns["var"] = 39 - ip.run_line_magic("store", "-r") - assert ip.user_ns["var"] == 39 - - -def _run_edit_test(arg_s, exp_filename=None, - exp_lineno=-1, - exp_contents=None, - exp_is_temp=None): - ip = get_ipython() - M = code.CodeMagics(ip) - last_call = ['',''] - opts,args = M.parse_options(arg_s,'prxn:') - filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call) - - if exp_filename is not None: - assert exp_filename == filename - if exp_contents is not None: - with io.open(filename, 'r', encoding='utf-8') as f: - contents = f.read() - assert exp_contents == contents - if exp_lineno != -1: - assert exp_lineno == lineno - if exp_is_temp is not None: - assert exp_is_temp == is_temp - - -def test_edit_interactive(): - """%edit on interactively defined objects""" - ip = get_ipython() - n = ip.execution_count - ip.run_cell("def foo(): return 1", store_history=True) - - with pytest.raises(code.InteractivelyDefined) as e: - _run_edit_test("foo") - assert e.value.index == n - - -def test_edit_cell(): - """%edit [cell id]""" - ip = get_ipython() - - ip.run_cell("def foo(): return 1", store_history=True) - - # test - _run_edit_test("1", exp_contents=ip.user_ns['In'][1], exp_is_temp=True) - -def test_edit_fname(): - """%edit file""" - # test - _run_edit_test("test file.py", exp_filename="test file.py") - -def test_bookmark(): - ip = get_ipython() - ip.run_line_magic('bookmark', 'bmname') - with tt.AssertPrints('bmname'): - ip.run_line_magic('bookmark', '-l') - ip.run_line_magic('bookmark', '-d bmname') - -def test_ls_magic(): - ip = get_ipython() - json_formatter = ip.display_formatter.formatters['application/json'] - json_formatter.enabled = True - lsmagic = ip.run_line_magic("lsmagic", "") - with warnings.catch_warnings(record=True) as w: - j = json_formatter(lsmagic) - assert sorted(j) == ["cell", "line"] - assert w == [] # no warnings - - -def test_strip_initial_indent(): - def sii(s): - lines = s.splitlines() - return '\n'.join(code.strip_initial_indent(lines)) - - assert sii(" a = 1\nb = 2") == "a = 1\nb = 2" - assert sii(" a\n b\nc") == "a\n b\nc" - assert sii("a\n b") == "a\n b" - -def test_logging_magic_quiet_from_arg(): - _ip.config.LoggingMagics.quiet = False - lm = logging.LoggingMagics(shell=_ip) - with TemporaryDirectory() as td: - try: - with tt.AssertNotPrints(re.compile("Activating.*")): - lm.logstart('-q {}'.format( - os.path.join(td, "quiet_from_arg.log"))) - finally: - _ip.logger.logstop() - -def test_logging_magic_quiet_from_config(): - _ip.config.LoggingMagics.quiet = True - lm = logging.LoggingMagics(shell=_ip) - with TemporaryDirectory() as td: - try: - with tt.AssertNotPrints(re.compile("Activating.*")): - lm.logstart(os.path.join(td, "quiet_from_config.log")) - finally: - _ip.logger.logstop() - - -def test_logging_magic_not_quiet(): - _ip.config.LoggingMagics.quiet = False - lm = logging.LoggingMagics(shell=_ip) - with TemporaryDirectory() as td: - try: - with tt.AssertPrints(re.compile("Activating.*")): - lm.logstart(os.path.join(td, "not_quiet.log")) - finally: - _ip.logger.logstop() - - -def test_time_no_var_expand(): - _ip.user_ns["a"] = 5 - _ip.user_ns["b"] = [] - _ip.run_line_magic("time", 'b.append("{a}")') - assert _ip.user_ns["b"] == ["{a}"] - - -# this is slow, put at the end for local testing. -def test_timeit_arguments(): - "Test valid timeit arguments, should not cause SyntaxError (GH #1269)" - _ip.run_line_magic("timeit", "-n1 -r1 a=('#')") - - -MINIMAL_LAZY_MAGIC = """ -from IPython.core.magic import ( - Magics, - magics_class, - line_magic, - cell_magic, -) - - -@magics_class -class LazyMagics(Magics): - @line_magic - def lazy_line(self, line): - print("Lazy Line") - - @cell_magic - def lazy_cell(self, line, cell): - print("Lazy Cell") - - -def load_ipython_extension(ipython): - ipython.register_magics(LazyMagics) -""" - - -def test_lazy_magics(): - with pytest.raises(UsageError): - ip.run_line_magic("lazy_line", "") - - startdir = os.getcwd() - - with TemporaryDirectory() as tmpdir: - with prepended_to_syspath(tmpdir): - ptempdir = Path(tmpdir) - tf = ptempdir / "lazy_magic_module.py" - tf.write_text(MINIMAL_LAZY_MAGIC) - ip.magics_manager.register_lazy("lazy_line", Path(tf.name).name[:-3]) - with tt.AssertPrints("Lazy Line"): - ip.run_line_magic("lazy_line", "") - - -TEST_MODULE = """ -print('Loaded my_tmp') -if __name__ == "__main__": - print('I just ran a script') -""" - -def test_run_module_from_import_hook(): - "Test that a module can be loaded via an import hook" - with TemporaryDirectory() as tmpdir: - fullpath = os.path.join(tmpdir, "my_tmp.py") - Path(fullpath).write_text(TEST_MODULE, encoding="utf-8") - - import importlib.abc - import importlib.util - - class MyTempImporter(importlib.abc.MetaPathFinder, importlib.abc.SourceLoader): - def find_spec(self, fullname, path, target=None): - if fullname == "my_tmp": - return importlib.util.spec_from_loader(fullname, self) - - def get_filename(self, fullname): - assert fullname == "my_tmp" - return fullpath - - def get_data(self, path): - assert Path(path).samefile(fullpath) - return Path(fullpath).read_text(encoding="utf-8") - - sys.meta_path.insert(0, MyTempImporter()) - - with capture_output() as captured: - _ip.run_line_magic("run", "-m my_tmp") - _ip.run_cell("import my_tmp") - - output = "Loaded my_tmp\nI just ran a script\nLoaded my_tmp\n" - assert output == captured.stdout - - sys.meta_path.pop(0) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_arguments.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_arguments.py deleted file mode 100644 index 0044163..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_arguments.py +++ /dev/null @@ -1,142 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (C) 2010-2011, IPython Development Team. -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -import argparse -import sys - -from IPython.core.magic_arguments import (argument, argument_group, kwds, - magic_arguments, parse_argstring, real_name) - -LEADING_SPACE = "" if sys.version_info > (3, 13) else " " - - -@magic_arguments() -@argument('-f', '--foo', help="an argument") -def magic_foo1(self, args): - """ A docstring. - """ - return parse_argstring(magic_foo1, args) - - -@magic_arguments() -def magic_foo2(self, args): - """ A docstring. - """ - return parse_argstring(magic_foo2, args) - - -@magic_arguments() -@argument('-f', '--foo', help="an argument") -@argument_group('Group') -@argument('-b', '--bar', help="a grouped argument") -@argument_group('Second Group') -@argument('-z', '--baz', help="another grouped argument") -def magic_foo3(self, args): - """ A docstring. - """ - return parse_argstring(magic_foo3, args) - - -@magic_arguments() -@kwds(argument_default=argparse.SUPPRESS) -@argument('-f', '--foo', help="an argument") -def magic_foo4(self, args): - """ A docstring. - """ - return parse_argstring(magic_foo4, args) - - -@magic_arguments('frobnicate') -@argument('-f', '--foo', help="an argument") -def magic_foo5(self, args): - """ A docstring. - """ - return parse_argstring(magic_foo5, args) - - -@magic_arguments() -@argument('-f', '--foo', help="an argument") -def magic_magic_foo(self, args): - """ A docstring. - """ - return parse_argstring(magic_magic_foo, args) - - -@magic_arguments() -@argument('-f', '--foo', help="an argument") -def foo(self, args): - """ A docstring. - """ - return parse_argstring(foo, args) - - -def test_magic_arguments(): - # “optional arguments†was replaced with “options†in argparse help - # https://docs.python.org/3/whatsnew/3.10.html#argparse - # https://bugs.python.org/issue9694 - options = "optional arguments" if sys.version_info < (3, 10) else "options" - - assert ( - magic_foo1.__doc__ - == f"::\n\n %foo1 [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" - ) - assert getattr(magic_foo1, "argcmd_name", None) == None - assert real_name(magic_foo1) == "foo1" - assert magic_foo1(None, "") == argparse.Namespace(foo=None) - assert hasattr(magic_foo1, "has_arguments") - - assert magic_foo2.__doc__ == f"::\n\n %foo2\n\n{LEADING_SPACE}A docstring.\n" - assert getattr(magic_foo2, "argcmd_name", None) == None - assert real_name(magic_foo2) == "foo2" - assert magic_foo2(None, "") == argparse.Namespace() - assert hasattr(magic_foo2, "has_arguments") - - assert ( - magic_foo3.__doc__ - == f"::\n\n %foo3 [-f FOO] [-b BAR] [-z BAZ]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n\nGroup:\n -b BAR, --bar BAR a grouped argument\n\nSecond Group:\n -z BAZ, --baz BAZ another grouped argument\n" - ) - assert getattr(magic_foo3, "argcmd_name", None) == None - assert real_name(magic_foo3) == "foo3" - assert magic_foo3(None, "") == argparse.Namespace(bar=None, baz=None, foo=None) - assert hasattr(magic_foo3, "has_arguments") - - assert ( - magic_foo4.__doc__ - == f"::\n\n %foo4 [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" - ) - assert getattr(magic_foo4, "argcmd_name", None) == None - assert real_name(magic_foo4) == "foo4" - assert magic_foo4(None, "") == argparse.Namespace() - assert hasattr(magic_foo4, "has_arguments") - - assert ( - magic_foo5.__doc__ - == f"::\n\n %frobnicate [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" - ) - assert getattr(magic_foo5, "argcmd_name", None) == "frobnicate" - assert real_name(magic_foo5) == "frobnicate" - assert magic_foo5(None, "") == argparse.Namespace(foo=None) - assert hasattr(magic_foo5, "has_arguments") - - assert ( - magic_magic_foo.__doc__ - == f"::\n\n %magic_foo [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" - ) - assert getattr(magic_magic_foo, "argcmd_name", None) == None - assert real_name(magic_magic_foo) == "magic_foo" - assert magic_magic_foo(None, "") == argparse.Namespace(foo=None) - assert hasattr(magic_magic_foo, "has_arguments") - - assert ( - foo.__doc__ - == f"::\n\n %foo [-f FOO]\n\n{LEADING_SPACE}A docstring.\n\n{options}:\n -f FOO, --foo FOO an argument\n" - ) - assert getattr(foo, "argcmd_name", None) == None - assert real_name(foo) == "foo" - assert foo(None, "") == argparse.Namespace(foo=None) - assert hasattr(foo, "has_arguments") diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_terminal.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_terminal.py deleted file mode 100644 index 5dfa0f0..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_magic_terminal.py +++ /dev/null @@ -1,216 +0,0 @@ -"""Tests for various magic functions specific to the terminal frontend.""" - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -import sys -from io import StringIO -from unittest import TestCase - -from IPython.testing import tools as tt -#----------------------------------------------------------------------------- -# Test functions begin -#----------------------------------------------------------------------------- - - -MINIMAL_LAZY_MAGIC = """ -from IPython.core.magic import ( - Magics, - magics_class, - line_magic, - cell_magic, -) - - -@magics_class -class LazyMagics(Magics): - @line_magic - def lazy_line(self, line): - print("Lazy Line") - - @cell_magic - def lazy_cell(self, line, cell): - print("Lazy Cell") - - -def load_ipython_extension(ipython): - ipython.register_magics(LazyMagics) -""" - -def check_cpaste(code, should_fail=False): - """Execute code via 'cpaste' and ensure it was executed, unless - should_fail is set. - """ - ip.user_ns['code_ran'] = False - - src = StringIO() - src.write(code) - src.write('\n--\n') - src.seek(0) - - stdin_save = sys.stdin - sys.stdin = src - - try: - context = tt.AssertPrints if should_fail else tt.AssertNotPrints - with context("Traceback (most recent call last)"): - ip.run_line_magic("cpaste", "") - - if not should_fail: - assert ip.user_ns['code_ran'], "%r failed" % code - finally: - sys.stdin = stdin_save - -def test_cpaste(): - """Test cpaste magic""" - - def runf(): - """Marker function: sets a flag when executed. - """ - ip.user_ns['code_ran'] = True - return 'runf' # return string so '+ runf()' doesn't result in success - - tests = {'pass': ["runf()", - "In [1]: runf()", - "In [1]: if 1:\n ...: runf()", - "> > > runf()", - ">>> runf()", - " >>> runf()", - ], - - 'fail': ["1 + runf()", - "++ runf()", - ]} - - ip.user_ns['runf'] = runf - - for code in tests['pass']: - check_cpaste(code) - - for code in tests['fail']: - check_cpaste(code, should_fail=True) - - - -class PasteTestCase(TestCase): - """Multiple tests for clipboard pasting""" - - def paste(self, txt, flags='-q'): - """Paste input text, by default in quiet mode""" - ip.hooks.clipboard_get = lambda: txt - ip.run_line_magic("paste", flags) - - def setUp(self): - # Inject fake clipboard hook but save original so we can restore it later - self.original_clip = ip.hooks.clipboard_get - - def tearDown(self): - # Restore original hook - ip.hooks.clipboard_get = self.original_clip - - def test_paste(self): - ip.user_ns.pop("x", None) - self.paste("x = 1") - self.assertEqual(ip.user_ns["x"], 1) - ip.user_ns.pop("x") - - def test_paste_pyprompt(self): - ip.user_ns.pop("x", None) - self.paste(">>> x=2") - self.assertEqual(ip.user_ns["x"], 2) - ip.user_ns.pop("x") - - def test_paste_py_multi(self): - self.paste( - """ - >>> x = [1,2,3] - >>> y = [] - >>> for i in x: - ... y.append(i**2) - ... - """ - ) - self.assertEqual(ip.user_ns["x"], [1, 2, 3]) - self.assertEqual(ip.user_ns["y"], [1, 4, 9]) - - def test_paste_py_multi_r(self): - "Now, test that self.paste -r works" - self.test_paste_py_multi() - self.assertEqual(ip.user_ns.pop("x"), [1, 2, 3]) - self.assertEqual(ip.user_ns.pop("y"), [1, 4, 9]) - self.assertFalse("x" in ip.user_ns) - ip.run_line_magic("paste", "-r") - self.assertEqual(ip.user_ns["x"], [1, 2, 3]) - self.assertEqual(ip.user_ns["y"], [1, 4, 9]) - - def test_paste_email(self): - "Test pasting of email-quoted contents" - self.paste( - """\ - >> def foo(x): - >> return x + 1 - >> xx = foo(1.1)""" - ) - self.assertEqual(ip.user_ns["xx"], 2.1) - - def test_paste_email2(self): - "Email again; some programs add a space also at each quoting level" - self.paste( - """\ - > > def foo(x): - > > return x + 1 - > > yy = foo(2.1) """ - ) - self.assertEqual(ip.user_ns["yy"], 3.1) - - def test_paste_email_py(self): - "Email quoting of interactive input" - self.paste( - """\ - >> >>> def f(x): - >> ... return x+1 - >> ... - >> >>> zz = f(2.5) """ - ) - self.assertEqual(ip.user_ns["zz"], 3.5) - - def test_paste_echo(self): - "Also test self.paste echoing, by temporarily faking the writer" - w = StringIO() - old_write = sys.stdout.write - sys.stdout.write = w.write - code = """ - a = 100 - b = 200""" - try: - self.paste(code,'') - out = w.getvalue() - finally: - sys.stdout.write = old_write - self.assertEqual(ip.user_ns["a"], 100) - self.assertEqual(ip.user_ns["b"], 200) - assert out == code + "\n## -- End pasted text --\n" - - def test_paste_leading_commas(self): - "Test multiline strings with leading commas" - tm = ip.magics_manager.registry['TerminalMagics'] - s = '''\ -a = """ -,1,2,3 -"""''' - ip.user_ns.pop("foo", None) - tm.store_or_execute(s, "foo") - self.assertIn("foo", ip.user_ns) - - def test_paste_trailing_question(self): - "Test pasting sources with trailing question marks" - tm = ip.magics_manager.registry['TerminalMagics'] - s = '''\ -def funcfoo(): - if True: #am i true? - return 'fooresult' -''' - ip.user_ns.pop('funcfoo', None) - self.paste(s) - self.assertEqual(ip.user_ns["funcfoo"](), "fooresult") diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_oinspect.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_oinspect.py deleted file mode 100644 index ac7c365..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_oinspect.py +++ /dev/null @@ -1,589 +0,0 @@ -"""Tests for the object inspection functionality. -""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - - -from contextlib import contextmanager -from inspect import signature, Signature, Parameter -import inspect -import os -import pytest -import re -import sys - -from .. import oinspect - -from decorator import decorator - -from IPython.testing.tools import AssertPrints, AssertNotPrints -from IPython.utils.path import compress_user - - -#----------------------------------------------------------------------------- -# Globals and constants -#----------------------------------------------------------------------------- - -inspector = None - -def setup_module(): - global inspector - inspector = oinspect.Inspector() - - -class SourceModuleMainTest: - __module__ = "__main__" - - -#----------------------------------------------------------------------------- -# Local utilities -#----------------------------------------------------------------------------- - -# WARNING: since this test checks the line number where a function is -# defined, if any code is inserted above, the following line will need to be -# updated. Do NOT insert any whitespace between the next line and the function -# definition below. -THIS_LINE_NUMBER = 47 # Put here the actual number of this line - - -def test_find_source_lines(): - assert oinspect.find_source_lines(test_find_source_lines) == THIS_LINE_NUMBER + 3 - assert oinspect.find_source_lines(type) is None - assert oinspect.find_source_lines(SourceModuleMainTest) is None - assert oinspect.find_source_lines(SourceModuleMainTest()) is None - - -def test_getsource(): - assert oinspect.getsource(type) is None - assert oinspect.getsource(SourceModuleMainTest) is None - assert oinspect.getsource(SourceModuleMainTest()) is None - - -def test_inspect_getfile_raises_exception(): - """Check oinspect.find_file/getsource/find_source_lines expectations""" - with pytest.raises(TypeError): - inspect.getfile(type) - with pytest.raises(OSError): - inspect.getfile(SourceModuleMainTest) - - -# A couple of utilities to ensure these tests work the same from a source or a -# binary install -def pyfile(fname): - return os.path.normcase(re.sub('.py[co]$', '.py', fname)) - - -def match_pyfiles(f1, f2): - assert pyfile(f1) == pyfile(f2) - - -def test_find_file(): - match_pyfiles(oinspect.find_file(test_find_file), os.path.abspath(__file__)) - assert oinspect.find_file(type) is None - assert oinspect.find_file(SourceModuleMainTest) is None - assert oinspect.find_file(SourceModuleMainTest()) is None - - -def test_find_file_decorated1(): - - @decorator - def noop1(f): - def wrapper(*a, **kw): - return f(*a, **kw) - return wrapper - - @noop1 - def f(x): - "My docstring" - - match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__)) - assert f.__doc__ == "My docstring" - - -def test_find_file_decorated2(): - - @decorator - def noop2(f, *a, **kw): - return f(*a, **kw) - - @noop2 - @noop2 - @noop2 - def f(x): - "My docstring 2" - - match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__)) - assert f.__doc__ == "My docstring 2" - - -def test_find_file_magic(): - run = ip.find_line_magic('run') - assert oinspect.find_file(run) is not None - - -# A few generic objects we can then inspect in the tests below - -class Call(object): - """This is the class docstring.""" - - def __init__(self, x, y=1): - """This is the constructor docstring.""" - - def __call__(self, *a, **kw): - """This is the call docstring.""" - - def method(self, x, z=2): - """Some method's docstring""" - -class HasSignature(object): - """This is the class docstring.""" - __signature__ = Signature([Parameter('test', Parameter.POSITIONAL_OR_KEYWORD)]) - - def __init__(self, *args): - """This is the init docstring""" - - -class SimpleClass(object): - def method(self, x, z=2): - """Some method's docstring""" - - -class Awkward(object): - def __getattr__(self, name): - raise Exception(name) - -class NoBoolCall: - """ - callable with `__bool__` raising should still be inspect-able. - """ - - def __call__(self): - """does nothing""" - pass - - def __bool__(self): - """just raise NotImplemented""" - raise NotImplementedError('Must be implemented') - - -class SerialLiar(object): - """Attribute accesses always get another copy of the same class. - - unittest.mock.call does something similar, but it's not ideal for testing - as the failure mode is to eat all your RAM. This gives up after 10k levels. - """ - def __init__(self, max_fibbing_twig, lies_told=0): - if lies_told > 10000: - raise RuntimeError('Nose too long, honesty is the best policy') - self.max_fibbing_twig = max_fibbing_twig - self.lies_told = lies_told - max_fibbing_twig[0] = max(max_fibbing_twig[0], lies_told) - - def __getattr__(self, item): - return SerialLiar(self.max_fibbing_twig, self.lies_told + 1) - -#----------------------------------------------------------------------------- -# Tests -#----------------------------------------------------------------------------- - -def test_info(): - "Check that Inspector.info fills out various fields as expected." - i = inspector.info(Call, oname="Call") - assert i["type_name"] == "type" - expected_class = str(type(type)) # (Python 3) or - assert i["base_class"] == expected_class - assert re.search( - "", - i["string_form"], - ) - fname = __file__ - if fname.endswith(".pyc"): - fname = fname[:-1] - # case-insensitive comparison needed on some filesystems - # e.g. Windows: - assert i["file"].lower() == compress_user(fname).lower() - assert i["definition"] == None - assert i["docstring"] == Call.__doc__ - assert i["source"] == None - assert i["isclass"] is True - assert i["init_definition"] == "Call(x, y=1)" - assert i["init_docstring"] == Call.__init__.__doc__ - - i = inspector.info(Call, detail_level=1) - assert i["source"] is not None - assert i["docstring"] == None - - c = Call(1) - c.__doc__ = "Modified instance docstring" - i = inspector.info(c) - assert i["type_name"] == "Call" - assert i["docstring"] == "Modified instance docstring" - assert i["class_docstring"] == Call.__doc__ - assert i["init_docstring"] == Call.__init__.__doc__ - assert i["call_docstring"] == Call.__call__.__doc__ - - -def test_class_signature(): - info = inspector.info(HasSignature, "HasSignature") - assert info["init_definition"] == "HasSignature(test)" - assert info["init_docstring"] == HasSignature.__init__.__doc__ - - -def test_info_awkward(): - # Just test that this doesn't throw an error. - inspector.info(Awkward()) - -def test_bool_raise(): - inspector.info(NoBoolCall()) - -def test_info_serialliar(): - fib_tracker = [0] - inspector.info(SerialLiar(fib_tracker)) - - # Nested attribute access should be cut off at 100 levels deep to avoid - # infinite loops: https://github.com/ipython/ipython/issues/9122 - assert fib_tracker[0] < 9000 - -def support_function_one(x, y=2, *a, **kw): - """A simple function.""" - -def test_calldef_none(): - # We should ignore __call__ for all of these. - for obj in [support_function_one, SimpleClass().method, any, str.upper]: - i = inspector.info(obj) - assert i["call_def"] is None - - -def f_kwarg(pos, *, kwonly): - pass - -def test_definition_kwonlyargs(): - i = inspector.info(f_kwarg, oname="f_kwarg") # analysis:ignore - assert i["definition"] == "f_kwarg(pos, *, kwonly)" - - -def test_getdoc(): - class A(object): - """standard docstring""" - pass - - class B(object): - """standard docstring""" - def getdoc(self): - return "custom docstring" - - class C(object): - """standard docstring""" - def getdoc(self): - return None - - a = A() - b = B() - c = C() - - assert oinspect.getdoc(a) == "standard docstring" - assert oinspect.getdoc(b) == "custom docstring" - assert oinspect.getdoc(c) == "standard docstring" - - -def test_empty_property_has_no_source(): - i = inspector.info(property(), detail_level=1) - assert i["source"] is None - - -def test_property_sources(): - # A simple adder whose source and signature stays - # the same across Python distributions - def simple_add(a, b): - "Adds two numbers" - return a + b - - class A(object): - @property - def foo(self): - return 'bar' - - foo = foo.setter(lambda self, v: setattr(self, 'bar', v)) - - dname = property(oinspect.getdoc) - adder = property(simple_add) - - i = inspector.info(A.foo, detail_level=1) - assert "def foo(self):" in i["source"] - assert "lambda self, v:" in i["source"] - - i = inspector.info(A.dname, detail_level=1) - assert "def getdoc(obj)" in i["source"] - - i = inspector.info(A.adder, detail_level=1) - assert "def simple_add(a, b)" in i["source"] - - -def test_property_docstring_is_in_info_for_detail_level_0(): - class A(object): - @property - def foobar(self): - """This is `foobar` property.""" - pass - - ip.user_ns["a_obj"] = A() - assert ( - "This is `foobar` property." - == ip.object_inspect("a_obj.foobar", detail_level=0)["docstring"] - ) - - ip.user_ns["a_cls"] = A - assert ( - "This is `foobar` property." - == ip.object_inspect("a_cls.foobar", detail_level=0)["docstring"] - ) - - -def test_pdef(): - # See gh-1914 - def foo(): pass - inspector.pdef(foo, 'foo') - - -@contextmanager -def cleanup_user_ns(**kwargs): - """ - On exit delete all the keys that were not in user_ns before entering. - - It does not restore old values ! - - Parameters - ---------- - - **kwargs - used to update ip.user_ns - - """ - try: - known = set(ip.user_ns.keys()) - ip.user_ns.update(kwargs) - yield - finally: - added = set(ip.user_ns.keys()) - known - for k in added: - del ip.user_ns[k] - - -def test_pinfo_bool_raise(): - """ - Test that bool method is not called on parent. - """ - - class RaiseBool: - attr = None - - def __bool__(self): - raise ValueError("pinfo should not access this method") - - raise_bool = RaiseBool() - - with cleanup_user_ns(raise_bool=raise_bool): - ip._inspect("pinfo", "raise_bool.attr", detail_level=0) - - -def test_pinfo_getindex(): - def dummy(): - """ - MARKER - """ - - container = [dummy] - with cleanup_user_ns(container=container): - with AssertPrints("MARKER"): - ip._inspect("pinfo", "container[0]", detail_level=0) - assert "container" not in ip.user_ns.keys() - - -def test_qmark_getindex(): - def dummy(): - """ - MARKER 2 - """ - - container = [dummy] - with cleanup_user_ns(container=container): - with AssertPrints("MARKER 2"): - ip.run_cell("container[0]?") - assert "container" not in ip.user_ns.keys() - - -def test_qmark_getindex_negatif(): - def dummy(): - """ - MARKER 3 - """ - - container = [dummy] - with cleanup_user_ns(container=container): - with AssertPrints("MARKER 3"): - ip.run_cell("container[-1]?") - assert "container" not in ip.user_ns.keys() - - - -def test_pinfo_nonascii(): - # See gh-1177 - from . import nonascii2 - ip.user_ns['nonascii2'] = nonascii2 - ip._inspect('pinfo', 'nonascii2', detail_level=1) - -def test_pinfo_type(): - """ - type can fail in various edge case, for example `type.__subclass__()` - """ - ip._inspect('pinfo', 'type') - - -def test_pinfo_docstring_no_source(): - """Docstring should be included with detail_level=1 if there is no source""" - with AssertPrints('Docstring:'): - ip._inspect('pinfo', 'str.format', detail_level=0) - with AssertPrints('Docstring:'): - ip._inspect('pinfo', 'str.format', detail_level=1) - - -def test_pinfo_no_docstring_if_source(): - """Docstring should not be included with detail_level=1 if source is found""" - def foo(): - """foo has a docstring""" - - ip.user_ns['foo'] = foo - - with AssertPrints('Docstring:'): - ip._inspect('pinfo', 'foo', detail_level=0) - with AssertPrints('Source:'): - ip._inspect('pinfo', 'foo', detail_level=1) - with AssertNotPrints('Docstring:'): - ip._inspect('pinfo', 'foo', detail_level=1) - - -def test_pinfo_docstring_if_detail_and_no_source(): - """ Docstring should be displayed if source info not available """ - obj_def = '''class Foo(object): - """ This is a docstring for Foo """ - def bar(self): - """ This is a docstring for Foo.bar """ - pass - ''' - - ip.run_cell(obj_def) - ip.run_cell('foo = Foo()') - - with AssertNotPrints("Source:"): - with AssertPrints('Docstring:'): - ip._inspect('pinfo', 'foo', detail_level=0) - with AssertPrints('Docstring:'): - ip._inspect('pinfo', 'foo', detail_level=1) - with AssertPrints('Docstring:'): - ip._inspect('pinfo', 'foo.bar', detail_level=0) - - with AssertNotPrints('Docstring:'): - with AssertPrints('Source:'): - ip._inspect('pinfo', 'foo.bar', detail_level=1) - - -@pytest.mark.xfail( - sys.version_info.releaselevel not in ("final", "candidate"), - reason="fails on 3.13.dev", - strict=True, -) -def test_pinfo_docstring_dynamic(capsys): - obj_def = """class Bar: - __custom_documentations__ = { - "prop" : "cdoc for prop", - "non_exist" : "cdoc for non_exist", - } - @property - def prop(self): - ''' - Docstring for prop - ''' - return self._prop - - @prop.setter - def prop(self, v): - self._prop = v - """ - ip.run_cell(obj_def) - - ip.run_cell("b = Bar()") - - ip.run_line_magic("pinfo", "b.prop") - captured = capsys.readouterr() - assert re.search(r"Docstring:\s+cdoc for prop", captured.out) - - ip.run_line_magic("pinfo", "b.non_exist") - captured = capsys.readouterr() - assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out) - - ip.run_cell("b.prop?") - captured = capsys.readouterr() - assert re.search(r"Docstring:\s+cdoc for prop", captured.out) - - ip.run_cell("b.non_exist?") - captured = capsys.readouterr() - assert re.search(r"Docstring:\s+cdoc for non_exist", captured.out) - - ip.run_cell("b.undefined?") - captured = capsys.readouterr() - assert re.search(r"Type:\s+NoneType", captured.out) - - -def test_pinfo_magic(): - with AssertPrints("Docstring:"): - ip._inspect("pinfo", "lsmagic", detail_level=0) - - with AssertPrints("Source:"): - ip._inspect("pinfo", "lsmagic", detail_level=1) - - -def test_init_colors(): - # ensure colors are not present in signature info - info = inspector.info(HasSignature) - init_def = info["init_definition"] - assert "[0m" not in init_def - - -def test_builtin_init(): - info = inspector.info(list) - init_def = info['init_definition'] - assert init_def is not None - - -def test_render_signature_short(): - def short_fun(a=1): pass - sig = oinspect._render_signature( - signature(short_fun), - short_fun.__name__, - ) - assert sig == "short_fun(a=1)" - - -def test_render_signature_long(): - from typing import Optional - - def long_function( - a_really_long_parameter: int, - and_another_long_one: bool = False, - let_us_make_sure_this_is_looong: Optional[str] = None, - ) -> bool: pass - - sig = oinspect._render_signature( - signature(long_function), - long_function.__name__, - ) - expected = """\ -long_function( - a_really_long_parameter: int, - and_another_long_one: bool = False, - let_us_make_sure_this_is_looong: Optional[str] = None, -) -> bool\ -""" - - assert sig == expected diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_page.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_page.py deleted file mode 100644 index 9f6a374..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_page.py +++ /dev/null @@ -1,20 +0,0 @@ -#----------------------------------------------------------------------------- -# Copyright (C) 2010-2011 The IPython Development Team. -# -# Distributed under the terms of the BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- -import io - -# N.B. For the test suite, page.page is overridden (see IPython.testing.globalipapp) -from IPython.core import page - -def test_detect_screen_size(): - """Simple smoketest for page._detect_screen_size.""" - try: - page._detect_screen_size(True, 25) - except (TypeError, io.UnsupportedOperation): - # This can happen in the test suite, because stdout may not have a - # fileno. - pass diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_paths.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_paths.py deleted file mode 100644 index 8e4a63f..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_paths.py +++ /dev/null @@ -1,202 +0,0 @@ -import errno -import os -import shutil -import tempfile -import warnings -from unittest.mock import patch - -from tempfile import TemporaryDirectory -from testpath import assert_isdir, assert_isfile, modified_env - -from IPython import paths -from IPython.testing.decorators import skip_win32 - -TMP_TEST_DIR = os.path.realpath(tempfile.mkdtemp()) -HOME_TEST_DIR = os.path.join(TMP_TEST_DIR, "home_test_dir") -XDG_TEST_DIR = os.path.join(HOME_TEST_DIR, "xdg_test_dir") -XDG_CACHE_DIR = os.path.join(HOME_TEST_DIR, "xdg_cache_dir") -IP_TEST_DIR = os.path.join(HOME_TEST_DIR,'.ipython') - -def setup_module(): - """Setup testenvironment for the module: - - - Adds dummy home dir tree - """ - # Do not mask exceptions here. In particular, catching WindowsError is a - # problem because that exception is only defined on Windows... - os.makedirs(IP_TEST_DIR) - os.makedirs(os.path.join(XDG_TEST_DIR, 'ipython')) - os.makedirs(os.path.join(XDG_CACHE_DIR, 'ipython')) - - -def teardown_module(): - """Teardown testenvironment for the module: - - - Remove dummy home dir tree - """ - # Note: we remove the parent test dir, which is the root of all test - # subdirs we may have created. Use shutil instead of os.removedirs, so - # that non-empty directories are all recursively removed. - shutil.rmtree(TMP_TEST_DIR) - -def patch_get_home_dir(dirpath): - return patch.object(paths, 'get_home_dir', return_value=dirpath) - - -def test_get_ipython_dir_1(): - """test_get_ipython_dir_1, Testcase to see if we can call get_ipython_dir without Exceptions.""" - env_ipdir = os.path.join("someplace", ".ipython") - with patch.object(paths, '_writable_dir', return_value=True), \ - modified_env({'IPYTHONDIR': env_ipdir}): - ipdir = paths.get_ipython_dir() - - assert ipdir == env_ipdir - -def test_get_ipython_dir_2(): - """test_get_ipython_dir_2, Testcase to see if we can call get_ipython_dir without Exceptions.""" - with patch_get_home_dir('someplace'), \ - patch.object(paths, 'get_xdg_dir', return_value=None), \ - patch.object(paths, '_writable_dir', return_value=True), \ - patch('os.name', "posix"), \ - modified_env({'IPYTHON_DIR': None, - 'IPYTHONDIR': None, - 'XDG_CONFIG_HOME': None - }): - ipdir = paths.get_ipython_dir() - - assert ipdir == os.path.join("someplace", ".ipython") - -def test_get_ipython_dir_3(): - """test_get_ipython_dir_3, use XDG if defined and exists, and .ipython doesn't exist.""" - tmphome = TemporaryDirectory() - try: - with patch_get_home_dir(tmphome.name), \ - patch('os.name', 'posix'), \ - modified_env({ - 'IPYTHON_DIR': None, - 'IPYTHONDIR': None, - 'XDG_CONFIG_HOME': XDG_TEST_DIR, - }), warnings.catch_warnings(record=True) as w: - ipdir = paths.get_ipython_dir() - - assert ipdir == os.path.join(tmphome.name, XDG_TEST_DIR, "ipython") - assert len(w) == 0 - finally: - tmphome.cleanup() - -def test_get_ipython_dir_4(): - """test_get_ipython_dir_4, warn if XDG and home both exist.""" - with patch_get_home_dir(HOME_TEST_DIR), \ - patch('os.name', 'posix'): - try: - os.mkdir(os.path.join(XDG_TEST_DIR, 'ipython')) - except OSError as e: - if e.errno != errno.EEXIST: - raise - - - with modified_env({ - 'IPYTHON_DIR': None, - 'IPYTHONDIR': None, - 'XDG_CONFIG_HOME': XDG_TEST_DIR, - }), warnings.catch_warnings(record=True) as w: - ipdir = paths.get_ipython_dir() - - assert len(w) == 1 - assert "Ignoring" in str(w[0]) - - -def test_get_ipython_dir_5(): - """test_get_ipython_dir_5, use .ipython if exists and XDG defined, but doesn't exist.""" - with patch_get_home_dir(HOME_TEST_DIR), \ - patch('os.name', 'posix'): - try: - os.rmdir(os.path.join(XDG_TEST_DIR, 'ipython')) - except OSError as e: - if e.errno != errno.ENOENT: - raise - - with modified_env({ - 'IPYTHON_DIR': None, - 'IPYTHONDIR': None, - 'XDG_CONFIG_HOME': XDG_TEST_DIR, - }): - ipdir = paths.get_ipython_dir() - - assert ipdir == IP_TEST_DIR - -def test_get_ipython_dir_6(): - """test_get_ipython_dir_6, use home over XDG if defined and neither exist.""" - xdg = os.path.join(HOME_TEST_DIR, 'somexdg') - os.mkdir(xdg) - shutil.rmtree(os.path.join(HOME_TEST_DIR, '.ipython')) - print(paths._writable_dir) - with patch_get_home_dir(HOME_TEST_DIR), \ - patch.object(paths, 'get_xdg_dir', return_value=xdg), \ - patch('os.name', 'posix'), \ - modified_env({ - 'IPYTHON_DIR': None, - 'IPYTHONDIR': None, - 'XDG_CONFIG_HOME': None, - }), warnings.catch_warnings(record=True) as w: - ipdir = paths.get_ipython_dir() - - assert ipdir == os.path.join(HOME_TEST_DIR, ".ipython") - assert len(w) == 0 - -def test_get_ipython_dir_7(): - """test_get_ipython_dir_7, test home directory expansion on IPYTHONDIR""" - home_dir = os.path.normpath(os.path.expanduser('~')) - with modified_env({'IPYTHONDIR': os.path.join('~', 'somewhere')}), \ - patch.object(paths, '_writable_dir', return_value=True): - ipdir = paths.get_ipython_dir() - assert ipdir == os.path.join(home_dir, "somewhere") - - -@skip_win32 -def test_get_ipython_dir_8(): - """test_get_ipython_dir_8, test / home directory""" - if not os.access("/", os.W_OK): - # test only when HOME directory actually writable - return - - with ( - patch.object(paths, "_writable_dir", lambda path: bool(path)), - patch.object(paths, "get_xdg_dir", return_value=None), - modified_env( - { - "IPYTHON_DIR": None, - "IPYTHONDIR": None, - "HOME": "/", - } - ), - ): - assert paths.get_ipython_dir() == "/.ipython" - - -def test_get_ipython_cache_dir(): - with modified_env({'HOME': HOME_TEST_DIR}): - if os.name == "posix": - # test default - os.makedirs(os.path.join(HOME_TEST_DIR, ".cache")) - with modified_env({'XDG_CACHE_HOME': None}): - ipdir = paths.get_ipython_cache_dir() - assert os.path.join(HOME_TEST_DIR, ".cache", "ipython") == ipdir - assert_isdir(ipdir) - - # test env override - with modified_env({"XDG_CACHE_HOME": XDG_CACHE_DIR}): - ipdir = paths.get_ipython_cache_dir() - assert_isdir(ipdir) - assert ipdir == os.path.join(XDG_CACHE_DIR, "ipython") - else: - assert paths.get_ipython_cache_dir() == paths.get_ipython_dir() - -def test_get_ipython_package_dir(): - ipdir = paths.get_ipython_package_dir() - assert_isdir(ipdir) - - -def test_get_ipython_module_path(): - ipapp_path = paths.get_ipython_module_path('IPython.terminal.ipapp') - assert_isfile(ipapp_path) diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prefilter.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prefilter.py deleted file mode 100644 index 379a530..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prefilter.py +++ /dev/null @@ -1,149 +0,0 @@ -"""Tests for input manipulation machinery.""" - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- -import pytest - -from IPython.core.prefilter import AutocallChecker - -#----------------------------------------------------------------------------- -# Tests -#----------------------------------------------------------------------------- - -def test_prefilter(): - """Test user input conversions""" - - # pairs of (raw, expected correct) input - pairs = [ ('2+2','2+2'), - ] - - for raw, correct in pairs: - assert ip.prefilter(raw) == correct - -def test_prefilter_shadowed(): - def dummy_magic(line): pass - - prev_automagic_state = ip.automagic - ip.automagic = True - ip.autocall = 0 - - try: - # These should not be transformed - they are shadowed by other names - for name in ['if', 'zip', 'get_ipython']: # keyword, builtin, global - ip.register_magic_function(dummy_magic, magic_name=name) - res = ip.prefilter(name + " foo") - assert res == name + " foo" - del ip.magics_manager.magics["line"][name] - - # These should be transformed - for name in ['fi', 'piz', 'nohtypi_teg']: - ip.register_magic_function(dummy_magic, magic_name=name) - res = ip.prefilter(name + " foo") - assert res != name + " foo" - del ip.magics_manager.magics["line"][name] - - finally: - ip.automagic = prev_automagic_state - -def test_autocall_binops(): - """See https://github.com/ipython/ipython/issues/81""" - ip.run_line_magic("autocall", "2") - f = lambda x: x - ip.user_ns['f'] = f - try: - assert ip.prefilter("f 1") == "f(1)" - for t in ["f +1", "f -1"]: - assert ip.prefilter(t) == t - - # Run tests again with a more permissive exclude_regexp, which will - # allow transformation of binary operations ('f -1' -> 'f(-1)'). - pm = ip.prefilter_manager - ac = AutocallChecker(shell=pm.shell, prefilter_manager=pm, - config=pm.config) - try: - ac.priority = 1 - ac.exclude_regexp = r'^[,&^\|\*/]|^is |^not |^in |^and |^or ' - pm.sort_checkers() - - assert ip.prefilter("f -1") == "f(-1)" - assert ip.prefilter("f +1") == "f(+1)" - finally: - pm.unregister_checker(ac) - finally: - ip.run_line_magic("autocall", "0") - del ip.user_ns["f"] - - -def test_issue_114(): - """Check that multiline string literals don't expand as magic - see http://github.com/ipython/ipython/issues/114""" - - template = '"""\n%s\n"""' - # Store the current value of multi_line_specials and turn it off before - # running test, since it could be true (case in which the test doesn't make - # sense, as multiline string literals *will* expand as magic in that case). - msp = ip.prefilter_manager.multi_line_specials - ip.prefilter_manager.multi_line_specials = False - try: - for mgk in ip.magics_manager.lsmagic()['line']: - raw = template % mgk - assert ip.prefilter(raw) == raw - finally: - ip.prefilter_manager.multi_line_specials = msp - - -def test_prefilter_attribute_errors(): - """Capture exceptions thrown by user objects on attribute access. - - See http://github.com/ipython/ipython/issues/988.""" - - class X(object): - def __getattr__(self, k): - raise ValueError('broken object') - def __call__(self, x): - return x - - # Create a callable broken object - ip.user_ns["x"] = X() - ip.run_line_magic("autocall", "2") - try: - # Even if x throws an attribute error when looking at its rewrite - # attribute, we should not crash. So the test here is simply making - # the prefilter call and not having an exception. - ip.prefilter('x 1') - finally: - del ip.user_ns["x"] - ip.run_line_magic("autocall", "0") - - -def test_autocall_type_ann(): - ip.run_cell("import collections.abc") - ip.run_line_magic("autocall", "1") - try: - assert ( - ip.prefilter("collections.abc.Callable[[int], None]") - == "collections.abc.Callable[[int], None]" - ) - finally: - ip.run_line_magic("autocall", "0") - - -def test_autocall_should_support_unicode(): - ip.run_line_magic("autocall", "2") - ip.user_ns["π"] = lambda x: x - try: - assert ip.prefilter("π 3") == "π(3)" - finally: - ip.run_line_magic("autocall", "0") - del ip.user_ns["π"] - - -def test_autocall_regression_gh_14513(): - ip.run_line_magic("autocall", "2") - ip.user_ns["foo"] = dict() - try: - assert ip.prefilter("foo") == "foo" - finally: - ip.run_line_magic("autocall", "0") - del ip.user_ns["foo"] diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_profile.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_profile.py deleted file mode 100644 index 8e03b5a..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_profile.py +++ /dev/null @@ -1,161 +0,0 @@ -# coding: utf-8 -"""Tests for profile-related functions. - -Currently only the startup-dir functionality is tested, but more tests should -be added for: - - * ipython profile create - * ipython profile list - * ipython profile create --parallel - * security dir permissions - -Authors -------- - -* MinRK - -""" - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -import shutil -import sys -import tempfile -from pathlib import Path -from tempfile import TemporaryDirectory -from unittest import TestCase - -import pytest - -from IPython.core.profileapp import list_bundled_profiles, list_profiles_in -from IPython.core.profiledir import ProfileDir -from IPython.testing import decorators as dec -from IPython.testing import tools as tt -from IPython.utils.process import getoutput - -#----------------------------------------------------------------------------- -# Globals -#----------------------------------------------------------------------------- -TMP_TEST_DIR = Path(tempfile.mkdtemp()) -HOME_TEST_DIR = TMP_TEST_DIR / "home_test_dir" -IP_TEST_DIR = HOME_TEST_DIR / ".ipython" - -# -# Setup/teardown functions/decorators -# - -def setup_module(): - """Setup test environment for the module: - - - Adds dummy home dir tree - """ - # Do not mask exceptions here. In particular, catching WindowsError is a - # problem because that exception is only defined on Windows... - (Path.cwd() / IP_TEST_DIR).mkdir(parents=True) - - -def teardown_module(): - """Teardown test environment for the module: - - - Remove dummy home dir tree - """ - # Note: we remove the parent test dir, which is the root of all test - # subdirs we may have created. Use shutil instead of os.removedirs, so - # that non-empty directories are all recursively removed. - shutil.rmtree(TMP_TEST_DIR) - - -#----------------------------------------------------------------------------- -# Test functions -#----------------------------------------------------------------------------- -class ProfileStartupTest(TestCase): - def setUp(self): - # create profile dir - self.pd = ProfileDir.create_profile_dir_by_name(IP_TEST_DIR, "test") - self.options = ["--ipython-dir", IP_TEST_DIR, "--profile", "test"] - self.fname = TMP_TEST_DIR / "test.py" - - def tearDown(self): - # We must remove this profile right away so its presence doesn't - # confuse other tests. - shutil.rmtree(self.pd.location) - - def init(self, startup_file, startup, test): - # write startup python file - with open(Path(self.pd.startup_dir) / startup_file, "w", encoding="utf-8") as f: - f.write(startup) - # write simple test file, to check that the startup file was run - with open(self.fname, "w", encoding="utf-8") as f: - f.write(test) - - def validate(self, output): - tt.ipexec_validate(self.fname, output, "", options=self.options) - - def test_startup_py(self): - self.init('00-start.py', 'zzz=123\n', 'print(zzz)\n') - self.validate('123') - - def test_startup_ipy(self): - self.init('00-start.ipy', '%xmode plain\n', '') - self.validate('Exception reporting mode: Plain') - - -@pytest.mark.skipif( - sys.implementation.name == "pypy" - and ((7, 3, 13) < sys.implementation.version < (7, 3, 16)), - reason="Unicode issues with scandir on PyPy, see https://github.com/pypy/pypy/issues/4860", -) -def test_list_profiles_in(): - # No need to remove these directories and files, as they will get nuked in - # the module-level teardown. - td = Path(tempfile.mkdtemp(dir=TMP_TEST_DIR)) - for name in ("profile_foo", "profile_hello", "not_a_profile"): - Path(td / name).mkdir(parents=True) - if dec.unicode_paths: - Path(td / "profile_ünicode").mkdir(parents=True) - - with open(td / "profile_file", "w", encoding="utf-8") as f: - f.write("I am not a profile directory") - profiles = list_profiles_in(td) - - # unicode normalization can turn u'ünicode' into u'u\0308nicode', - # so only check for *nicode, and that creating a ProfileDir from the - # name remains valid - found_unicode = False - for p in list(profiles): - if p.endswith('nicode'): - pd = ProfileDir.find_profile_dir_by_name(td, p) - profiles.remove(p) - found_unicode = True - break - if dec.unicode_paths: - assert found_unicode is True - assert set(profiles) == {"foo", "hello"} - - -def test_list_bundled_profiles(): - # This variable will need to be updated when a new profile gets bundled - bundled = sorted(list_bundled_profiles()) - assert bundled == [] - - -def test_profile_create_ipython_dir(): - """ipython profile create respects --ipython-dir""" - with TemporaryDirectory() as td: - getoutput( - [ - sys.executable, - "-m", - "IPython", - "profile", - "create", - "foo", - "--ipython-dir=%s" % td, - ] - ) - profile_dir = Path(td) / "profile_foo" - assert Path(profile_dir).exists() - ipython_config = profile_dir / "ipython_config.py" - assert Path(ipython_config).exists() diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prompts.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prompts.py deleted file mode 100644 index 95e6163..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_prompts.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -"""Tests for prompt generation.""" - -import unittest - -from IPython.core.prompts import LazyEvaluate - -class PromptTests(unittest.TestCase): - def test_lazy_eval_unicode(self): - u = u'ünicødé' - lz = LazyEvaluate(lambda : u) - self.assertEqual(str(lz), u) - self.assertEqual(format(lz), u) - - def test_lazy_eval_nonascii_bytes(self): - u = u'ünicødé' - b = u.encode('utf8') - lz = LazyEvaluate(lambda : b) - # unicode(lz) would fail - self.assertEqual(str(lz), str(b)) - self.assertEqual(format(lz), str(b)) - - def test_lazy_eval_float(self): - f = 0.503 - lz = LazyEvaluate(lambda : f) - - self.assertEqual(str(lz), str(f)) - self.assertEqual(format(lz), str(f)) - self.assertEqual(format(lz, '.1'), '0.5') - diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_pylabtools.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_pylabtools.py deleted file mode 100644 index 31d3dbe..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_pylabtools.py +++ /dev/null @@ -1,375 +0,0 @@ -"""Tests for pylab tools module. -""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - - -from binascii import a2b_base64 -from io import BytesIO - -import pytest - -matplotlib = pytest.importorskip("matplotlib") -matplotlib.use('Agg') -from matplotlib.figure import Figure - -from matplotlib import pyplot as plt -from matplotlib_inline import backend_inline -import numpy as np - -from IPython.core.getipython import get_ipython -from IPython.core.interactiveshell import InteractiveShell -from IPython.core.display import _PNG, _JPEG -from .. import pylabtools as pt - -from IPython.testing import decorators as dec - - -def test_figure_to_svg(): - # simple empty-figure test - fig = plt.figure() - assert pt.print_figure(fig, "svg") is None - - plt.close('all') - - # simple check for at least svg-looking output - fig = plt.figure() - ax = fig.add_subplot(1,1,1) - ax.plot([1,2,3]) - plt.draw() - svg = pt.print_figure(fig, "svg")[:100].lower() - assert "doctype svg" in svg - - -def _check_pil_jpeg_bytes(): - """Skip if PIL can't write JPEGs to BytesIO objects""" - # PIL's JPEG plugin can't write to BytesIO objects - # Pillow fixes this - from PIL import Image - buf = BytesIO() - img = Image.new("RGB", (4,4)) - try: - img.save(buf, 'jpeg') - except Exception as e: - ename = e.__class__.__name__ - raise pytest.skip("PIL can't write JPEG to BytesIO: %s: %s" % (ename, e)) from e - -@dec.skip_without("PIL.Image") -def test_figure_to_jpeg(): - _check_pil_jpeg_bytes() - # simple check for at least jpeg-looking output - fig = plt.figure() - ax = fig.add_subplot(1,1,1) - ax.plot([1,2,3]) - plt.draw() - jpeg = pt.print_figure(fig, 'jpeg', pil_kwargs={'optimize': 50})[:100].lower() - assert jpeg.startswith(_JPEG) - -def test_retina_figure(): - # simple empty-figure test - fig = plt.figure() - assert pt.retina_figure(fig) == None - plt.close('all') - - fig = plt.figure() - ax = fig.add_subplot(1,1,1) - ax.plot([1,2,3]) - plt.draw() - png, md = pt.retina_figure(fig) - assert png.startswith(_PNG) - assert "width" in md - assert "height" in md - - -_fmt_mime_map = { - 'png': 'image/png', - 'jpeg': 'image/jpeg', - 'pdf': 'application/pdf', - 'retina': 'image/png', - 'svg': 'image/svg+xml', -} - -def test_select_figure_formats_str(): - ip = get_ipython() - for fmt, active_mime in _fmt_mime_map.items(): - pt.select_figure_formats(ip, fmt) - for mime, f in ip.display_formatter.formatters.items(): - if mime == active_mime: - assert Figure in f - else: - assert Figure not in f - -def test_select_figure_formats_kwargs(): - ip = get_ipython() - kwargs = dict(bbox_inches="tight") - pt.select_figure_formats(ip, "png", **kwargs) - formatter = ip.display_formatter.formatters["image/png"] - f = formatter.lookup_by_type(Figure) - cell = f.keywords - expected = kwargs - expected["base64"] = True - expected["fmt"] = "png" - assert cell == expected - - # check that the formatter doesn't raise - fig = plt.figure() - ax = fig.add_subplot(1,1,1) - ax.plot([1,2,3]) - plt.draw() - formatter.enabled = True - png = formatter(fig) - assert isinstance(png, str) - png_bytes = a2b_base64(png) - assert png_bytes.startswith(_PNG) - -def test_select_figure_formats_set(): - ip = get_ipython() - for fmts in [ - {'png', 'svg'}, - ['png'], - ('jpeg', 'pdf', 'retina'), - {'svg'}, - ]: - active_mimes = {_fmt_mime_map[fmt] for fmt in fmts} - pt.select_figure_formats(ip, fmts) - for mime, f in ip.display_formatter.formatters.items(): - if mime in active_mimes: - assert Figure in f - else: - assert Figure not in f - -def test_select_figure_formats_bad(): - ip = get_ipython() - with pytest.raises(ValueError): - pt.select_figure_formats(ip, 'foo') - with pytest.raises(ValueError): - pt.select_figure_formats(ip, {'png', 'foo'}) - with pytest.raises(ValueError): - pt.select_figure_formats(ip, ['retina', 'pdf', 'bar', 'bad']) - -def test_import_pylab(): - ns = {} - pt.import_pylab(ns, import_all=False) - assert "plt" in ns - assert ns["np"] == np - - -class TestPylabSwitch(object): - class Shell(InteractiveShell): - def init_history(self): - """Sets up the command history, and starts regular autosaves.""" - self.config.HistoryManager.hist_file = ":memory:" - super().init_history() - - def enable_gui(self, gui): - pass - - def setup_method(self): - import matplotlib - def act_mpl(backend): - matplotlib.rcParams['backend'] = backend - - # Save rcParams since they get modified - self._saved_rcParams = matplotlib.rcParams - self._saved_rcParamsOrig = matplotlib.rcParamsOrig - matplotlib.rcParams = dict(backend="QtAgg") - matplotlib.rcParamsOrig = dict(backend="QtAgg") - - # Mock out functions - self._save_am = pt.activate_matplotlib - pt.activate_matplotlib = act_mpl - self._save_ip = pt.import_pylab - pt.import_pylab = lambda *a,**kw:None - self._save_cis = backend_inline.configure_inline_support - backend_inline.configure_inline_support = lambda *a, **kw: None - - def teardown_method(self): - pt.activate_matplotlib = self._save_am - pt.import_pylab = self._save_ip - backend_inline.configure_inline_support = self._save_cis - import matplotlib - matplotlib.rcParams = self._saved_rcParams - matplotlib.rcParamsOrig = self._saved_rcParamsOrig - - def test_qt(self): - s = self.Shell() - gui, backend = s.enable_matplotlib(None) - assert gui == "qt" - assert s.pylab_gui_select == "qt" - - gui, backend = s.enable_matplotlib("inline") - assert gui is None - assert s.pylab_gui_select == "qt" - - gui, backend = s.enable_matplotlib("qt") - assert gui == "qt" - assert s.pylab_gui_select == "qt" - - gui, backend = s.enable_matplotlib("inline") - assert gui is None - assert s.pylab_gui_select == "qt" - - gui, backend = s.enable_matplotlib() - assert gui == "qt" - assert s.pylab_gui_select == "qt" - - def test_inline(self): - s = self.Shell() - gui, backend = s.enable_matplotlib("inline") - assert gui is None - assert s.pylab_gui_select == None - - gui, backend = s.enable_matplotlib("inline") - assert gui is None - assert s.pylab_gui_select == None - - gui, backend = s.enable_matplotlib("qt") - assert gui == "qt" - assert s.pylab_gui_select == "qt" - - def test_inline_twice(self): - "Using '%matplotlib inline' twice should not reset formatters" - - ip = self.Shell() - gui, backend = ip.enable_matplotlib("inline") - assert gui is None - - fmts = {'png'} - active_mimes = {_fmt_mime_map[fmt] for fmt in fmts} - pt.select_figure_formats(ip, fmts) - - gui, backend = ip.enable_matplotlib("inline") - assert gui is None - - for mime, f in ip.display_formatter.formatters.items(): - if mime in active_mimes: - assert Figure in f - else: - assert Figure not in f - - def test_qt_gtk(self): - s = self.Shell() - gui, backend = s.enable_matplotlib("qt") - assert gui == "qt" - assert s.pylab_gui_select == "qt" - - gui, backend = s.enable_matplotlib("gtk3") - assert gui == "qt" - assert s.pylab_gui_select == "qt" - - @dec.skipif(not pt._matplotlib_manages_backends()) - def test_backend_module_name_case_sensitive(self): - # Matplotlib backend names are case insensitive unless explicitly specified using - # "module://some_module.some_name" syntax which are case sensitive for mpl >= 3.9.1 - all_lowercase = "module://matplotlib_inline.backend_inline" - some_uppercase = "module://matplotlib_inline.Backend_inline" - mpl3_9_1 = matplotlib.__version_info__ >= (3, 9, 1) - - s = self.Shell() - s.enable_matplotlib(all_lowercase) - if mpl3_9_1: - with pytest.raises(RuntimeError): - s.enable_matplotlib(some_uppercase) - else: - s.enable_matplotlib(some_uppercase) - - s.run_line_magic("matplotlib", all_lowercase) - if mpl3_9_1: - with pytest.raises(RuntimeError): - s.run_line_magic("matplotlib", some_uppercase) - else: - s.run_line_magic("matplotlib", some_uppercase) - - -def test_no_gui_backends(): - for k in ['agg', 'svg', 'pdf', 'ps']: - assert k not in pt.backend2gui - - -def test_figure_no_canvas(): - fig = Figure() - fig.canvas = None - pt.print_figure(fig) - - -@pytest.mark.parametrize( - "name, expected_gui, expected_backend", - [ - # name is gui - ("gtk3", "gtk3", "gtk3agg"), - ("gtk4", "gtk4", "gtk4agg"), - ("headless", None, "agg"), - ("osx", "osx", "macosx"), - ("qt", "qt", "qtagg"), - ("qt5", "qt5", "qt5agg"), - ("qt6", "qt6", "qtagg"), - ("tk", "tk", "tkagg"), - ("wx", "wx", "wxagg"), - # name is backend - ("agg", None, "agg"), - ("cairo", None, "cairo"), - ("pdf", None, "pdf"), - ("ps", None, "ps"), - ("svg", None, "svg"), - ("template", None, "template"), - ("gtk3agg", "gtk3", "gtk3agg"), - ("gtk3cairo", "gtk3", "gtk3cairo"), - ("gtk4agg", "gtk4", "gtk4agg"), - ("gtk4cairo", "gtk4", "gtk4cairo"), - ("macosx", "osx", "macosx"), - ("nbagg", "nbagg", "nbagg"), - ("notebook", "nbagg", "notebook"), - ("qtagg", "qt", "qtagg"), - ("qtcairo", "qt", "qtcairo"), - ("qt5agg", "qt5", "qt5agg"), - ("qt5cairo", "qt5", "qt5cairo"), - ("tkagg", "tk", "tkagg"), - ("tkcairo", "tk", "tkcairo"), - ("webagg", "webagg", "webagg"), - ("wxagg", "wx", "wxagg"), - ("wxcairo", "wx", "wxcairo"), - ], -) -def test_backend_builtin(name, expected_gui, expected_backend): - # Test correct identification of Matplotlib built-in backends without importing and using them, - # otherwise we would need to ensure all the complex dependencies such as windowing toolkits are - # installed. - - mpl_manages_backends = pt._matplotlib_manages_backends() - if not mpl_manages_backends: - # Backends not supported before _matplotlib_manages_backends or supported - # but with different expected_gui or expected_backend. - if ( - name.endswith("agg") - or name.endswith("cairo") - or name in ("headless", "macosx", "pdf", "ps", "svg", "template") - ): - pytest.skip() - elif name == "qt6": - expected_backend = "qtagg" - elif name == "notebook": - expected_backend, expected_gui = expected_gui, expected_backend - - gui, backend = pt.find_gui_and_backend(name) - if not mpl_manages_backends: - gui = gui.lower() if gui else None - backend = backend.lower() if backend else None - assert gui == expected_gui - assert backend == expected_backend - - -def test_backend_entry_point(): - gui, backend = pt.find_gui_and_backend("inline") - assert gui is None - expected_backend = ( - "inline" - if pt._matplotlib_manages_backends() - else "module://matplotlib_inline.backend_inline" - ) - assert backend == expected_backend - - -def test_backend_unknown(): - with pytest.raises(RuntimeError if pt._matplotlib_manages_backends() else KeyError): - pt.find_gui_and_backend("name-does-not-exist") diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_run.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_run.py deleted file mode 100644 index 971f8e3..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_run.py +++ /dev/null @@ -1,626 +0,0 @@ -# encoding: utf-8 -"""Tests for code execution (%run and related), which is particularly tricky. - -Because of how %run manages namespaces, and the fact that we are trying here to -verify subtle object deletion and reference counting issues, the %run tests -will be kept in this separate file. This makes it easier to aggregate in one -place the tricks needed to handle it; most other magics are much easier to test -and we do so in a common test_magic file. - -Note that any test using `run -i` should make sure to do a `reset` afterwards, -as otherwise it may influence later tests. -""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - - - -import functools -import os -import platform -import random -import string -import sys -import textwrap -import unittest -from os.path import join as pjoin -from unittest.mock import patch - -import pytest -from tempfile import TemporaryDirectory - -from IPython.core import debugger -from IPython.testing import decorators as dec -from IPython.testing import tools as tt -from IPython.utils.io import capture_output - - -def doctest_refbug(): - """Very nasty problem with references held by multiple runs of a script. - See: https://github.com/ipython/ipython/issues/141 - - In [1]: _ip.clear_main_mod_cache() - # random - - In [2]: %run refbug - - In [3]: call_f() - lowercased: hello - - In [4]: %run refbug - - In [5]: call_f() - lowercased: hello - lowercased: hello - """ - - -def doctest_run_builtins(): - r"""Check that %run doesn't damage __builtins__. - - In [1]: import tempfile - - In [2]: bid1 = id(__builtins__) - - In [3]: fname = tempfile.mkstemp('.py')[1] - - In [3]: f = open(fname, 'w', encoding='utf-8') - - In [4]: dummy= f.write('pass\n') - - In [5]: f.flush() - - In [6]: t1 = type(__builtins__) - - In [7]: %run $fname - - In [7]: f.close() - - In [8]: bid2 = id(__builtins__) - - In [9]: t2 = type(__builtins__) - - In [10]: t1 == t2 - Out[10]: True - - In [10]: bid1 == bid2 - Out[10]: True - - In [12]: try: - ....: os.unlink(fname) - ....: except: - ....: pass - ....: - """ - - -def doctest_run_option_parser(): - r"""Test option parser in %run. - - In [1]: %run print_argv.py - [] - - In [2]: %run print_argv.py print*.py - ['print_argv.py'] - - In [3]: %run -G print_argv.py print*.py - ['print*.py'] - - """ - - -@dec.skip_win32 -def doctest_run_option_parser_for_posix(): - r"""Test option parser in %run (Linux/OSX specific). - - You need double quote to escape glob in POSIX systems: - - In [1]: %run print_argv.py print\\*.py - ['print*.py'] - - You can't use quote to escape glob in POSIX systems: - - In [2]: %run print_argv.py 'print*.py' - ['print_argv.py'] - - """ - - -doctest_run_option_parser_for_posix.__skip_doctest__ = sys.platform == "win32" - - -@dec.skip_if_not_win32 -def doctest_run_option_parser_for_windows(): - r"""Test option parser in %run (Windows specific). - - In Windows, you can't escape ``*` `by backslash: - - In [1]: %run print_argv.py print\\*.py - ['print\\\\*.py'] - - You can use quote to escape glob: - - In [2]: %run print_argv.py 'print*.py' - ["'print*.py'"] - - """ - - -doctest_run_option_parser_for_windows.__skip_doctest__ = sys.platform != "win32" - - -def doctest_reset_del(): - """Test that resetting doesn't cause errors in __del__ methods. - - In [2]: class A(object): - ...: def __del__(self): - ...: print(str("Hi")) - ...: - - In [3]: a = A() - - In [4]: get_ipython().reset(); import gc; x = gc.collect(0) - Hi - - In [5]: 1+1 - Out[5]: 2 - """ - -# For some tests, it will be handy to organize them in a class with a common -# setup that makes a temp file - -class TestMagicRunPass(tt.TempFileMixin): - - def setUp(self): - content = "a = [1,2,3]\nb = 1" - self.mktmp(content) - - def run_tmpfile(self): - _ip = get_ipython() - # This fails on Windows if self.tmpfile.name has spaces or "~" in it. - # See below and ticket https://bugs.launchpad.net/bugs/366353 - _ip.run_line_magic("run", self.fname) - - def run_tmpfile_p(self): - _ip = get_ipython() - # This fails on Windows if self.tmpfile.name has spaces or "~" in it. - # See below and ticket https://bugs.launchpad.net/bugs/366353 - _ip.run_line_magic("run", "-p %s" % self.fname) - - def test_builtins_id(self): - """Check that %run doesn't damage __builtins__ """ - _ip = get_ipython() - # Test that the id of __builtins__ is not modified by %run - bid1 = id(_ip.user_ns['__builtins__']) - self.run_tmpfile() - bid2 = id(_ip.user_ns['__builtins__']) - assert bid1 == bid2 - - def test_builtins_type(self): - """Check that the type of __builtins__ doesn't change with %run. - - However, the above could pass if __builtins__ was already modified to - be a dict (it should be a module) by a previous use of %run. So we - also check explicitly that it really is a module: - """ - _ip = get_ipython() - self.run_tmpfile() - assert type(_ip.user_ns["__builtins__"]) == type(sys) - - def test_run_profile(self): - """Test that the option -p, which invokes the profiler, do not - crash by invoking execfile""" - self.run_tmpfile_p() - - def test_run_debug_twice(self): - # https://github.com/ipython/ipython/issues/10028 - _ip = get_ipython() - with tt.fake_input(["c"]): - _ip.run_line_magic("run", "-d %s" % self.fname) - with tt.fake_input(["c"]): - _ip.run_line_magic("run", "-d %s" % self.fname) - - def test_run_debug_twice_with_breakpoint(self): - """Make a valid python temp file.""" - _ip = get_ipython() - with tt.fake_input(["b 2", "c", "c"]): - _ip.run_line_magic("run", "-d %s" % self.fname) - - with tt.fake_input(["c"]): - with tt.AssertNotPrints("KeyError"): - _ip.run_line_magic("run", "-d %s" % self.fname) - - -class TestMagicRunSimple(tt.TempFileMixin): - - def test_simpledef(self): - """Test that simple class definitions work.""" - src = ("class foo: pass\n" - "def f(): return foo()") - self.mktmp(src) - _ip.run_line_magic("run", str(self.fname)) - _ip.run_cell("t = isinstance(f(), foo)") - assert _ip.user_ns["t"] is True - - @pytest.mark.xfail( - platform.python_implementation() == "PyPy", - reason="expecting __del__ call on exit is unreliable and doesn't happen on PyPy", - ) - def test_obj_del(self): - """Test that object's __del__ methods are called on exit.""" - src = ("class A(object):\n" - " def __del__(self):\n" - " print('object A deleted')\n" - "a = A()\n") - self.mktmp(src) - err = None - tt.ipexec_validate(self.fname, 'object A deleted', err) - - def test_aggressive_namespace_cleanup(self): - """Test that namespace cleanup is not too aggressive GH-238 - - Returning from another run magic deletes the namespace""" - # see ticket https://github.com/ipython/ipython/issues/238 - - with tt.TempFileMixin() as empty: - empty.mktmp("") - # On Windows, the filename will have \users in it, so we need to use the - # repr so that the \u becomes \\u. - src = ( - "ip = get_ipython()\n" - "for i in range(5):\n" - " try:\n" - " ip.run_line_magic(%r, %r)\n" - " except NameError as e:\n" - " print(i)\n" - " break\n" % ("run", empty.fname) - ) - self.mktmp(src) - _ip.run_line_magic("run", str(self.fname)) - _ip.run_cell("ip == get_ipython()") - assert _ip.user_ns["i"] == 4 - - def test_run_second(self): - """Test that running a second file doesn't clobber the first, gh-3547""" - self.mktmp("avar = 1\n" "def afunc():\n" " return avar\n") - - with tt.TempFileMixin() as empty: - empty.mktmp("") - - _ip.run_line_magic("run", self.fname) - _ip.run_line_magic("run", empty.fname) - assert _ip.user_ns["afunc"]() == 1 - - def test_tclass(self): - mydir = os.path.dirname(__file__) - tc = os.path.join(mydir, "tclass") - src = f"""\ -import gc -%run "{tc}" C-first -gc.collect(0) -%run "{tc}" C-second -gc.collect(0) -%run "{tc}" C-third -gc.collect(0) -%reset -f -""" - self.mktmp(src, ".ipy") - out = """\ -ARGV 1-: ['C-first'] -ARGV 1-: ['C-second'] -tclass.py: deleting object: C-first -ARGV 1-: ['C-third'] -tclass.py: deleting object: C-second -tclass.py: deleting object: C-third -""" - err = None - tt.ipexec_validate(self.fname, out, err) - - def test_run_i_after_reset(self): - """Check that %run -i still works after %reset (gh-693)""" - src = "yy = zz\n" - self.mktmp(src) - _ip.run_cell("zz = 23") - try: - _ip.run_line_magic("run", "-i %s" % self.fname) - assert _ip.user_ns["yy"] == 23 - finally: - _ip.run_line_magic("reset", "-f") - - _ip.run_cell("zz = 23") - try: - _ip.run_line_magic("run", "-i %s" % self.fname) - assert _ip.user_ns["yy"] == 23 - finally: - _ip.run_line_magic("reset", "-f") - - def test_unicode(self): - """Check that files in odd encodings are accepted.""" - mydir = os.path.dirname(__file__) - na = os.path.join(mydir, "nonascii.py") - _ip.run_line_magic("run", na) - assert _ip.user_ns["u"] == "Ўт№Ф" - - def test_run_py_file_attribute(self): - """Test handling of `__file__` attribute in `%run .py`.""" - src = "t = __file__\n" - self.mktmp(src) - _missing = object() - file1 = _ip.user_ns.get("__file__", _missing) - _ip.run_line_magic("run", self.fname) - file2 = _ip.user_ns.get("__file__", _missing) - - # Check that __file__ was equal to the filename in the script's - # namespace. - assert _ip.user_ns["t"] == self.fname - - # Check that __file__ was not leaked back into user_ns. - assert file1 == file2 - - def test_run_ipy_file_attribute(self): - """Test handling of `__file__` attribute in `%run `.""" - src = "t = __file__\n" - self.mktmp(src, ext='.ipy') - _missing = object() - file1 = _ip.user_ns.get("__file__", _missing) - _ip.run_line_magic("run", self.fname) - file2 = _ip.user_ns.get("__file__", _missing) - - # Check that __file__ was equal to the filename in the script's - # namespace. - assert _ip.user_ns["t"] == self.fname - - # Check that __file__ was not leaked back into user_ns. - assert file1 == file2 - - def test_run_formatting(self): - """ Test that %run -t -N does not raise a TypeError for N > 1.""" - src = "pass" - self.mktmp(src) - _ip.run_line_magic("run", "-t -N 1 %s" % self.fname) - _ip.run_line_magic("run", "-t -N 10 %s" % self.fname) - - def test_ignore_sys_exit(self): - """Test the -e option to ignore sys.exit()""" - src = "import sys; sys.exit(1)" - self.mktmp(src) - with tt.AssertPrints("SystemExit"): - _ip.run_line_magic("run", self.fname) - - with tt.AssertNotPrints("SystemExit"): - _ip.run_line_magic("run", "-e %s" % self.fname) - - def test_run_nb(self): - """Test %run notebook.ipynb""" - pytest.importorskip("nbformat") - from nbformat import v4, writes - nb = v4.new_notebook( - cells=[ - v4.new_markdown_cell("The Ultimate Question of Everything"), - v4.new_code_cell("answer=42") - ] - ) - src = writes(nb, version=4) - self.mktmp(src, ext='.ipynb') - - _ip.run_line_magic("run", self.fname) - - assert _ip.user_ns["answer"] == 42 - - def test_run_nb_error(self): - """Test %run notebook.ipynb error""" - pytest.importorskip("nbformat") - from nbformat import v4, writes - - # %run when a file name isn't provided - pytest.raises(Exception, _ip.magic, "run") - - # %run when a file doesn't exist - pytest.raises(Exception, _ip.magic, "run foobar.ipynb") - - # %run on a notebook with an error - nb = v4.new_notebook( - cells=[ - v4.new_code_cell("0/0") - ] - ) - src = writes(nb, version=4) - self.mktmp(src, ext='.ipynb') - pytest.raises(Exception, _ip.magic, "run %s" % self.fname) - - def test_file_options(self): - src = ('import sys\n' - 'a = " ".join(sys.argv[1:])\n') - self.mktmp(src) - test_opts = "-x 3 --verbose" - _ip.run_line_magic("run", "{0} {1}".format(self.fname, test_opts)) - assert _ip.user_ns["a"] == test_opts - - -class TestMagicRunWithPackage(unittest.TestCase): - - def writefile(self, name, content): - path = os.path.join(self.tempdir.name, name) - d = os.path.dirname(path) - if not os.path.isdir(d): - os.makedirs(d) - with open(path, "w", encoding="utf-8") as f: - f.write(textwrap.dedent(content)) - - def setUp(self): - self.package = package = 'tmp{0}'.format(''.join([random.choice(string.ascii_letters) for i in range(10)])) - """Temporary (probably) valid python package name.""" - - self.value = int(random.random() * 10000) - - self.tempdir = TemporaryDirectory() - self.__orig_cwd = os.getcwd() - sys.path.insert(0, self.tempdir.name) - - self.writefile(os.path.join(package, '__init__.py'), '') - self.writefile(os.path.join(package, 'sub.py'), """ - x = {0!r} - """.format(self.value)) - self.writefile(os.path.join(package, 'relative.py'), """ - from .sub import x - """) - self.writefile(os.path.join(package, 'absolute.py'), """ - from {0}.sub import x - """.format(package)) - self.writefile(os.path.join(package, 'args.py'), """ - import sys - a = " ".join(sys.argv[1:]) - """.format(package)) - - def tearDown(self): - os.chdir(self.__orig_cwd) - sys.path[:] = [p for p in sys.path if p != self.tempdir.name] - self.tempdir.cleanup() - - def check_run_submodule(self, submodule, opts=""): - _ip.user_ns.pop("x", None) - _ip.run_line_magic( - "run", "{2} -m {0}.{1}".format(self.package, submodule, opts) - ) - self.assertEqual( - _ip.user_ns["x"], - self.value, - "Variable `x` is not loaded from module `{0}`.".format(submodule), - ) - - def test_run_submodule_with_absolute_import(self): - self.check_run_submodule('absolute') - - def test_run_submodule_with_relative_import(self): - """Run submodule that has a relative import statement (#2727).""" - self.check_run_submodule('relative') - - def test_prun_submodule_with_absolute_import(self): - self.check_run_submodule('absolute', '-p') - - def test_prun_submodule_with_relative_import(self): - self.check_run_submodule('relative', '-p') - - def with_fake_debugger(func): - @functools.wraps(func) - def wrapper(*args, **kwds): - with patch.object(debugger.Pdb, 'run', staticmethod(eval)): - return func(*args, **kwds) - return wrapper - - @with_fake_debugger - def test_debug_run_submodule_with_absolute_import(self): - self.check_run_submodule('absolute', '-d') - - @with_fake_debugger - def test_debug_run_submodule_with_relative_import(self): - self.check_run_submodule('relative', '-d') - - def test_module_options(self): - _ip.user_ns.pop("a", None) - test_opts = "-x abc -m test" - _ip.run_line_magic("run", "-m {0}.args {1}".format(self.package, test_opts)) - assert _ip.user_ns["a"] == test_opts - - def test_module_options_with_separator(self): - _ip.user_ns.pop("a", None) - test_opts = "-x abc -m test" - _ip.run_line_magic("run", "-m {0}.args -- {1}".format(self.package, test_opts)) - assert _ip.user_ns["a"] == test_opts - - -def test_run__name__(): - with TemporaryDirectory() as td: - path = pjoin(td, "foo.py") - with open(path, "w", encoding="utf-8") as f: - f.write("q = __name__") - - _ip.user_ns.pop("q", None) - _ip.run_line_magic("run", "{}".format(path)) - assert _ip.user_ns.pop("q") == "__main__" - - _ip.run_line_magic("run", "-n {}".format(path)) - assert _ip.user_ns.pop("q") == "foo" - - try: - _ip.run_line_magic("run", "-i -n {}".format(path)) - assert _ip.user_ns.pop("q") == "foo" - finally: - _ip.run_line_magic("reset", "-f") - - -def test_run_tb(): - """Test traceback offset in %run""" - with TemporaryDirectory() as td: - path = pjoin(td, "foo.py") - with open(path, "w", encoding="utf-8") as f: - f.write( - "\n".join( - [ - "def foo():", - " return bar()", - "def bar():", - " raise RuntimeError('hello!')", - "foo()", - ] - ) - ) - with capture_output() as io: - _ip.run_line_magic("run", "{}".format(path)) - out = io.stdout - assert "execfile" not in out - assert "RuntimeError" in out - assert out.count("---->") == 3 - del ip.user_ns['bar'] - del ip.user_ns['foo'] - - -def test_multiprocessing_run(): - """Set we can run mutiprocesgin without messing up up main namespace - - Note that import `nose.tools as nt` modify the values - sys.module['__mp_main__'] so we need to temporarily set it to None to test - the issue. - """ - with TemporaryDirectory() as td: - mpm = sys.modules.get('__mp_main__') - sys.modules['__mp_main__'] = None - try: - path = pjoin(td, "test.py") - with open(path, "w", encoding="utf-8") as f: - f.write("import multiprocessing\nprint('hoy')") - with capture_output() as io: - _ip.run_line_magic('run', path) - _ip.run_cell("i_m_undefined") - out = io.stdout - assert "hoy" in out - assert "AttributeError" not in out - assert "NameError" in out - assert out.count("---->") == 1 - except: - raise - finally: - sys.modules['__mp_main__'] = mpm - - -def test_script_tb(): - """Test traceback offset in `ipython script.py`""" - with TemporaryDirectory() as td: - path = pjoin(td, "foo.py") - with open(path, "w", encoding="utf-8") as f: - f.write( - "\n".join( - [ - "def foo():", - " return bar()", - "def bar():", - " raise RuntimeError('hello!')", - "foo()", - ] - ) - ) - out, err = tt.ipexec(path) - assert "execfile" not in out - assert "RuntimeError" in out - assert out.count("---->") == 3 diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_shellapp.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_shellapp.py deleted file mode 100644 index 9f4f87b..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_shellapp.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -"""Tests for shellapp module. - -Authors -------- -* Bradley Froehle -""" -#----------------------------------------------------------------------------- -# Copyright (C) 2012 The IPython Development Team -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- -import unittest - -from IPython.testing import decorators as dec -from IPython.testing import tools as tt - - -class TestFileToRun(tt.TempFileMixin, unittest.TestCase): - """Test the behavior of the file_to_run parameter.""" - - def test_py_script_file_attribute(self): - """Test that `__file__` is set when running `ipython file.py`""" - src = "print(__file__)\n" - self.mktmp(src) - - err = None - tt.ipexec_validate(self.fname, self.fname, err) - - def test_ipy_script_file_attribute(self): - """Test that `__file__` is set when running `ipython file.ipy`""" - src = "print(__file__)\n" - self.mktmp(src, ext='.ipy') - - err = None - tt.ipexec_validate(self.fname, self.fname, err) - - # The commands option to ipexec_validate doesn't work on Windows, and it - # doesn't seem worth fixing - @dec.skip_win32 - def test_py_script_file_attribute_interactively(self): - """Test that `__file__` is not set after `ipython -i file.py`""" - src = "True\n" - self.mktmp(src) - - out, err = tt.ipexec( - self.fname, - options=["-i"], - commands=['"__file__" in globals()', "print(123)", "exit()"], - ) - assert "False" in out, f"Subprocess stderr:\n{err}\n-----" diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_splitinput.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_splitinput.py deleted file mode 100644 index f5fc53f..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_splitinput.py +++ /dev/null @@ -1,41 +0,0 @@ -# coding: utf-8 - -from IPython.core.splitinput import split_user_input, LineInfo - -import pytest - -tests = [ - ("x=1", ("", "", "x", "=1")), - ("?", ("", "?", "", "")), - ("??", ("", "??", "", "")), - (" ?", (" ", "?", "", "")), - (" ??", (" ", "??", "", "")), - ("??x", ("", "??", "x", "")), - ("?x=1", ("", "?", "x", "=1")), - ("!ls", ("", "!", "ls", "")), - (" !ls", (" ", "!", "ls", "")), - ("!!ls", ("", "!!", "ls", "")), - (" !!ls", (" ", "!!", "ls", "")), - (",ls", ("", ",", "ls", "")), - (";ls", ("", ";", "ls", "")), - (" ;ls", (" ", ";", "ls", "")), - ("f.g(x)", ("", "", "f.g", "(x)")), - ("f.g (x)", ("", "", "f.g", " (x)")), - ("?%hist1", ("", "?", "%hist1", "")), - ("?%%hist2", ("", "?", "%%hist2", "")), - ("??%hist3", ("", "??", "%hist3", "")), - ("??%%hist4", ("", "??", "%%hist4", "")), - ("?x*", ("", "?", "x*", "")), - ("Pérez Fernando", ("", "", "Pérez", " Fernando")), -] - - -@pytest.mark.parametrize("input, output", tests) -def test_split_user_input(input, output): - assert split_user_input(input) == output - - -def test_LineInfo(): - """Simple test for LineInfo construction and str()""" - linfo = LineInfo(" %cd /home") - assert str(linfo) == "LineInfo [ |%|cd|/home]" diff --git a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_ultratb.py b/.venv/lib/python3.12/site-packages/IPython/core/tests/test_ultratb.py deleted file mode 100644 index c8f5271..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/tests/test_ultratb.py +++ /dev/null @@ -1,457 +0,0 @@ -# encoding: utf-8 -"""Tests for IPython.core.ultratb -""" -import io -import os.path -import platform -import re -import sys -import traceback -import unittest -from textwrap import dedent - -from tempfile import TemporaryDirectory - -from IPython.core.ultratb import ColorTB, VerboseTB -from IPython.testing import tools as tt -from IPython.testing.decorators import onlyif_unicode_paths, skip_without -from IPython.utils.syspathcontext import prepended_to_syspath - -file_1 = """1 -2 -3 -def f(): - 1/0 -""" - -file_2 = """def f(): - 1/0 -""" - - -def recursionlimit(frames): - """ - decorator to set the recursion limit temporarily - """ - - def inner(test_function): - def wrapper(*args, **kwargs): - rl = sys.getrecursionlimit() - sys.setrecursionlimit(frames) - try: - return test_function(*args, **kwargs) - finally: - sys.setrecursionlimit(rl) - - return wrapper - - return inner - - -class ChangedPyFileTest(unittest.TestCase): - def test_changing_py_file(self): - """Traceback produced if the line where the error occurred is missing? - - https://github.com/ipython/ipython/issues/1456 - """ - with TemporaryDirectory() as td: - fname = os.path.join(td, "foo.py") - with open(fname, "w", encoding="utf-8") as f: - f.write(file_1) - - with prepended_to_syspath(td): - ip.run_cell("import foo") - - with tt.AssertPrints("ZeroDivisionError"): - ip.run_cell("foo.f()") - - # Make the file shorter, so the line of the error is missing. - with open(fname, "w", encoding="utf-8") as f: - f.write(file_2) - - # For some reason, this was failing on the *second* call after - # changing the file, so we call f() twice. - with tt.AssertNotPrints("Internal Python error", channel='stderr'): - with tt.AssertPrints("ZeroDivisionError"): - ip.run_cell("foo.f()") - with tt.AssertPrints("ZeroDivisionError"): - ip.run_cell("foo.f()") - -iso_8859_5_file = u'''# coding: iso-8859-5 - -def fail(): - """дбИЖ""" - 1/0 # дбИЖ -''' - -class NonAsciiTest(unittest.TestCase): - @onlyif_unicode_paths - def test_nonascii_path(self): - # Non-ascii directory name as well. - with TemporaryDirectory(suffix=u'é') as td: - fname = os.path.join(td, u"fooé.py") - with open(fname, "w", encoding="utf-8") as f: - f.write(file_1) - - with prepended_to_syspath(td): - ip.run_cell("import foo") - - with tt.AssertPrints("ZeroDivisionError"): - ip.run_cell("foo.f()") - - def test_iso8859_5(self): - with TemporaryDirectory() as td: - fname = os.path.join(td, 'dfghjkl.py') - - with io.open(fname, 'w', encoding='iso-8859-5') as f: - f.write(iso_8859_5_file) - - with prepended_to_syspath(td): - ip.run_cell("from dfghjkl import fail") - - with tt.AssertPrints("ZeroDivisionError"): - with tt.AssertPrints(u'дбИЖ', suppress=False): - ip.run_cell('fail()') - - def test_nonascii_msg(self): - cell = u"raise Exception('é')" - expected = u"Exception('é')" - ip.run_cell("%xmode plain") - with tt.AssertPrints(expected): - ip.run_cell(cell) - - ip.run_cell("%xmode verbose") - with tt.AssertPrints(expected): - ip.run_cell(cell) - - ip.run_cell("%xmode context") - with tt.AssertPrints(expected): - ip.run_cell(cell) - - ip.run_cell("%xmode minimal") - with tt.AssertPrints(u"Exception: é"): - ip.run_cell(cell) - - # Put this back into Context mode for later tests. - ip.run_cell("%xmode context") - -class NestedGenExprTestCase(unittest.TestCase): - """ - Regression test for the following issues: - https://github.com/ipython/ipython/issues/8293 - https://github.com/ipython/ipython/issues/8205 - """ - def test_nested_genexpr(self): - code = dedent( - """\ - class SpecificException(Exception): - pass - - def foo(x): - raise SpecificException("Success!") - - sum(sum(foo(x) for _ in [0]) for x in [0]) - """ - ) - with tt.AssertPrints('SpecificException: Success!', suppress=False): - ip.run_cell(code) - - -indentationerror_file = """if True: -zoom() -""" - -class IndentationErrorTest(unittest.TestCase): - def test_indentationerror_shows_line(self): - # See issue gh-2398 - with tt.AssertPrints("IndentationError"): - with tt.AssertPrints("zoom()", suppress=False): - ip.run_cell(indentationerror_file) - - with TemporaryDirectory() as td: - fname = os.path.join(td, "foo.py") - with open(fname, "w", encoding="utf-8") as f: - f.write(indentationerror_file) - - with tt.AssertPrints("IndentationError"): - with tt.AssertPrints("zoom()", suppress=False): - ip.run_line_magic("run", fname) - - -@skip_without("pandas") -def test_dynamic_code(): - code = """ - import pandas - df = pandas.DataFrame([]) - - # Important: only fails inside of an "exec" call: - exec("df.foobarbaz()") - """ - - with tt.AssertPrints("Could not get source"): - ip.run_cell(code) - - -se_file_1 = """1 -2 -7/ -""" - -se_file_2 = """7/ -""" - -class SyntaxErrorTest(unittest.TestCase): - - def test_syntaxerror_no_stacktrace_at_compile_time(self): - syntax_error_at_compile_time = """ -def foo(): - .. -""" - with tt.AssertPrints("SyntaxError"): - ip.run_cell(syntax_error_at_compile_time) - - with tt.AssertNotPrints("foo()"): - ip.run_cell(syntax_error_at_compile_time) - - def test_syntaxerror_stacktrace_when_running_compiled_code(self): - syntax_error_at_runtime = """ -def foo(): - eval("..") - -def bar(): - foo() - -bar() -""" - with tt.AssertPrints("SyntaxError"): - ip.run_cell(syntax_error_at_runtime) - # Assert syntax error during runtime generate stacktrace - with tt.AssertPrints(["foo()", "bar()"]): - ip.run_cell(syntax_error_at_runtime) - del ip.user_ns['bar'] - del ip.user_ns['foo'] - - def test_changing_py_file(self): - with TemporaryDirectory() as td: - fname = os.path.join(td, "foo.py") - with open(fname, "w", encoding="utf-8") as f: - f.write(se_file_1) - - with tt.AssertPrints(["7/", "SyntaxError"]): - ip.run_line_magic("run", fname) - - # Modify the file - with open(fname, "w", encoding="utf-8") as f: - f.write(se_file_2) - - # The SyntaxError should point to the correct line - with tt.AssertPrints(["7/", "SyntaxError"]): - ip.run_line_magic("run", fname) - - def test_non_syntaxerror(self): - # SyntaxTB may be called with an error other than a SyntaxError - # See e.g. gh-4361 - try: - raise ValueError('QWERTY') - except ValueError: - with tt.AssertPrints('QWERTY'): - ip.showsyntaxerror() - -import sys - -if platform.python_implementation() != "PyPy": - """ - New 3.9 Pgen Parser does not raise Memory error, except on failed malloc. - """ - class MemoryErrorTest(unittest.TestCase): - def test_memoryerror(self): - memoryerror_code = "(" * 200 + ")" * 200 - ip.run_cell(memoryerror_code) - - -class Python3ChainedExceptionsTest(unittest.TestCase): - DIRECT_CAUSE_ERROR_CODE = """ -try: - x = 1 + 2 - print(not_defined_here) -except Exception as e: - x += 55 - x - 1 - y = {} - raise KeyError('uh') from e - """ - - EXCEPTION_DURING_HANDLING_CODE = """ -try: - x = 1 + 2 - print(not_defined_here) -except Exception as e: - x += 55 - x - 1 - y = {} - raise KeyError('uh') - """ - - SUPPRESS_CHAINING_CODE = """ -try: - 1/0 -except Exception: - raise ValueError("Yikes") from None - """ - - SYS_EXIT_WITH_CONTEXT_CODE = """ -try: - 1/0 -except Exception as e: - raise SystemExit(1) - """ - - def test_direct_cause_error(self): - with tt.AssertPrints(["KeyError", "NameError", "direct cause"]): - ip.run_cell(self.DIRECT_CAUSE_ERROR_CODE) - - def test_exception_during_handling_error(self): - with tt.AssertPrints(["KeyError", "NameError", "During handling"]): - ip.run_cell(self.EXCEPTION_DURING_HANDLING_CODE) - - def test_sysexit_while_handling_error(self): - with tt.AssertPrints(["SystemExit", "to see the full traceback"]): - with tt.AssertNotPrints(["another exception"], suppress=False): - ip.run_cell(self.SYS_EXIT_WITH_CONTEXT_CODE) - - def test_suppress_exception_chaining(self): - with tt.AssertNotPrints("ZeroDivisionError"), \ - tt.AssertPrints("ValueError", suppress=False): - ip.run_cell(self.SUPPRESS_CHAINING_CODE) - - def test_plain_direct_cause_error(self): - with tt.AssertPrints(["KeyError", "NameError", "direct cause"]): - ip.run_cell("%xmode Plain") - ip.run_cell(self.DIRECT_CAUSE_ERROR_CODE) - ip.run_cell("%xmode Verbose") - - def test_plain_exception_during_handling_error(self): - with tt.AssertPrints(["KeyError", "NameError", "During handling"]): - ip.run_cell("%xmode Plain") - ip.run_cell(self.EXCEPTION_DURING_HANDLING_CODE) - ip.run_cell("%xmode Verbose") - - def test_plain_suppress_exception_chaining(self): - with tt.AssertNotPrints("ZeroDivisionError"), \ - tt.AssertPrints("ValueError", suppress=False): - ip.run_cell("%xmode Plain") - ip.run_cell(self.SUPPRESS_CHAINING_CODE) - ip.run_cell("%xmode Verbose") - - -class RecursionTest(unittest.TestCase): - DEFINITIONS = """ -def non_recurs(): - 1/0 - -def r1(): - r1() - -def r3a(): - r3b() - -def r3b(): - r3c() - -def r3c(): - r3a() - -def r3o1(): - r3a() - -def r3o2(): - r3o1() -""" - def setUp(self): - ip.run_cell(self.DEFINITIONS) - - def test_no_recursion(self): - with tt.AssertNotPrints("skipping similar frames"): - ip.run_cell("non_recurs()") - - @recursionlimit(200) - def test_recursion_one_frame(self): - with tt.AssertPrints(re.compile( - r"\[\.\.\. skipping similar frames: r1 at line 5 \(\d{2,3} times\)\]") - ): - ip.run_cell("r1()") - - @recursionlimit(160) - def test_recursion_three_frames(self): - with tt.AssertPrints("[... skipping similar frames: "), \ - tt.AssertPrints(re.compile(r"r3a at line 8 \(\d{2} times\)"), suppress=False), \ - tt.AssertPrints(re.compile(r"r3b at line 11 \(\d{2} times\)"), suppress=False), \ - tt.AssertPrints(re.compile(r"r3c at line 14 \(\d{2} times\)"), suppress=False): - ip.run_cell("r3o2()") - - -class PEP678NotesReportingTest(unittest.TestCase): - ERROR_WITH_NOTE = """ -try: - raise AssertionError("Message") -except Exception as e: - try: - e.add_note("This is a PEP-678 note.") - except AttributeError: # Python <= 3.10 - e.__notes__ = ("This is a PEP-678 note.",) - raise - """ - - def test_verbose_reports_notes(self): - with tt.AssertPrints(["AssertionError", "Message", "This is a PEP-678 note."]): - ip.run_cell(self.ERROR_WITH_NOTE) - - def test_plain_reports_notes(self): - with tt.AssertPrints(["AssertionError", "Message", "This is a PEP-678 note."]): - ip.run_cell("%xmode Plain") - ip.run_cell(self.ERROR_WITH_NOTE) - ip.run_cell("%xmode Verbose") - - -#---------------------------------------------------------------------------- - -# module testing (minimal) -def test_handlers(): - def spam(c, d_e): - (d, e) = d_e - x = c + d - y = c * d - foo(x, y) - - def foo(a, b, bar=1): - eggs(a, b + bar) - - def eggs(f, g, z=globals()): - h = f + g - i = f - g - return h / i - - buff = io.StringIO() - - buff.write('') - buff.write('*** Before ***') - try: - buff.write(spam(1, (2, 3))) - except: - traceback.print_exc(file=buff) - - handler = ColorTB(ostream=buff) - buff.write('*** ColorTB ***') - try: - buff.write(spam(1, (2, 3))) - except: - handler(*sys.exc_info()) - buff.write('') - - handler = VerboseTB(ostream=buff) - buff.write('*** VerboseTB ***') - try: - buff.write(spam(1, (2, 3))) - except: - handler(*sys.exc_info()) - buff.write('') diff --git a/.venv/lib/python3.12/site-packages/IPython/core/ultratb.py b/.venv/lib/python3.12/site-packages/IPython/core/ultratb.py deleted file mode 100644 index a8a38f1..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/ultratb.py +++ /dev/null @@ -1,1547 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Verbose and colourful traceback formatting. - -**ColorTB** - -I've always found it a bit hard to visually parse tracebacks in Python. The -ColorTB class is a solution to that problem. It colors the different parts of a -traceback in a manner similar to what you would expect from a syntax-highlighting -text editor. - -Installation instructions for ColorTB:: - - import sys,ultratb - sys.excepthook = ultratb.ColorTB() - -**VerboseTB** - -I've also included a port of Ka-Ping Yee's "cgitb.py" that produces all kinds -of useful info when a traceback occurs. Ping originally had it spit out HTML -and intended it for CGI programmers, but why should they have all the fun? I -altered it to spit out colored text to the terminal. It's a bit overwhelming, -but kind of neat, and maybe useful for long-running programs that you believe -are bug-free. If a crash *does* occur in that type of program you want details. -Give it a shot--you'll love it or you'll hate it. - -.. note:: - - The Verbose mode prints the variables currently visible where the exception - happened (shortening their strings if too long). This can potentially be - very slow, if you happen to have a huge data structure whose string - representation is complex to compute. Your computer may appear to freeze for - a while with cpu usage at 100%. If this occurs, you can cancel the traceback - with Ctrl-C (maybe hitting it more than once). - - If you encounter this kind of situation often, you may want to use the - Verbose_novars mode instead of the regular Verbose, which avoids formatting - variables (but otherwise includes the information and context given by - Verbose). - -.. note:: - - The verbose mode print all variables in the stack, which means it can - potentially leak sensitive information like access keys, or unencrypted - password. - -Installation instructions for VerboseTB:: - - import sys,ultratb - sys.excepthook = ultratb.VerboseTB() - -Note: Much of the code in this module was lifted verbatim from the standard -library module 'traceback.py' and Ka-Ping Yee's 'cgitb.py'. - -Color schemes -------------- - -The colors are defined in the class TBTools through the use of the -ColorSchemeTable class. Currently the following exist: - - - NoColor: allows all of this module to be used in any terminal (the color - escapes are just dummy blank strings). - - - Linux: is meant to look good in a terminal like the Linux console (black - or very dark background). - - - LightBG: similar to Linux but swaps dark/light colors to be more readable - in light background terminals. - - - Neutral: a neutral color scheme that should be readable on both light and - dark background - -You can implement other color schemes easily, the syntax is fairly -self-explanatory. Please send back new schemes you develop to the author for -possible inclusion in future releases. - -Inheritance diagram: - -.. inheritance-diagram:: IPython.core.ultratb - :parts: 3 -""" - -#***************************************************************************** -# Copyright (C) 2001 Nathaniel Gray -# Copyright (C) 2001-2004 Fernando Perez -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** - - -from collections.abc import Sequence -import functools -import inspect -import linecache -import pydoc -import sys -import time -import traceback -import types -from types import TracebackType -from typing import Any, List, Optional, Tuple - -import stack_data -from pygments.formatters.terminal256 import Terminal256Formatter -from pygments.styles import get_style_by_name - -import IPython.utils.colorable as colorable -# IPython's own modules -from IPython import get_ipython -from IPython.core import debugger -from IPython.core.display_trap import DisplayTrap -from IPython.core.excolors import exception_colors -from IPython.utils import PyColorize -from IPython.utils import path as util_path -from IPython.utils import py3compat -from IPython.utils.terminal import get_terminal_size - -# Globals -# amount of space to put line numbers before verbose tracebacks -INDENT_SIZE = 8 - -# Default color scheme. This is used, for example, by the traceback -# formatter. When running in an actual IPython instance, the user's rc.colors -# value is used, but having a module global makes this functionality available -# to users of ultratb who are NOT running inside ipython. -DEFAULT_SCHEME = 'NoColor' -FAST_THRESHOLD = 10_000 - -# --------------------------------------------------------------------------- -# Code begins - -# Helper function -- largely belongs to VerboseTB, but we need the same -# functionality to produce a pseudo verbose TB for SyntaxErrors, so that they -# can be recognized properly by ipython.el's py-traceback-line-re -# (SyntaxErrors have to be treated specially because they have no traceback) - - -@functools.lru_cache() -def count_lines_in_py_file(filename: str) -> int: - """ - Given a filename, returns the number of lines in the file - if it ends with the extension ".py". Otherwise, returns 0. - """ - if not filename.endswith(".py"): - return 0 - else: - try: - with open(filename, "r") as file: - s = sum(1 for line in file) - except UnicodeError: - return 0 - return s - - """ - Given a frame object, returns the total number of lines in the file - if the filename ends with the extension ".py". Otherwise, returns 0. - """ - - -def get_line_number_of_frame(frame: types.FrameType) -> int: - """ - Given a frame object, returns the total number of lines in the file - containing the frame's code object, or the number of lines in the - frame's source code if the file is not available. - - Parameters - ---------- - frame : FrameType - The frame object whose line number is to be determined. - - Returns - ------- - int - The total number of lines in the file containing the frame's - code object, or the number of lines in the frame's source code - if the file is not available. - """ - filename = frame.f_code.co_filename - if filename is None: - print("No file....") - lines, first = inspect.getsourcelines(frame) - return first + len(lines) - return count_lines_in_py_file(filename) - - -def _safe_string(value, what, func=str): - # Copied from cpython/Lib/traceback.py - try: - return func(value) - except: - return f"<{what} {func.__name__}() failed>" - - -def _format_traceback_lines(lines, Colors, has_colors: bool, lvals): - """ - Format tracebacks lines with pointing arrow, leading numbers... - - Parameters - ---------- - lines : list[Line] - Colors - ColorScheme used. - lvals : str - Values of local variables, already colored, to inject just after the error line. - """ - numbers_width = INDENT_SIZE - 1 - res = [] - - for stack_line in lines: - if stack_line is stack_data.LINE_GAP: - res.append('%s (...)%s\n' % (Colors.linenoEm, Colors.Normal)) - continue - - line = stack_line.render(pygmented=has_colors).rstrip('\n') + '\n' - lineno = stack_line.lineno - if stack_line.is_current: - # This is the line with the error - pad = numbers_width - len(str(lineno)) - num = '%s%s' % (debugger.make_arrow(pad), str(lineno)) - start_color = Colors.linenoEm - else: - num = '%*s' % (numbers_width, lineno) - start_color = Colors.lineno - - line = '%s%s%s %s' % (start_color, num, Colors.Normal, line) - - res.append(line) - if lvals and stack_line.is_current: - res.append(lvals + '\n') - return res - -def _simple_format_traceback_lines(lnum, index, lines, Colors, lvals, _line_format): - """ - Format tracebacks lines with pointing arrow, leading numbers... - - Parameters - ========== - - lnum: int - number of the target line of code. - index: int - which line in the list should be highlighted. - lines: list[string] - Colors: - ColorScheme used. - lvals: bytes - Values of local variables, already colored, to inject just after the error line. - _line_format: f (str) -> (str, bool) - return (colorized version of str, failure to do so) - """ - numbers_width = INDENT_SIZE - 1 - res = [] - for i, line in enumerate(lines, lnum - index): - # assert isinstance(line, str) - line = py3compat.cast_unicode(line) - - new_line, err = _line_format(line, "str") - if not err: - line = new_line - - if i == lnum: - # This is the line with the error - pad = numbers_width - len(str(i)) - num = "%s%s" % (debugger.make_arrow(pad), str(lnum)) - line = "%s%s%s %s%s" % ( - Colors.linenoEm, - num, - Colors.line, - line, - Colors.Normal, - ) - else: - num = "%*s" % (numbers_width, i) - line = "%s%s%s %s" % (Colors.lineno, num, Colors.Normal, line) - - res.append(line) - if lvals and i == lnum: - res.append(lvals + "\n") - return res - - -def _format_filename(file, ColorFilename, ColorNormal, *, lineno=None): - """ - Format filename lines with custom formatting from caching compiler or `File *.py` by default - - Parameters - ---------- - file : str - ColorFilename - ColorScheme's filename coloring to be used. - ColorNormal - ColorScheme's normal coloring to be used. - """ - ipinst = get_ipython() - if ( - ipinst is not None - and (data := ipinst.compile.format_code_name(file)) is not None - ): - label, name = data - if lineno is None: - tpl_link = f"{{label}} {ColorFilename}{{name}}{ColorNormal}" - else: - tpl_link = ( - f"{{label}} {ColorFilename}{{name}}, line {{lineno}}{ColorNormal}" - ) - else: - label = "File" - name = util_path.compress_user( - py3compat.cast_unicode(file, util_path.fs_encoding) - ) - if lineno is None: - tpl_link = f"{{label}} {ColorFilename}{{name}}{ColorNormal}" - else: - # can we make this the more friendly ", line {{lineno}}", or do we need to preserve the formatting with the colon? - tpl_link = f"{{label}} {ColorFilename}{{name}}:{{lineno}}{ColorNormal}" - - return tpl_link.format(label=label, name=name, lineno=lineno) - -#--------------------------------------------------------------------------- -# Module classes -class TBTools(colorable.Colorable): - """Basic tools used by all traceback printer classes.""" - - # Number of frames to skip when reporting tracebacks - tb_offset = 0 - - def __init__( - self, - color_scheme="NoColor", - call_pdb=False, - ostream=None, - parent=None, - config=None, - *, - debugger_cls=None, - ): - # Whether to call the interactive pdb debugger after printing - # tracebacks or not - super(TBTools, self).__init__(parent=parent, config=config) - self.call_pdb = call_pdb - - # Output stream to write to. Note that we store the original value in - # a private attribute and then make the public ostream a property, so - # that we can delay accessing sys.stdout until runtime. The way - # things are written now, the sys.stdout object is dynamically managed - # so a reference to it should NEVER be stored statically. This - # property approach confines this detail to a single location, and all - # subclasses can simply access self.ostream for writing. - self._ostream = ostream - - # Create color table - self.color_scheme_table = exception_colors() - - self.set_colors(color_scheme) - self.old_scheme = color_scheme # save initial value for toggles - self.debugger_cls = debugger_cls or debugger.Pdb - - if call_pdb: - self.pdb = self.debugger_cls() - else: - self.pdb = None - - def _get_ostream(self): - """Output stream that exceptions are written to. - - Valid values are: - - - None: the default, which means that IPython will dynamically resolve - to sys.stdout. This ensures compatibility with most tools, including - Windows (where plain stdout doesn't recognize ANSI escapes). - - - Any object with 'write' and 'flush' attributes. - """ - return sys.stdout if self._ostream is None else self._ostream - - def _set_ostream(self, val): - assert val is None or (hasattr(val, 'write') and hasattr(val, 'flush')) - self._ostream = val - - ostream = property(_get_ostream, _set_ostream) - - @staticmethod - def _get_chained_exception(exception_value): - cause = getattr(exception_value, "__cause__", None) - if cause: - return cause - if getattr(exception_value, "__suppress_context__", False): - return None - return getattr(exception_value, "__context__", None) - - def get_parts_of_chained_exception( - self, evalue - ) -> Optional[Tuple[type, BaseException, TracebackType]]: - chained_evalue = self._get_chained_exception(evalue) - - if chained_evalue: - return chained_evalue.__class__, chained_evalue, chained_evalue.__traceback__ - return None - - def prepare_chained_exception_message(self, cause) -> List[Any]: - direct_cause = "\nThe above exception was the direct cause of the following exception:\n" - exception_during_handling = "\nDuring handling of the above exception, another exception occurred:\n" - - if cause: - message = [[direct_cause]] - else: - message = [[exception_during_handling]] - return message - - @property - def has_colors(self) -> bool: - return self.color_scheme_table.active_scheme_name.lower() != "nocolor" - - def set_colors(self, *args, **kw): - """Shorthand access to the color table scheme selector method.""" - - # Set own color table - self.color_scheme_table.set_active_scheme(*args, **kw) - # for convenience, set Colors to the active scheme - self.Colors = self.color_scheme_table.active_colors - # Also set colors of debugger - if hasattr(self, 'pdb') and self.pdb is not None: - self.pdb.set_colors(*args, **kw) - - def color_toggle(self): - """Toggle between the currently active color scheme and NoColor.""" - - if self.color_scheme_table.active_scheme_name == 'NoColor': - self.color_scheme_table.set_active_scheme(self.old_scheme) - self.Colors = self.color_scheme_table.active_colors - else: - self.old_scheme = self.color_scheme_table.active_scheme_name - self.color_scheme_table.set_active_scheme('NoColor') - self.Colors = self.color_scheme_table.active_colors - - def stb2text(self, stb): - """Convert a structured traceback (a list) to a string.""" - return '\n'.join(stb) - - def text(self, etype, value, tb, tb_offset: Optional[int] = None, context=5): - """Return formatted traceback. - - Subclasses may override this if they add extra arguments. - """ - tb_list = self.structured_traceback(etype, value, tb, - tb_offset, context) - return self.stb2text(tb_list) - - def structured_traceback( - self, - etype: type, - evalue: Optional[BaseException], - etb: Optional[TracebackType] = None, - tb_offset: Optional[int] = None, - number_of_lines_of_context: int = 5, - ): - """Return a list of traceback frames. - - Must be implemented by each class. - """ - raise NotImplementedError() - - -#--------------------------------------------------------------------------- -class ListTB(TBTools): - """Print traceback information from a traceback list, with optional color. - - Calling requires 3 arguments: (etype, evalue, elist) - as would be obtained by:: - - etype, evalue, tb = sys.exc_info() - if tb: - elist = traceback.extract_tb(tb) - else: - elist = None - - It can thus be used by programs which need to process the traceback before - printing (such as console replacements based on the code module from the - standard library). - - Because they are meant to be called without a full traceback (only a - list), instances of this class can't call the interactive pdb debugger.""" - - - def __call__(self, etype, value, elist): - self.ostream.flush() - self.ostream.write(self.text(etype, value, elist)) - self.ostream.write('\n') - - def _extract_tb(self, tb): - if tb: - return traceback.extract_tb(tb) - else: - return None - - def structured_traceback( - self, - etype: type, - evalue: Optional[BaseException], - etb: Optional[TracebackType] = None, - tb_offset: Optional[int] = None, - context=5, - ): - """Return a color formatted string with the traceback info. - - Parameters - ---------- - etype : exception type - Type of the exception raised. - evalue : object - Data stored in the exception - etb : list | TracebackType | None - If list: List of frames, see class docstring for details. - If Traceback: Traceback of the exception. - tb_offset : int, optional - Number of frames in the traceback to skip. If not given, the - instance evalue is used (set in constructor). - context : int, optional - Number of lines of context information to print. - - Returns - ------- - String with formatted exception. - """ - # This is a workaround to get chained_exc_ids in recursive calls - # etb should not be a tuple if structured_traceback is not recursive - if isinstance(etb, tuple): - etb, chained_exc_ids = etb - else: - chained_exc_ids = set() - - if isinstance(etb, list): - elist = etb - elif etb is not None: - elist = self._extract_tb(etb) - else: - elist = [] - tb_offset = self.tb_offset if tb_offset is None else tb_offset - assert isinstance(tb_offset, int) - Colors = self.Colors - out_list = [] - if elist: - - if tb_offset and len(elist) > tb_offset: - elist = elist[tb_offset:] - - out_list.append('Traceback %s(most recent call last)%s:' % - (Colors.normalEm, Colors.Normal) + '\n') - out_list.extend(self._format_list(elist)) - # The exception info should be a single entry in the list. - lines = ''.join(self._format_exception_only(etype, evalue)) - out_list.append(lines) - - # Find chained exceptions if we have a traceback (not for exception-only mode) - if etb is not None: - exception = self.get_parts_of_chained_exception(evalue) - - if exception and (id(exception[1]) not in chained_exc_ids): - chained_exception_message = ( - self.prepare_chained_exception_message(evalue.__cause__)[0] - if evalue is not None - else "" - ) - etype, evalue, etb = exception - # Trace exception to avoid infinite 'cause' loop - chained_exc_ids.add(id(exception[1])) - chained_exceptions_tb_offset = 0 - out_list = ( - self.structured_traceback( - etype, - evalue, - (etb, chained_exc_ids), # type: ignore - chained_exceptions_tb_offset, - context, - ) - + chained_exception_message - + out_list - ) - - return out_list - - def _format_list(self, extracted_list): - """Format a list of traceback entry tuples for printing. - - Given a list of tuples as returned by extract_tb() or - extract_stack(), return a list of strings ready for printing. - Each string in the resulting list corresponds to the item with the - same index in the argument list. Each string ends in a newline; - the strings may contain internal newlines as well, for those items - whose source text line is not None. - - Lifted almost verbatim from traceback.py - """ - - Colors = self.Colors - output_list = [] - for ind, (filename, lineno, name, line) in enumerate(extracted_list): - normalCol, nameCol, fileCol, lineCol = ( - # Emphasize the last entry - (Colors.normalEm, Colors.nameEm, Colors.filenameEm, Colors.line) - if ind == len(extracted_list) - 1 - else (Colors.Normal, Colors.name, Colors.filename, "") - ) - - fns = _format_filename(filename, fileCol, normalCol, lineno=lineno) - item = f"{normalCol} {fns}" - - if name != "": - item += f" in {nameCol}{name}{normalCol}\n" - else: - item += "\n" - if line: - item += f"{lineCol} {line.strip()}{normalCol}\n" - output_list.append(item) - - return output_list - - def _format_exception_only(self, etype, value): - """Format the exception part of a traceback. - - The arguments are the exception type and value such as given by - sys.exc_info()[:2]. The return value is a list of strings, each ending - in a newline. Normally, the list contains a single string; however, - for SyntaxError exceptions, it contains several lines that (when - printed) display detailed information about where the syntax error - occurred. The message indicating which exception occurred is the - always last string in the list. - - Also lifted nearly verbatim from traceback.py - """ - have_filedata = False - Colors = self.Colors - output_list = [] - stype = py3compat.cast_unicode(Colors.excName + etype.__name__ + Colors.Normal) - if value is None: - # Not sure if this can still happen in Python 2.6 and above - output_list.append(stype + "\n") - else: - if issubclass(etype, SyntaxError): - have_filedata = True - if not value.filename: value.filename = "" - if value.lineno: - lineno = value.lineno - textline = linecache.getline(value.filename, value.lineno) - else: - lineno = "unknown" - textline = "" - output_list.append( - "%s %s%s\n" - % ( - Colors.normalEm, - _format_filename( - value.filename, - Colors.filenameEm, - Colors.normalEm, - lineno=(None if lineno == "unknown" else lineno), - ), - Colors.Normal, - ) - ) - if textline == "": - textline = py3compat.cast_unicode(value.text, "utf-8") - - if textline is not None: - i = 0 - while i < len(textline) and textline[i].isspace(): - i += 1 - output_list.append( - "%s %s%s\n" % (Colors.line, textline.strip(), Colors.Normal) - ) - if value.offset is not None: - s = ' ' - for c in textline[i:value.offset - 1]: - if c.isspace(): - s += c - else: - s += " " - output_list.append( - "%s%s^%s\n" % (Colors.caret, s, Colors.Normal) - ) - - try: - s = value.msg - except Exception: - s = self._some_str(value) - if s: - output_list.append( - "%s%s:%s %s\n" % (stype, Colors.excName, Colors.Normal, s) - ) - else: - output_list.append("%s\n" % stype) - - # PEP-678 notes - output_list.extend(f"{x}\n" for x in getattr(value, "__notes__", [])) - - # sync with user hooks - if have_filedata: - ipinst = get_ipython() - if ipinst is not None: - ipinst.hooks.synchronize_with_editor(value.filename, value.lineno, 0) - - return output_list - - def get_exception_only(self, etype, value): - """Only print the exception type and message, without a traceback. - - Parameters - ---------- - etype : exception type - value : exception value - """ - return ListTB.structured_traceback(self, etype, value) - - def show_exception_only(self, etype, evalue): - """Only print the exception type and message, without a traceback. - - Parameters - ---------- - etype : exception type - evalue : exception value - """ - # This method needs to use __call__ from *this* class, not the one from - # a subclass whose signature or behavior may be different - ostream = self.ostream - ostream.flush() - ostream.write('\n'.join(self.get_exception_only(etype, evalue))) - ostream.flush() - - def _some_str(self, value): - # Lifted from traceback.py - try: - return py3compat.cast_unicode(str(value)) - except: - return u'' % type(value).__name__ - - -class FrameInfo: - """ - Mirror of stack data's FrameInfo, but so that we can bypass highlighting on - really long frames. - """ - - description: Optional[str] - filename: Optional[str] - lineno: Tuple[int] - # number of context lines to use - context: Optional[int] - raw_lines: List[str] - - @classmethod - def _from_stack_data_FrameInfo(cls, frame_info): - return cls( - getattr(frame_info, "description", None), - getattr(frame_info, "filename", None), # type: ignore[arg-type] - getattr(frame_info, "lineno", None), # type: ignore[arg-type] - getattr(frame_info, "frame", None), - getattr(frame_info, "code", None), - sd=frame_info, - context=None, - ) - - def __init__( - self, - description: Optional[str], - filename: str, - lineno: Tuple[int], - frame, - code, - *, - sd=None, - context=None, - ): - self.description = description - self.filename = filename - self.lineno = lineno - self.frame = frame - self.code = code - self._sd = sd - self.context = context - - # self.lines = [] - if sd is None: - try: - # return a list of source lines and a starting line number - self.raw_lines = inspect.getsourcelines(frame)[0] - except OSError: - self.raw_lines = [ - "'Could not get source, probably due dynamically evaluated source code.'" - ] - - @property - def variables_in_executing_piece(self): - if self._sd: - return self._sd.variables_in_executing_piece - else: - return [] - - @property - def lines(self): - from executing.executing import NotOneValueFound - - try: - return self._sd.lines - except NotOneValueFound: - - class Dummy: - lineno = 0 - is_current = False - - def render(self, *, pygmented): - return "" - - return [Dummy()] - - @property - def executing(self): - if self._sd: - return self._sd.executing - else: - return None - - -# ---------------------------------------------------------------------------- -class VerboseTB(TBTools): - """A port of Ka-Ping Yee's cgitb.py module that outputs color text instead - of HTML. Requires inspect and pydoc. Crazy, man. - - Modified version which optionally strips the topmost entries from the - traceback, to be used with alternate interpreters (because their own code - would appear in the traceback).""" - - tb_highlight = "bg:ansiyellow" - tb_highlight_style = "default" - - def __init__( - self, - color_scheme: str = "Linux", - call_pdb: bool = False, - ostream=None, - tb_offset: int = 0, - long_header: bool = False, - include_vars: bool = True, - check_cache=None, - debugger_cls=None, - parent=None, - config=None, - ): - """Specify traceback offset, headers and color scheme. - - Define how many frames to drop from the tracebacks. Calling it with - tb_offset=1 allows use of this handler in interpreters which will have - their own code at the top of the traceback (VerboseTB will first - remove that frame before printing the traceback info).""" - TBTools.__init__( - self, - color_scheme=color_scheme, - call_pdb=call_pdb, - ostream=ostream, - parent=parent, - config=config, - debugger_cls=debugger_cls, - ) - self.tb_offset = tb_offset - self.long_header = long_header - self.include_vars = include_vars - # By default we use linecache.checkcache, but the user can provide a - # different check_cache implementation. This was formerly used by the - # IPython kernel for interactive code, but is no longer necessary. - if check_cache is None: - check_cache = linecache.checkcache - self.check_cache = check_cache - - self.skip_hidden = True - - def format_record(self, frame_info: FrameInfo): - """Format a single stack frame""" - assert isinstance(frame_info, FrameInfo) - Colors = self.Colors # just a shorthand + quicker name lookup - ColorsNormal = Colors.Normal # used a lot - - if isinstance(frame_info._sd, stack_data.RepeatedFrames): - return ' %s[... skipping similar frames: %s]%s\n' % ( - Colors.excName, frame_info.description, ColorsNormal) - - indent = " " * INDENT_SIZE - em_normal = "%s\n%s%s" % (Colors.valEm, indent, ColorsNormal) - tpl_call = f"in {Colors.vName}{{file}}{Colors.valEm}{{scope}}{ColorsNormal}" - tpl_call_fail = "in %s%%s%s(***failed resolving arguments***)%s" % ( - Colors.vName, - Colors.valEm, - ColorsNormal, - ) - tpl_name_val = "%%s %s= %%s%s" % (Colors.valEm, ColorsNormal) - - link = _format_filename( - frame_info.filename, - Colors.filenameEm, - ColorsNormal, - lineno=frame_info.lineno, - ) - args, varargs, varkw, locals_ = inspect.getargvalues(frame_info.frame) - if frame_info.executing is not None: - func = frame_info.executing.code_qualname() - else: - func = "?" - if func == "": - call = "" - else: - # Decide whether to include variable details or not - var_repr = eqrepr if self.include_vars else nullrepr - try: - scope = inspect.formatargvalues( - args, varargs, varkw, locals_, formatvalue=var_repr - ) - call = tpl_call.format(file=func, scope=scope) - except KeyError: - # This happens in situations like errors inside generator - # expressions, where local variables are listed in the - # line, but can't be extracted from the frame. I'm not - # 100% sure this isn't actually a bug in inspect itself, - # but since there's no info for us to compute with, the - # best we can do is report the failure and move on. Here - # we must *not* call any traceback construction again, - # because that would mess up use of %debug later on. So we - # simply report the failure and move on. The only - # limitation will be that this frame won't have locals - # listed in the call signature. Quite subtle problem... - # I can't think of a good way to validate this in a unit - # test, but running a script consisting of: - # dict( (k,v.strip()) for (k,v) in range(10) ) - # will illustrate the error, if this exception catch is - # disabled. - call = tpl_call_fail % func - - lvals = '' - lvals_list = [] - if self.include_vars: - try: - # we likely want to fix stackdata at some point, but - # still need a workaround. - fibp = frame_info.variables_in_executing_piece - for var in fibp: - lvals_list.append(tpl_name_val % (var.name, repr(var.value))) - except Exception: - lvals_list.append( - "Exception trying to inspect frame. No more locals available." - ) - if lvals_list: - lvals = '%s%s' % (indent, em_normal.join(lvals_list)) - - result = f'{link}{", " if call else ""}{call}\n' - if frame_info._sd is None: - # fast fallback if file is too long - tpl_link = "%s%%s%s" % (Colors.filenameEm, ColorsNormal) - link = tpl_link % util_path.compress_user(frame_info.filename) - level = "%s %s\n" % (link, call) - _line_format = PyColorize.Parser( - style=self.color_scheme_table.active_scheme_name, parent=self - ).format2 - first_line = frame_info.code.co_firstlineno - current_line = frame_info.lineno[0] - raw_lines = frame_info.raw_lines - index = current_line - first_line - - if index >= frame_info.context: - start = max(index - frame_info.context, 0) - stop = index + frame_info.context - index = frame_info.context - else: - start = 0 - stop = index + frame_info.context - raw_lines = raw_lines[start:stop] - - return "%s%s" % ( - level, - "".join( - _simple_format_traceback_lines( - current_line, - index, - raw_lines, - Colors, - lvals, - _line_format, - ) - ), - ) - # result += "\n".join(frame_info.raw_lines) - else: - result += "".join( - _format_traceback_lines( - frame_info.lines, Colors, self.has_colors, lvals - ) - ) - return result - - def prepare_header(self, etype: str, long_version: bool = False): - colors = self.Colors # just a shorthand + quicker name lookup - colorsnormal = colors.Normal # used a lot - exc = '%s%s%s' % (colors.excName, etype, colorsnormal) - width = min(75, get_terminal_size()[0]) - if long_version: - # Header with the exception type, python version, and date - pyver = 'Python ' + sys.version.split()[0] + ': ' + sys.executable - date = time.ctime(time.time()) - - head = "%s%s%s\n%s%s%s\n%s" % ( - colors.topline, - "-" * width, - colorsnormal, - exc, - " " * (width - len(etype) - len(pyver)), - pyver, - date.rjust(width), - ) - head += ( - "\nA problem occurred executing Python code. Here is the sequence of function" - "\ncalls leading up to the error, with the most recent (innermost) call last." - ) - else: - # Simplified header - head = "%s%s" % ( - exc, - "Traceback (most recent call last)".rjust(width - len(etype)), - ) - - return head - - def format_exception(self, etype, evalue): - colors = self.Colors # just a shorthand + quicker name lookup - colorsnormal = colors.Normal # used a lot - # Get (safely) a string form of the exception info - try: - etype_str, evalue_str = map(str, (etype, evalue)) - except: - # User exception is improperly defined. - etype, evalue = str, sys.exc_info()[:2] - etype_str, evalue_str = map(str, (etype, evalue)) - - # PEP-678 notes - notes = getattr(evalue, "__notes__", []) - if not isinstance(notes, Sequence) or isinstance(notes, (str, bytes)): - notes = [_safe_string(notes, "__notes__", func=repr)] - - # ... and format it - return [ - "{}{}{}: {}".format( - colors.excName, - etype_str, - colorsnormal, - py3compat.cast_unicode(evalue_str), - ), - *( - "{}{}".format( - colorsnormal, _safe_string(py3compat.cast_unicode(n), "note") - ) - for n in notes - ), - ] - - def format_exception_as_a_whole( - self, - etype: type, - evalue: Optional[BaseException], - etb: Optional[TracebackType], - number_of_lines_of_context, - tb_offset: Optional[int], - ): - """Formats the header, traceback and exception message for a single exception. - - This may be called multiple times by Python 3 exception chaining - (PEP 3134). - """ - # some locals - orig_etype = etype - try: - etype = etype.__name__ # type: ignore - except AttributeError: - pass - - tb_offset = self.tb_offset if tb_offset is None else tb_offset - assert isinstance(tb_offset, int) - head = self.prepare_header(str(etype), self.long_header) - records = ( - self.get_records(etb, number_of_lines_of_context, tb_offset) if etb else [] - ) - - frames = [] - skipped = 0 - lastrecord = len(records) - 1 - for i, record in enumerate(records): - if ( - not isinstance(record._sd, stack_data.RepeatedFrames) - and self.skip_hidden - ): - if ( - record.frame.f_locals.get("__tracebackhide__", 0) - and i != lastrecord - ): - skipped += 1 - continue - if skipped: - Colors = self.Colors # just a shorthand + quicker name lookup - ColorsNormal = Colors.Normal # used a lot - frames.append( - " %s[... skipping hidden %s frame]%s\n" - % (Colors.excName, skipped, ColorsNormal) - ) - skipped = 0 - frames.append(self.format_record(record)) - if skipped: - Colors = self.Colors # just a shorthand + quicker name lookup - ColorsNormal = Colors.Normal # used a lot - frames.append( - " %s[... skipping hidden %s frame]%s\n" - % (Colors.excName, skipped, ColorsNormal) - ) - - formatted_exception = self.format_exception(etype, evalue) - if records: - frame_info = records[-1] - ipinst = get_ipython() - if ipinst is not None: - ipinst.hooks.synchronize_with_editor(frame_info.filename, frame_info.lineno, 0) - - return [[head] + frames + formatted_exception] - - def get_records( - self, etb: TracebackType, number_of_lines_of_context: int, tb_offset: int - ): - assert etb is not None - context = number_of_lines_of_context - 1 - after = context // 2 - before = context - after - if self.has_colors: - style = get_style_by_name(self.tb_highlight_style) - style = stack_data.style_with_executing_node(style, self.tb_highlight) - formatter = Terminal256Formatter(style=style) - else: - formatter = None - options = stack_data.Options( - before=before, - after=after, - pygments_formatter=formatter, - ) - - # Let's estimate the amount of code we will have to parse/highlight. - cf: Optional[TracebackType] = etb - max_len = 0 - tbs = [] - while cf is not None: - try: - mod = inspect.getmodule(cf.tb_frame) - if mod is not None: - mod_name = mod.__name__ - root_name, *_ = mod_name.split(".") - if root_name == "IPython": - cf = cf.tb_next - continue - max_len = get_line_number_of_frame(cf.tb_frame) - - except OSError: - max_len = 0 - max_len = max(max_len, max_len) - tbs.append(cf) - cf = getattr(cf, "tb_next", None) - - if max_len > FAST_THRESHOLD: - FIs = [] - for tb in tbs: - frame = tb.tb_frame # type: ignore - lineno = (frame.f_lineno,) - code = frame.f_code - filename = code.co_filename - # TODO: Here we need to use before/after/ - FIs.append( - FrameInfo( - "Raw frame", filename, lineno, frame, code, context=context - ) - ) - return FIs - res = list(stack_data.FrameInfo.stack_data(etb, options=options))[tb_offset:] - res = [FrameInfo._from_stack_data_FrameInfo(r) for r in res] - return res - - def structured_traceback( - self, - etype: type, - evalue: Optional[BaseException], - etb: Optional[TracebackType] = None, - tb_offset: Optional[int] = None, - number_of_lines_of_context: int = 5, - ): - """Return a nice text document describing the traceback.""" - formatted_exception = self.format_exception_as_a_whole(etype, evalue, etb, number_of_lines_of_context, - tb_offset) - - colors = self.Colors # just a shorthand + quicker name lookup - colorsnormal = colors.Normal # used a lot - head = '%s%s%s' % (colors.topline, '-' * min(75, get_terminal_size()[0]), colorsnormal) - structured_traceback_parts = [head] - chained_exceptions_tb_offset = 0 - lines_of_context = 3 - formatted_exceptions = formatted_exception - exception = self.get_parts_of_chained_exception(evalue) - if exception: - assert evalue is not None - formatted_exceptions += self.prepare_chained_exception_message(evalue.__cause__) - etype, evalue, etb = exception - else: - evalue = None - chained_exc_ids = set() - while evalue: - formatted_exceptions += self.format_exception_as_a_whole(etype, evalue, etb, lines_of_context, - chained_exceptions_tb_offset) - exception = self.get_parts_of_chained_exception(evalue) - - if exception and not id(exception[1]) in chained_exc_ids: - chained_exc_ids.add(id(exception[1])) # trace exception to avoid infinite 'cause' loop - formatted_exceptions += self.prepare_chained_exception_message(evalue.__cause__) - etype, evalue, etb = exception - else: - evalue = None - - # we want to see exceptions in a reversed order: - # the first exception should be on top - for formatted_exception in reversed(formatted_exceptions): - structured_traceback_parts += formatted_exception - - return structured_traceback_parts - - def debugger(self, force: bool = False): - """Call up the pdb debugger if desired, always clean up the tb - reference. - - Keywords: - - - force(False): by default, this routine checks the instance call_pdb - flag and does not actually invoke the debugger if the flag is false. - The 'force' option forces the debugger to activate even if the flag - is false. - - If the call_pdb flag is set, the pdb interactive debugger is - invoked. In all cases, the self.tb reference to the current traceback - is deleted to prevent lingering references which hamper memory - management. - - Note that each call to pdb() does an 'import readline', so if your app - requires a special setup for the readline completers, you'll have to - fix that by hand after invoking the exception handler.""" - - if force or self.call_pdb: - if self.pdb is None: - self.pdb = self.debugger_cls() - # the system displayhook may have changed, restore the original - # for pdb - display_trap = DisplayTrap(hook=sys.__displayhook__) - with display_trap: - self.pdb.reset() - # Find the right frame so we don't pop up inside ipython itself - if hasattr(self, "tb") and self.tb is not None: # type: ignore[has-type] - etb = self.tb # type: ignore[has-type] - else: - etb = self.tb = sys.last_traceback - while self.tb is not None and self.tb.tb_next is not None: - assert self.tb.tb_next is not None - self.tb = self.tb.tb_next - if etb and etb.tb_next: - etb = etb.tb_next - self.pdb.botframe = etb.tb_frame - # last_value should be deprecated, but last-exc sometimme not set - # please check why later and remove the getattr. - exc = sys.last_value if sys.version_info < (3, 12) else getattr(sys, "last_exc", sys.last_value) # type: ignore[attr-defined] - if exc: - self.pdb.interaction(None, exc) - else: - self.pdb.interaction(None, etb) - - if hasattr(self, 'tb'): - del self.tb - - def handler(self, info=None): - (etype, evalue, etb) = info or sys.exc_info() - self.tb = etb - ostream = self.ostream - ostream.flush() - ostream.write(self.text(etype, evalue, etb)) - ostream.write('\n') - ostream.flush() - - # Changed so an instance can just be called as VerboseTB_inst() and print - # out the right info on its own. - def __call__(self, etype=None, evalue=None, etb=None): - """This hook can replace sys.excepthook (for Python 2.1 or higher).""" - if etb is None: - self.handler() - else: - self.handler((etype, evalue, etb)) - try: - self.debugger() - except KeyboardInterrupt: - print("\nKeyboardInterrupt") - - -#---------------------------------------------------------------------------- -class FormattedTB(VerboseTB, ListTB): - """Subclass ListTB but allow calling with a traceback. - - It can thus be used as a sys.excepthook for Python > 2.1. - - Also adds 'Context' and 'Verbose' modes, not available in ListTB. - - Allows a tb_offset to be specified. This is useful for situations where - one needs to remove a number of topmost frames from the traceback (such as - occurs with python programs that themselves execute other python code, - like Python shells). """ - - mode: str - - def __init__(self, mode='Plain', color_scheme='Linux', call_pdb=False, - ostream=None, - tb_offset=0, long_header=False, include_vars=False, - check_cache=None, debugger_cls=None, - parent=None, config=None): - - # NEVER change the order of this list. Put new modes at the end: - self.valid_modes = ['Plain', 'Context', 'Verbose', 'Minimal'] - self.verbose_modes = self.valid_modes[1:3] - - VerboseTB.__init__(self, color_scheme=color_scheme, call_pdb=call_pdb, - ostream=ostream, tb_offset=tb_offset, - long_header=long_header, include_vars=include_vars, - check_cache=check_cache, debugger_cls=debugger_cls, - parent=parent, config=config) - - # Different types of tracebacks are joined with different separators to - # form a single string. They are taken from this dict - self._join_chars = dict(Plain='', Context='\n', Verbose='\n', - Minimal='') - # set_mode also sets the tb_join_char attribute - self.set_mode(mode) - - def structured_traceback(self, etype, value, tb, tb_offset=None, number_of_lines_of_context=5): - tb_offset = self.tb_offset if tb_offset is None else tb_offset - mode = self.mode - if mode in self.verbose_modes: - # Verbose modes need a full traceback - return VerboseTB.structured_traceback( - self, etype, value, tb, tb_offset, number_of_lines_of_context - ) - elif mode == 'Minimal': - return ListTB.get_exception_only(self, etype, value) - else: - # We must check the source cache because otherwise we can print - # out-of-date source code. - self.check_cache() - # Now we can extract and format the exception - return ListTB.structured_traceback( - self, etype, value, tb, tb_offset, number_of_lines_of_context - ) - - def stb2text(self, stb): - """Convert a structured traceback (a list) to a string.""" - return self.tb_join_char.join(stb) - - def set_mode(self, mode: Optional[str] = None): - """Switch to the desired mode. - - If mode is not specified, cycles through the available modes.""" - - if not mode: - new_idx = (self.valid_modes.index(self.mode) + 1 ) % \ - len(self.valid_modes) - self.mode = self.valid_modes[new_idx] - elif mode not in self.valid_modes: - raise ValueError( - "Unrecognized mode in FormattedTB: <" + mode + ">\n" - "Valid modes: " + str(self.valid_modes) - ) - else: - assert isinstance(mode, str) - self.mode = mode - # include variable details only in 'Verbose' mode - self.include_vars = (self.mode == self.valid_modes[2]) - # Set the join character for generating text tracebacks - self.tb_join_char = self._join_chars[self.mode] - - # some convenient shortcuts - def plain(self): - self.set_mode(self.valid_modes[0]) - - def context(self): - self.set_mode(self.valid_modes[1]) - - def verbose(self): - self.set_mode(self.valid_modes[2]) - - def minimal(self): - self.set_mode(self.valid_modes[3]) - - -#---------------------------------------------------------------------------- -class AutoFormattedTB(FormattedTB): - """A traceback printer which can be called on the fly. - - It will find out about exceptions by itself. - - A brief example:: - - AutoTB = AutoFormattedTB(mode = 'Verbose',color_scheme='Linux') - try: - ... - except: - AutoTB() # or AutoTB(out=logfile) where logfile is an open file object - """ - - def __call__(self, etype=None, evalue=None, etb=None, - out=None, tb_offset=None): - """Print out a formatted exception traceback. - - Optional arguments: - - out: an open file-like object to direct output to. - - - tb_offset: the number of frames to skip over in the stack, on a - per-call basis (this overrides temporarily the instance's tb_offset - given at initialization time.""" - - if out is None: - out = self.ostream - out.flush() - out.write(self.text(etype, evalue, etb, tb_offset)) - out.write('\n') - out.flush() - # FIXME: we should remove the auto pdb behavior from here and leave - # that to the clients. - try: - self.debugger() - except KeyboardInterrupt: - print("\nKeyboardInterrupt") - - def structured_traceback( - self, - etype: type, - evalue: Optional[BaseException], - etb: Optional[TracebackType] = None, - tb_offset: Optional[int] = None, - number_of_lines_of_context: int = 5, - ): - # tb: TracebackType or tupleof tb types ? - if etype is None: - etype, evalue, etb = sys.exc_info() - if isinstance(etb, tuple): - # tb is a tuple if this is a chained exception. - self.tb = etb[0] - else: - self.tb = etb - return FormattedTB.structured_traceback( - self, etype, evalue, etb, tb_offset, number_of_lines_of_context - ) - - -#--------------------------------------------------------------------------- - -# A simple class to preserve Nathan's original functionality. -class ColorTB(FormattedTB): - """Shorthand to initialize a FormattedTB in Linux colors mode.""" - - def __init__(self, color_scheme='Linux', call_pdb=0, **kwargs): - FormattedTB.__init__(self, color_scheme=color_scheme, - call_pdb=call_pdb, **kwargs) - - -class SyntaxTB(ListTB): - """Extension which holds some state: the last exception value""" - - def __init__(self, color_scheme='NoColor', parent=None, config=None): - ListTB.__init__(self, color_scheme, parent=parent, config=config) - self.last_syntax_error = None - - def __call__(self, etype, value, elist): - self.last_syntax_error = value - - ListTB.__call__(self, etype, value, elist) - - def structured_traceback(self, etype, value, elist, tb_offset=None, - context=5): - # If the source file has been edited, the line in the syntax error can - # be wrong (retrieved from an outdated cache). This replaces it with - # the current value. - if isinstance(value, SyntaxError) \ - and isinstance(value.filename, str) \ - and isinstance(value.lineno, int): - linecache.checkcache(value.filename) - newtext = linecache.getline(value.filename, value.lineno) - if newtext: - value.text = newtext - self.last_syntax_error = value - return super(SyntaxTB, self).structured_traceback(etype, value, elist, - tb_offset=tb_offset, context=context) - - def clear_err_state(self): - """Return the current error state and clear it""" - e = self.last_syntax_error - self.last_syntax_error = None - return e - - def stb2text(self, stb): - """Convert a structured traceback (a list) to a string.""" - return ''.join(stb) - - -# some internal-use functions -def text_repr(value): - """Hopefully pretty robust repr equivalent.""" - # this is pretty horrible but should always return *something* - try: - return pydoc.text.repr(value) # type: ignore[call-arg] - except KeyboardInterrupt: - raise - except: - try: - return repr(value) - except KeyboardInterrupt: - raise - except: - try: - # all still in an except block so we catch - # getattr raising - name = getattr(value, '__name__', None) - if name: - # ick, recursion - return text_repr(name) - klass = getattr(value, '__class__', None) - if klass: - return '%s instance' % text_repr(klass) - except KeyboardInterrupt: - raise - except: - return 'UNRECOVERABLE REPR FAILURE' - - -def eqrepr(value, repr=text_repr): - return '=%s' % repr(value) - - -def nullrepr(value, repr=text_repr): - return '' diff --git a/.venv/lib/python3.12/site-packages/IPython/core/usage.py b/.venv/lib/python3.12/site-packages/IPython/core/usage.py deleted file mode 100644 index 53219bc..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/core/usage.py +++ /dev/null @@ -1,341 +0,0 @@ -# -*- coding: utf-8 -*- -"""Usage information for the main IPython applications. -""" -#----------------------------------------------------------------------------- -# Copyright (C) 2008-2011 The IPython Development Team -# Copyright (C) 2001-2007 Fernando Perez. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#----------------------------------------------------------------------------- - -import sys -from IPython.core import release - -cl_usage = """\ -========= - IPython -========= - -Tools for Interactive Computing in Python -========================================= - - A Python shell with automatic history (input and output), dynamic object - introspection, easier configuration, command completion, access to the - system shell and more. IPython can also be embedded in running programs. - - -Usage - - ipython [subcommand] [options] [-c cmd | -m mod | file] [--] [arg] ... - - If invoked with no options, it executes the file and exits, passing the - remaining arguments to the script, just as if you had specified the same - command with python. You may need to specify `--` before args to be passed - to the script, to prevent IPython from attempting to parse them. If you - specify the option `-i` before the filename, it will enter an interactive - IPython session after running the script, rather than exiting. Files ending - in .py will be treated as normal Python, but files ending in .ipy can - contain special IPython syntax (magic commands, shell expansions, etc.). - - Almost all configuration in IPython is available via the command-line. Do - `ipython --help-all` to see all available options. For persistent - configuration, look into your `ipython_config.py` configuration file for - details. - - This file is typically installed in the `IPYTHONDIR` directory, and there - is a separate configuration directory for each profile. The default profile - directory will be located in $IPYTHONDIR/profile_default. IPYTHONDIR - defaults to to `$HOME/.ipython`. For Windows users, $HOME resolves to - C:\\Users\\YourUserName in most instances. - - To initialize a profile with the default configuration file, do:: - - $> ipython profile create - - and start editing `IPYTHONDIR/profile_default/ipython_config.py` - - In IPython's documentation, we will refer to this directory as - `IPYTHONDIR`, you can change its default location by creating an - environment variable with this name and setting it to the desired path. - - For more information, see the manual available in HTML and PDF in your - installation, or online at https://ipython.org/documentation.html. -""" - -interactive_usage = """ -IPython -- An enhanced Interactive Python -========================================= - -IPython offers a fully compatible replacement for the standard Python -interpreter, with convenient shell features, special commands, command -history mechanism and output results caching. - -At your system command line, type 'ipython -h' to see the command line -options available. This document only describes interactive features. - -GETTING HELP ------------- - -Within IPython you have various way to access help: - - ? -> Introduction and overview of IPython's features (this screen). - object? -> Details about 'object'. - object?? -> More detailed, verbose information about 'object'. - %quickref -> Quick reference of all IPython specific syntax and magics. - help -> Access Python's own help system. - -If you are in terminal IPython you can quit this screen by pressing `q`. - - -MAIN FEATURES -------------- - -* Access to the standard Python help with object docstrings and the Python - manuals. Simply type 'help' (no quotes) to invoke it. - -* Magic commands: type %magic for information on the magic subsystem. - -* System command aliases, via the %alias command or the configuration file(s). - -* Dynamic object information: - - Typing ?word or word? prints detailed information about an object. Certain - long strings (code, etc.) get snipped in the center for brevity. - - Typing ??word or word?? gives access to the full information without - snipping long strings. Strings that are longer than the screen are printed - through the less pager. - - The ?/?? system gives access to the full source code for any object (if - available), shows function prototypes and other useful information. - - If you just want to see an object's docstring, type '%pdoc object' (without - quotes, and without % if you have automagic on). - -* Tab completion in the local namespace: - - At any time, hitting tab will complete any available python commands or - variable names, and show you a list of the possible completions if there's - no unambiguous one. It will also complete filenames in the current directory. - -* Search previous command history in multiple ways: - - - Start typing, and then use arrow keys up/down or (Ctrl-p/Ctrl-n) to search - through the history items that match what you've typed so far. - - - Hit Ctrl-r: opens a search prompt. Begin typing and the system searches - your history for lines that match what you've typed so far, completing as - much as it can. - - - %hist: search history by index. - -* Persistent command history across sessions. - -* Logging of input with the ability to save and restore a working session. - -* System shell with !. Typing !ls will run 'ls' in the current directory. - -* The reload command does a 'deep' reload of a module: changes made to the - module since you imported will actually be available without having to exit. - -* Verbose and colored exception traceback printouts. See the magic xmode and - xcolor functions for details (just type %magic). - -* Input caching system: - - IPython offers numbered prompts (In/Out) with input and output caching. All - input is saved and can be retrieved as variables (besides the usual arrow - key recall). - - The following GLOBAL variables always exist (so don't overwrite them!): - _i: stores previous input. - _ii: next previous. - _iii: next-next previous. - _ih : a list of all input _ih[n] is the input from line n. - - Additionally, global variables named _i are dynamically created ( - being the prompt counter), such that _i == _ih[] - - For example, what you typed at prompt 14 is available as _i14 and _ih[14]. - - You can create macros which contain multiple input lines from this history, - for later re-execution, with the %macro function. - - The history function %hist allows you to see any part of your input history - by printing a range of the _i variables. Note that inputs which contain - magic functions (%) appear in the history with a prepended comment. This is - because they aren't really valid Python code, so you can't exec them. - -* Output caching system: - - For output that is returned from actions, a system similar to the input - cache exists but using _ instead of _i. Only actions that produce a result - (NOT assignments, for example) are cached. If you are familiar with - Mathematica, IPython's _ variables behave exactly like Mathematica's % - variables. - - The following GLOBAL variables always exist (so don't overwrite them!): - _ (one underscore): previous output. - __ (two underscores): next previous. - ___ (three underscores): next-next previous. - - Global variables named _ are dynamically created ( being the prompt - counter), such that the result of output is always available as _. - - Finally, a global dictionary named _oh exists with entries for all lines - which generated output. - -* Directory history: - - Your history of visited directories is kept in the global list _dh, and the - magic %cd command can be used to go to any entry in that list. - -* Auto-parentheses and auto-quotes (adapted from Nathan Gray's LazyPython) - - 1. Auto-parentheses - - Callable objects (i.e. functions, methods, etc) can be invoked like - this (notice the commas between the arguments):: - - In [1]: callable_ob arg1, arg2, arg3 - - and the input will be translated to this:: - - callable_ob(arg1, arg2, arg3) - - This feature is off by default (in rare cases it can produce - undesirable side-effects), but you can activate it at the command-line - by starting IPython with `--autocall 1`, set it permanently in your - configuration file, or turn on at runtime with `%autocall 1`. - - You can force auto-parentheses by using '/' as the first character - of a line. For example:: - - In [1]: /globals # becomes 'globals()' - - Note that the '/' MUST be the first character on the line! This - won't work:: - - In [2]: print /globals # syntax error - - In most cases the automatic algorithm should work, so you should - rarely need to explicitly invoke /. One notable exception is if you - are trying to call a function with a list of tuples as arguments (the - parenthesis will confuse IPython):: - - In [1]: zip (1,2,3),(4,5,6) # won't work - - but this will work:: - - In [2]: /zip (1,2,3),(4,5,6) - ------> zip ((1,2,3),(4,5,6)) - Out[2]= [(1, 4), (2, 5), (3, 6)] - - IPython tells you that it has altered your command line by - displaying the new command line preceded by -->. e.g.:: - - In [18]: callable list - -------> callable (list) - - 2. Auto-Quoting - - You can force auto-quoting of a function's arguments by using ',' as - the first character of a line. For example:: - - In [1]: ,my_function /home/me # becomes my_function("/home/me") - - If you use ';' instead, the whole argument is quoted as a single - string (while ',' splits on whitespace):: - - In [2]: ,my_function a b c # becomes my_function("a","b","c") - In [3]: ;my_function a b c # becomes my_function("a b c") - - Note that the ',' MUST be the first character on the line! This - won't work:: - - In [4]: x = ,my_function /home/me # syntax error -""" - -interactive_usage_min = """\ -An enhanced console for Python. -Some of its features are: -- Tab completion in the local namespace. -- Logging of input, see command-line options. -- System shell escape via ! , eg !ls. -- Magic commands, starting with a % (like %ls, %pwd, %cd, etc.) -- Keeps track of locally defined variables via %who, %whos. -- Show object information with a ? eg ?x or x? (use ?? for more info). -""" - -quick_reference = r""" -IPython -- An enhanced Interactive Python - Quick Reference Card -================================================================ - -obj?, obj?? : Get help, or more help for object (also works as - ?obj, ??obj). -?foo.*abc* : List names in 'foo' containing 'abc' in them. -%magic : Information about IPython's 'magic' % functions. - -Magic functions are prefixed by % or %%, and typically take their arguments -without parentheses, quotes or even commas for convenience. Line magics take a -single % and cell magics are prefixed with two %%. - -Example magic function calls: - -%alias d ls -F : 'd' is now an alias for 'ls -F' -alias d ls -F : Works if 'alias' not a python name -alist = %alias : Get list of aliases to 'alist' -cd /usr/share : Obvious. cd - to choose from visited dirs. -%cd?? : See help AND source for magic %cd -%timeit x=10 : time the 'x=10' statement with high precision. -%%timeit x=2**100 -x**100 : time 'x**100' with a setup of 'x=2**100'; setup code is not - counted. This is an example of a cell magic. - -System commands: - -!cp a.txt b/ : System command escape, calls os.system() -cp a.txt b/ : after %rehashx, most system commands work without ! -cp ${f}.txt $bar : Variable expansion in magics and system commands -files = !ls /usr : Capture system command output -files.s, files.l, files.n: "a b c", ['a','b','c'], 'a\nb\nc' - -History: - -_i, _ii, _iii : Previous, next previous, next next previous input -_i4, _ih[2:5] : Input history line 4, lines 2-4 -exec(_i81) : Execute input history line #81 again -%rep 81 : Edit input history line #81 -_, __, ___ : previous, next previous, next next previous output -_dh : Directory history -_oh : Output history -%hist : Command history of current session. -%hist -g foo : Search command history of (almost) all sessions for 'foo'. -%hist -g : Command history of (almost) all sessions. -%hist 1/2-8 : Command history containing lines 2-8 of session 1. -%hist 1/ ~2/ : Command history of session 1 and 2 sessions before current. -%hist ~8/1-~6/5 : Command history from line 1 of 8 sessions ago to - line 5 of 6 sessions ago. -%edit 0/ : Open editor to execute code with history of current session. - -Autocall: - -f 1,2 : f(1,2) # Off by default, enable with %autocall magic. -/f 1,2 : f(1,2) (forced autoparen) -,f 1 2 : f("1","2") -;f 1 2 : f("1 2") - -Remember: TAB completion works in many contexts, not just file names -or python names. - -The following magic functions are currently available: - -""" - -default_banner_parts = ["Python %s\n"%sys.version.split("\n")[0], - "Type 'copyright', 'credits' or 'license' for more information\n" , - "IPython {version} -- An enhanced Interactive Python. Type '?' for help.\n".format(version=release.version), -] - -default_banner = ''.join(default_banner_parts) diff --git a/.venv/lib/python3.12/site-packages/IPython/display.py b/.venv/lib/python3.12/site-packages/IPython/display.py deleted file mode 100644 index 3ccbc48..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/display.py +++ /dev/null @@ -1,44 +0,0 @@ -"""Public API for display tools in IPython. -""" - -# ----------------------------------------------------------------------------- -# Copyright (C) 2012 The IPython Development Team -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -# ----------------------------------------------------------------------------- - -# ----------------------------------------------------------------------------- -# Imports -# ----------------------------------------------------------------------------- - -from IPython.core.display_functions import * -from IPython.core.display import ( - display_pretty as display_pretty, - display_html as display_html, - display_markdown as display_markdown, - display_svg as display_svg, - display_png as display_png, - display_jpeg as display_jpeg, - display_latex as display_latex, - display_json as display_json, - display_javascript as display_javascript, - display_pdf as display_pdf, - DisplayObject as DisplayObject, - TextDisplayObject as TextDisplayObject, - Pretty as Pretty, - HTML as HTML, - Markdown as Markdown, - Math as Math, - Latex as Latex, - SVG as SVG, - ProgressBar as ProgressBar, - JSON as JSON, - GeoJSON as GeoJSON, - Javascript as Javascript, - Image as Image, - set_matplotlib_formats as set_matplotlib_formats, - set_matplotlib_close as set_matplotlib_close, - Video as Video, -) -from IPython.lib.display import * diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/__init__.py b/.venv/lib/python3.12/site-packages/IPython/extensions/__init__.py deleted file mode 100644 index db7f79f..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/extensions/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -"""This directory is meant for IPython extensions.""" diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/extensions/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 7e5e21f0ce9a31d91a258541e701ecb2d76c6013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248 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 -# Copyright (C) 2012 The IPython Development Team -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -# ----------------------------------------------------------------------------- -# -# This IPython module is written by Pauli Virtanen, based on the autoreload -# code by Thomas Heller. - -# ----------------------------------------------------------------------------- -# Imports -# ----------------------------------------------------------------------------- - -import os -import sys -import traceback -import types -import weakref -import gc -import logging -from importlib import import_module, reload -from importlib.util import source_from_cache - -# ------------------------------------------------------------------------------ -# Autoreload functionality -# ------------------------------------------------------------------------------ - - -class ModuleReloader: - enabled = False - """Whether this reloader is enabled""" - - check_all = True - """Autoreload all modules, not just those listed in 'modules'""" - - autoload_obj = False - """Autoreload all modules AND autoload all new objects""" - - def __init__(self, shell=None): - # Modules that failed to reload: {module: mtime-on-failed-reload, ...} - self.failed = {} - # Modules specially marked as autoreloadable. - self.modules = {} - # Modules specially marked as not autoreloadable. - self.skip_modules = {} - # (module-name, name) -> weakref, for replacing old code objects - self.old_objects = {} - # Module modification timestamps - self.modules_mtimes = {} - self.shell = shell - - # Reporting callable for verbosity - self._report = lambda msg: None # by default, be quiet. - - # Cache module modification times - self.check(check_all=True, do_reload=False) - - # To hide autoreload errors - self.hide_errors = False - - def mark_module_skipped(self, module_name): - """Skip reloading the named module in the future""" - try: - del self.modules[module_name] - except KeyError: - pass - self.skip_modules[module_name] = True - - def mark_module_reloadable(self, module_name): - """Reload the named module in the future (if it is imported)""" - try: - del self.skip_modules[module_name] - except KeyError: - pass - self.modules[module_name] = True - - def aimport_module(self, module_name): - """Import a module, and mark it reloadable - - Returns - ------- - top_module : module - The imported module if it is top-level, or the top-level - top_name : module - Name of top_module - - """ - self.mark_module_reloadable(module_name) - - import_module(module_name) - top_name = module_name.split(".")[0] - top_module = sys.modules[top_name] - return top_module, top_name - - def filename_and_mtime(self, module): - if not hasattr(module, "__file__") or module.__file__ is None: - return None, None - - if getattr(module, "__name__", None) in [None, "__mp_main__", "__main__"]: - # we cannot reload(__main__) or reload(__mp_main__) - return None, None - - filename = module.__file__ - path, ext = os.path.splitext(filename) - - if ext.lower() == ".py": - py_filename = filename - else: - try: - py_filename = source_from_cache(filename) - except ValueError: - return None, None - - try: - pymtime = os.stat(py_filename).st_mtime - except OSError: - return None, None - - return py_filename, pymtime - - def check(self, check_all=False, do_reload=True): - """Check whether some modules need to be reloaded.""" - - if not self.enabled and not check_all: - return - - if check_all or self.check_all: - modules = list(sys.modules.keys()) - else: - modules = list(self.modules.keys()) - - for modname in modules: - m = sys.modules.get(modname, None) - - if modname in self.skip_modules: - continue - - py_filename, pymtime = self.filename_and_mtime(m) - if py_filename is None: - continue - - try: - if pymtime <= self.modules_mtimes[modname]: - continue - except KeyError: - self.modules_mtimes[modname] = pymtime - continue - else: - if self.failed.get(py_filename, None) == pymtime: - continue - - self.modules_mtimes[modname] = pymtime - - # If we've reached this point, we should try to reload the module - if do_reload: - self._report(f"Reloading '{modname}'.") - try: - if self.autoload_obj: - superreload(m, reload, self.old_objects, self.shell) - else: - superreload(m, reload, self.old_objects) - if py_filename in self.failed: - del self.failed[py_filename] - except: - if not self.hide_errors: - print( - "[autoreload of {} failed: {}]".format( - modname, traceback.format_exc(10) - ), - file=sys.stderr, - ) - self.failed[py_filename] = pymtime - - -# ------------------------------------------------------------------------------ -# superreload -# ------------------------------------------------------------------------------ - - -func_attrs = [ - "__code__", - "__defaults__", - "__doc__", - "__closure__", - "__globals__", - "__dict__", -] - - -def update_function(old, new): - """Upgrade the code object of a function""" - for name in func_attrs: - try: - setattr(old, name, getattr(new, name)) - except (AttributeError, TypeError): - pass - - -def update_instances(old, new): - """Use garbage collector to find all instances that refer to the old - class definition and update their __class__ to point to the new class - definition""" - - refs = gc.get_referrers(old) - - for ref in refs: - if type(ref) is old: - object.__setattr__(ref, "__class__", new) - - -def update_class(old, new): - """Replace stuff in the __dict__ of a class, and upgrade - method code objects, and add new methods, if any""" - for key in list(old.__dict__.keys()): - old_obj = getattr(old, key) - try: - new_obj = getattr(new, key) - # explicitly checking that comparison returns True to handle - # cases where `==` doesn't return a boolean. - if (old_obj == new_obj) is True: - continue - except AttributeError: - # obsolete attribute: remove it - try: - delattr(old, key) - except (AttributeError, TypeError): - pass - continue - except ValueError: - # can't compare nested structures containing - # numpy arrays using `==` - pass - - if update_generic(old_obj, new_obj): - continue - - try: - setattr(old, key, getattr(new, key)) - except (AttributeError, TypeError): - pass # skip non-writable attributes - - for key in list(new.__dict__.keys()): - if key not in list(old.__dict__.keys()): - try: - setattr(old, key, getattr(new, key)) - except (AttributeError, TypeError): - pass # skip non-writable attributes - - # update all instances of class - update_instances(old, new) - - -def update_property(old, new): - """Replace get/set/del functions of a property""" - update_generic(old.fdel, new.fdel) - update_generic(old.fget, new.fget) - update_generic(old.fset, new.fset) - - -def isinstance2(a, b, typ): - return isinstance(a, typ) and isinstance(b, typ) - - -UPDATE_RULES = [ - (lambda a, b: isinstance2(a, b, type), update_class), - (lambda a, b: isinstance2(a, b, types.FunctionType), update_function), - (lambda a, b: isinstance2(a, b, property), update_property), -] -UPDATE_RULES.extend( - [ - ( - lambda a, b: isinstance2(a, b, types.MethodType), - lambda a, b: update_function(a.__func__, b.__func__), - ), - ] -) - - -def update_generic(a, b): - for type_check, update in UPDATE_RULES: - if type_check(a, b): - update(a, b) - return True - return False - - -class StrongRef: - def __init__(self, obj): - self.obj = obj - - def __call__(self): - return self.obj - - -mod_attrs = [ - "__name__", - "__doc__", - "__package__", - "__loader__", - "__spec__", - "__file__", - "__cached__", - "__builtins__", -] - - -def append_obj(module, d, name, obj, autoload=False): - in_module = hasattr(obj, "__module__") and obj.__module__ == module.__name__ - if autoload: - # check needed for module global built-ins - if not in_module and name in mod_attrs: - return False - else: - if not in_module: - return False - - key = (module.__name__, name) - try: - d.setdefault(key, []).append(weakref.ref(obj)) - except TypeError: - pass - return True - - -def superreload(module, reload=reload, old_objects=None, shell=None): - """Enhanced version of the builtin reload function. - - superreload remembers objects previously in the module, and - - - upgrades the class dictionary of every old class in the module - - upgrades the code object of every old function and method - - clears the module's namespace before reloading - - """ - if old_objects is None: - old_objects = {} - - # collect old objects in the module - for name, obj in list(module.__dict__.items()): - if not append_obj(module, old_objects, name, obj): - continue - key = (module.__name__, name) - try: - old_objects.setdefault(key, []).append(weakref.ref(obj)) - except TypeError: - pass - - # reload module - try: - # clear namespace first from old cruft - old_dict = module.__dict__.copy() - old_name = module.__name__ - module.__dict__.clear() - module.__dict__["__name__"] = old_name - module.__dict__["__loader__"] = old_dict["__loader__"] - except (TypeError, AttributeError, KeyError): - pass - - try: - module = reload(module) - except: - # restore module dictionary on failed reload - module.__dict__.update(old_dict) - raise - - # iterate over all objects and update functions & classes - for name, new_obj in list(module.__dict__.items()): - key = (module.__name__, name) - if key not in old_objects: - # here 'shell' acts both as a flag and as an output var - if ( - shell is None - or name == "Enum" - or not append_obj(module, old_objects, name, new_obj, True) - ): - continue - shell.user_ns[name] = new_obj - - new_refs = [] - for old_ref in old_objects[key]: - old_obj = old_ref() - if old_obj is None: - continue - new_refs.append(old_ref) - update_generic(old_obj, new_obj) - - if new_refs: - old_objects[key] = new_refs - else: - del old_objects[key] - - return module - - -# ------------------------------------------------------------------------------ -# IPython connectivity -# ------------------------------------------------------------------------------ - - -@magics_class -class AutoreloadMagics(Magics): - def __init__(self, *a, **kw): - super().__init__(*a, **kw) - self._reloader = ModuleReloader(self.shell) - self._reloader.check_all = False - self._reloader.autoload_obj = False - self.loaded_modules = set(sys.modules) - - @line_magic - @magic_arguments.magic_arguments() - @magic_arguments.argument( - "mode", - type=str, - default="now", - nargs="?", - help="""blank or 'now' - Reload all modules (except those excluded by %%aimport) - automatically now. - - '0' or 'off' - Disable automatic reloading. - - '1' or 'explicit' - Reload only modules imported with %%aimport every - time before executing the Python code typed. - - '2' or 'all' - Reload all modules (except those excluded by %%aimport) - every time before executing the Python code typed. - - '3' or 'complete' - Same as 2/all, but also but also adds any new - objects in the module. - """, - ) - @magic_arguments.argument( - "-p", - "--print", - action="store_true", - default=False, - help="Show autoreload activity using `print` statements", - ) - @magic_arguments.argument( - "-l", - "--log", - action="store_true", - default=False, - help="Show autoreload activity using the logger", - ) - @magic_arguments.argument( - "--hide-errors", - action="store_true", - default=False, - help="Hide autoreload errors", - ) - def autoreload(self, line=""): - r"""%autoreload => Reload modules automatically - - %autoreload or %autoreload now - Reload all modules (except those excluded by %aimport) automatically - now. - - %autoreload 0 or %autoreload off - Disable automatic reloading. - - %autoreload 1 or %autoreload explicit - Reload only modules imported with %aimport every time before executing - the Python code typed. - - %autoreload 2 or %autoreload all - Reload all modules (except those excluded by %aimport) every time - before executing the Python code typed. - - %autoreload 3 or %autoreload complete - Same as 2/all, but also but also adds any new objects in the module. See - unit test at IPython/extensions/tests/test_autoreload.py::test_autoload_newly_added_objects - - The optional arguments --print and --log control display of autoreload activity. The default - is to act silently; --print (or -p) will print out the names of modules that are being - reloaded, and --log (or -l) outputs them to the log at INFO level. - - The optional argument --hide-errors hides any errors that can happen when trying to - reload code. - - Reloading Python modules in a reliable way is in general - difficult, and unexpected things may occur. %autoreload tries to - work around common pitfalls by replacing function code objects and - parts of classes previously in the module with new versions. This - makes the following things to work: - - - Functions and classes imported via 'from xxx import foo' are upgraded - to new versions when 'xxx' is reloaded. - - - Methods and properties of classes are upgraded on reload, so that - calling 'c.foo()' on an object 'c' created before the reload causes - the new code for 'foo' to be executed. - - Some of the known remaining caveats are: - - - Replacing code objects does not always succeed: changing a @property - in a class to an ordinary method or a method to a member variable - can cause problems (but in old objects only). - - - Functions that are removed (eg. via monkey-patching) from a module - before it is reloaded are not upgraded. - - - C extension modules cannot be reloaded, and so cannot be - autoreloaded. - - """ - args = magic_arguments.parse_argstring(self.autoreload, line) - mode = args.mode.lower() - - p = print - - logger = logging.getLogger("autoreload") - - l = logger.info - - def pl(msg): - p(msg) - l(msg) - - if args.print is False and args.log is False: - self._reloader._report = lambda msg: None - elif args.print is True: - if args.log is True: - self._reloader._report = pl - else: - self._reloader._report = p - elif args.log is True: - self._reloader._report = l - - self._reloader.hide_errors = args.hide_errors - - if mode == "" or mode == "now": - self._reloader.check(True) - elif mode == "0" or mode == "off": - self._reloader.enabled = False - elif mode == "1" or mode == "explicit": - self._reloader.enabled = True - self._reloader.check_all = False - self._reloader.autoload_obj = False - elif mode == "2" or mode == "all": - self._reloader.enabled = True - self._reloader.check_all = True - self._reloader.autoload_obj = False - elif mode == "3" or mode == "complete": - self._reloader.enabled = True - self._reloader.check_all = True - self._reloader.autoload_obj = True - else: - raise ValueError(f'Unrecognized autoreload mode "{mode}".') - - @line_magic - def aimport(self, parameter_s="", stream=None): - """%aimport => Import modules for automatic reloading. - - %aimport - List modules to automatically import and not to import. - - %aimport foo - Import module 'foo' and mark it to be autoreloaded for %autoreload explicit - - %aimport foo, bar - Import modules 'foo', 'bar' and mark them to be autoreloaded for %autoreload explicit - - %aimport -foo, bar - Mark module 'foo' to not be autoreloaded for %autoreload explicit, all, or complete, and 'bar' - to be autoreloaded for mode explicit. - """ - modname = parameter_s - if not modname: - to_reload = sorted(self._reloader.modules.keys()) - to_skip = sorted(self._reloader.skip_modules.keys()) - if stream is None: - stream = sys.stdout - if self._reloader.check_all: - stream.write("Modules to reload:\nall-except-skipped\n") - else: - stream.write("Modules to reload:\n%s\n" % " ".join(to_reload)) - stream.write("\nModules to skip:\n%s\n" % " ".join(to_skip)) - else: - for _module in [_.strip() for _ in modname.split(",")]: - if _module.startswith("-"): - _module = _module[1:].strip() - self._reloader.mark_module_skipped(_module) - else: - top_module, top_name = self._reloader.aimport_module(_module) - - # Inject module to user namespace - self.shell.push({top_name: top_module}) - - def pre_run_cell(self, info): - if self._reloader.enabled: - try: - self._reloader.check() - except: - pass - - def post_execute_hook(self): - """Cache the modification times of any modules imported in this execution""" - newly_loaded_modules = set(sys.modules) - self.loaded_modules - for modname in newly_loaded_modules: - _, pymtime = self._reloader.filename_and_mtime(sys.modules[modname]) - if pymtime is not None: - self._reloader.modules_mtimes[modname] = pymtime - - self.loaded_modules.update(newly_loaded_modules) - - -def load_ipython_extension(ip): - """Load the extension in IPython.""" - auto_reload = AutoreloadMagics(ip) - ip.register_magics(auto_reload) - ip.events.register("pre_run_cell", auto_reload.pre_run_cell) - ip.events.register("post_execute", auto_reload.post_execute_hook) diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/storemagic.py b/.venv/lib/python3.12/site-packages/IPython/extensions/storemagic.py deleted file mode 100644 index 1ab56f7..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/extensions/storemagic.py +++ /dev/null @@ -1,236 +0,0 @@ -# -*- coding: utf-8 -*- -""" -%store magic for lightweight persistence. - -Stores variables, aliases and macros in IPython's database. - -To automatically restore stored variables at startup, add this to your -:file:`ipython_config.py` file:: - - c.StoreMagics.autorestore = True -""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - -import inspect, os, sys, textwrap - -from IPython.core.error import UsageError -from IPython.core.magic import Magics, magics_class, line_magic -from IPython.testing.skipdoctest import skip_doctest -from traitlets import Bool - - -def restore_aliases(ip, alias=None): - staliases = ip.db.get('stored_aliases', {}) - if alias is None: - for k,v in staliases.items(): - # print("restore alias",k,v) # dbg - #self.alias_table[k] = v - ip.alias_manager.define_alias(k,v) - else: - ip.alias_manager.define_alias(alias, staliases[alias]) - - -def refresh_variables(ip): - db = ip.db - for key in db.keys('autorestore/*'): - # strip autorestore - justkey = os.path.basename(key) - try: - obj = db[key] - except KeyError: - print("Unable to restore variable '%s', ignoring (use %%store -d to forget!)" % justkey) - print("The error was:", sys.exc_info()[0]) - else: - # print("restored",justkey,"=",obj) # dbg - ip.user_ns[justkey] = obj - - -def restore_dhist(ip): - ip.user_ns['_dh'] = ip.db.get('dhist',[]) - - -def restore_data(ip): - refresh_variables(ip) - restore_aliases(ip) - restore_dhist(ip) - - -@magics_class -class StoreMagics(Magics): - """Lightweight persistence for python variables. - - Provides the %store magic.""" - - autorestore = Bool(False, help= - """If True, any %store-d variables will be automatically restored - when IPython starts. - """ - ).tag(config=True) - - def __init__(self, shell): - super(StoreMagics, self).__init__(shell=shell) - self.shell.configurables.append(self) - if self.autorestore: - restore_data(self.shell) - - @skip_doctest - @line_magic - def store(self, parameter_s=''): - """Lightweight persistence for python variables. - - Example:: - - In [1]: l = ['hello',10,'world'] - In [2]: %store l - Stored 'l' (list) - In [3]: exit - - (IPython session is closed and started again...) - - ville@badger:~$ ipython - In [1]: l - NameError: name 'l' is not defined - In [2]: %store -r - In [3]: l - Out[3]: ['hello', 10, 'world'] - - Usage: - - * ``%store`` - Show list of all variables and their current - values - * ``%store spam bar`` - Store the *current* value of the variables spam - and bar to disk - * ``%store -d spam`` - Remove the variable and its value from storage - * ``%store -z`` - Remove all variables from storage - * ``%store -r`` - Refresh all variables, aliases and directory history - from store (overwrite current vals) - * ``%store -r spam bar`` - Refresh specified variables and aliases from store - (delete current val) - * ``%store foo >a.txt`` - Store value of foo to new file a.txt - * ``%store foo >>a.txt`` - Append value of foo to file a.txt - - It should be noted that if you change the value of a variable, you - need to %store it again if you want to persist the new value. - - Note also that the variables will need to be pickleable; most basic - python types can be safely %store'd. - - Also aliases can be %store'd across sessions. - To remove an alias from the storage, use the %unalias magic. - """ - - opts,argsl = self.parse_options(parameter_s,'drz',mode='string') - args = argsl.split() - ip = self.shell - db = ip.db - # delete - if 'd' in opts: - try: - todel = args[0] - except IndexError as e: - raise UsageError('You must provide the variable to forget') from e - else: - try: - del db['autorestore/' + todel] - except BaseException as e: - raise UsageError("Can't delete variable '%s'" % todel) from e - # reset - elif 'z' in opts: - for k in db.keys('autorestore/*'): - del db[k] - - elif 'r' in opts: - if args: - for arg in args: - try: - obj = db["autorestore/" + arg] - except KeyError: - try: - restore_aliases(ip, alias=arg) - except KeyError: - print("no stored variable or alias %s" % arg) - else: - ip.user_ns[arg] = obj - else: - restore_data(ip) - - # run without arguments -> list variables & values - elif not args: - vars = db.keys('autorestore/*') - vars.sort() - if vars: - size = max(map(len, vars)) - else: - size = 0 - - print('Stored variables and their in-db values:') - fmt = '%-'+str(size)+'s -> %s' - get = db.get - for var in vars: - justkey = os.path.basename(var) - # print 30 first characters from every var - print(fmt % (justkey, repr(get(var, ''))[:50])) - - # default action - store the variable - else: - # %store foo >file.txt or >>file.txt - if len(args) > 1 and args[1].startswith(">"): - fnam = os.path.expanduser(args[1].lstrip(">").lstrip()) - if args[1].startswith(">>"): - fil = open(fnam, "a", encoding="utf-8") - else: - fil = open(fnam, "w", encoding="utf-8") - with fil: - obj = ip.ev(args[0]) - print("Writing '%s' (%s) to file '%s'." % (args[0], - obj.__class__.__name__, fnam)) - - if not isinstance (obj, str): - from pprint import pprint - pprint(obj, fil) - else: - fil.write(obj) - if not obj.endswith('\n'): - fil.write('\n') - - return - - # %store foo - for arg in args: - try: - obj = ip.user_ns[arg] - except KeyError: - # it might be an alias - name = arg - try: - cmd = ip.alias_manager.retrieve_alias(name) - except ValueError as e: - raise UsageError("Unknown variable '%s'" % name) from e - - staliases = db.get('stored_aliases',{}) - staliases[name] = cmd - db['stored_aliases'] = staliases - print("Alias stored: %s (%s)" % (name, cmd)) - return - - else: - modname = getattr(inspect.getmodule(obj), '__name__', '') - if modname == '__main__': - print(textwrap.dedent("""\ - Warning:%s is %s - Proper storage of interactively declared classes (or instances - of those classes) is not possible! Only instances - of classes in real modules on file system can be %%store'd. - """ % (arg, obj) )) - return - #pickled = pickle.dumps(obj) - db[ 'autorestore/' + arg ] = obj - print("Stored '%s' (%s)" % (arg, obj.__class__.__name__)) - - -def load_ipython_extension(ip): - """Load the extension in IPython.""" - ip.register_magics(StoreMagics) - diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__init__.py b/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c633bcf565cd8d8f363dd09beadc89a08f8adb6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmX@j%ge<81d5Cc(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!ir3G`&rQ|ODl1D( z(N9S&(=SOaE-A<^*4Hab%`4N-$xPBOs4U6I&okCDG}155EJ@WZNKDR7OiwM=_Y45b z=%-ecq~;Z8=I0fIbru*uC&Da}c>D`ExO#|Xs5AjU^#Mn=XW HW*`dyOmH&H diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_autoreload.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_autoreload.cpython-312.pyc deleted file mode 100644 index 72217712143540829e8a1ac3bf2e9c632fc2261d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32485 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 L@z)go5*YcvaoWbq diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_storemagic.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/extensions/tests/__pycache__/test_storemagic.cpython-312.pyc deleted file mode 100644 index bc28ed8ea4beb2e5f5a1b6fdd1215ba8a695cb68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4509 zcmbstTTC0-b?(gA9(%COvmqfV6NAG#1Ut!Y)Rax5g^+4X6nC|yA4RIX4tFp%esyMG zgO#YHO-1Ok3X$5vN-Hh>%POtKr%X4xD! z$sq#cvV6`p>4G_bpP6)H7xW(NhF(}e5zlkNEFM87|6Wp?fzf@fke^PcrmBa~frp-h z-_CjH))9|yVJ3mLQall=I3P`!}5GglU1!atHz@9a(+IRP2Y+Y7qpo|{>|ux zi!n8=$wS5D)NC>(tFiCBM|Waypqy9Jg}h3stv=DXLA1DFwy3f;S4`vzcrGg|emL3# zKeZjYMP{3KSNJZ2?^?}locoH8DI$RPsKx~Vs+wJxEfI4dn|f-d0;F1-N2+HWO!TA* z_!+|7ktlc@h3iNZZX1Q?NECvN!h1Lc=B|JQHXNdfeGU7t*mw%K#fI&m8SEk)vA+qH zhn`D}L|X#> z#~FA#_Sfb_(M~AltJpRPop3uS_m&3tCitBc-|vX;VBZY+xb`*7VP^{*mEQG#(tBP( zAJ}(MSZ3M|!Z3P*EGTOF)^JzD&M7;#gRJ-)RJY*3d+eCb@A6oKugzjkTsg|s_I_;m zP7-$v>92ENZ^vPa&lJ2(g%R^ft1cm zbE>Q)@~X*A7Ya>@0A~-88vx|63r!BQ&>TohMBC{D7 zd3<_BTOIqTR0)QRU})n)B^WjWBmYr}s6X!?KoP$}LZj)aJ~hQlR)QwyisX8xCpU}9 z!esF+lPeaArk~mY(y%;aQHmLu%VUrP5;F=ng|u3oamoCG$re=8rQ~p0i6BJ+-YQY! zJ5)Zi{h(0F5NwMC?!<8zzE6CH7}EI(y?^2<^kV2$@Ml5|UkJV6Sl8Rn zJi|LK7`I^UX1r}xZU=Xtb)UFDx-@=o{J|XLa*d=erT1Pa^B1>zPF1&W8+`XxPp@sY zEp}AI9z*PTDxO*#Ymnmgu`++Uu}-bemHF^t>z|hS*uULOOW@(9{gE~K`i-X&u-@*?Y;+e;xP4S%0pVP&2d*S_?VpQj& zx)_BMTpl9oQv66Zn;ut9kwKf^F7w0WX2Z+FtFj@U++a6}Z9`yH09%Tzi2a7xzwyJeT|`1K zV~D*Q7dOSQ&WCj|T;oH*Z*7VLIzOO`1OKR}#QKbX4LtC~)DkIfTz%+kaY9|TbS`e*3Ct-i|HSsqI8J@hU6Rxjzo@ogdS zk+3+jC50D9mTum=S>{h|w|A~Z9z_;!ykG^FwAIiuzJfjO|^x&DT{x=?=hyG=MSvc)Pu^nuCSXwTvhmD}LF}g{~fcRNw z?+W{|_vPvhGVH3PNcdu4)O~H3`EuAl=HWoueE?Gip));2_?H4|e=F7=)0AXd%gUM> zwKNqas+1LK4qD68phGpJkcx*o0V@IvSFDo%sxk~4By_2e3@|S^gwWrZj=wV9|76a7 U?MCSQ*TNv`*qKB@BvJbR0^bvDb^rhX diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/test_autoreload.py b/.venv/lib/python3.12/site-packages/IPython/extensions/tests/test_autoreload.py deleted file mode 100644 index 47f3e2d..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/test_autoreload.py +++ /dev/null @@ -1,712 +0,0 @@ -"""Tests for autoreload extension. -""" - -# ----------------------------------------------------------------------------- -# Copyright (c) 2012 IPython Development Team. -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -# ----------------------------------------------------------------------------- - -# ----------------------------------------------------------------------------- -# Imports -# ----------------------------------------------------------------------------- - -import os -import platform -import pytest -import sys -import tempfile -import textwrap -import shutil -import random -import time -import traceback -from io import StringIO -from dataclasses import dataclass - -import IPython.testing.tools as tt - -from unittest import TestCase - -from IPython.extensions.autoreload import AutoreloadMagics -from IPython.core.events import EventManager, pre_run_cell -from IPython.testing.decorators import skipif_not_numpy -from IPython.core.interactiveshell import ExecutionInfo - -if platform.python_implementation() == "PyPy": - pytest.skip( - "Current autoreload implementation is extremely slow on PyPy", - allow_module_level=True, - ) - -# ----------------------------------------------------------------------------- -# Test fixture -# ----------------------------------------------------------------------------- - -noop = lambda *a, **kw: None - - -class FakeShell: - def __init__(self): - self.ns = {} - self.user_ns = self.ns - self.user_ns_hidden = {} - self.events = EventManager(self, {"pre_run_cell", pre_run_cell}) - self.auto_magics = AutoreloadMagics(shell=self) - self.events.register("pre_run_cell", self.auto_magics.pre_run_cell) - - register_magics = set_hook = noop - - def showtraceback( - self, - exc_tuple=None, - filename=None, - tb_offset=None, - exception_only=False, - running_compiled_code=False, - ): - traceback.print_exc() - - def run_code(self, code): - self.events.trigger( - "pre_run_cell", - ExecutionInfo( - raw_cell="", - store_history=False, - silent=False, - shell_futures=False, - cell_id=None, - ), - ) - exec(code, self.user_ns) - self.auto_magics.post_execute_hook() - - def push(self, items): - self.ns.update(items) - - def magic_autoreload(self, parameter): - self.auto_magics.autoreload(parameter) - - def magic_aimport(self, parameter, stream=None): - self.auto_magics.aimport(parameter, stream=stream) - self.auto_magics.post_execute_hook() - - -class Fixture(TestCase): - """Fixture for creating test module files""" - - test_dir = None - old_sys_path = None - filename_chars = "abcdefghijklmopqrstuvwxyz0123456789" - - def setUp(self): - self.test_dir = tempfile.mkdtemp() - self.old_sys_path = list(sys.path) - sys.path.insert(0, self.test_dir) - self.shell = FakeShell() - - def tearDown(self): - shutil.rmtree(self.test_dir) - sys.path = self.old_sys_path - - self.test_dir = None - self.old_sys_path = None - self.shell = None - - def get_module(self): - module_name = "tmpmod_" + "".join(random.sample(self.filename_chars, 20)) - if module_name in sys.modules: - del sys.modules[module_name] - file_name = os.path.join(self.test_dir, module_name + ".py") - return module_name, file_name - - def write_file(self, filename, content): - """ - Write a file, and force a timestamp difference of at least one second - - Notes - ----- - Python's .pyc files record the timestamp of their compilation - with a time resolution of one second. - - Therefore, we need to force a timestamp difference between .py - and .pyc, without having the .py file be timestamped in the - future, and without changing the timestamp of the .pyc file - (because that is stored in the file). The only reliable way - to achieve this seems to be to sleep. - """ - content = textwrap.dedent(content) - # Sleep one second + eps - time.sleep(1.05) - - # Write - with open(filename, "w", encoding="utf-8") as f: - f.write(content) - - def new_module(self, code): - code = textwrap.dedent(code) - mod_name, mod_fn = self.get_module() - with open(mod_fn, "w", encoding="utf-8") as f: - f.write(code) - return mod_name, mod_fn - - -# ----------------------------------------------------------------------------- -# Test automatic reloading -# ----------------------------------------------------------------------------- - - -def pickle_get_current_class(obj): - """ - Original issue comes from pickle; hence the name. - """ - name = obj.__class__.__name__ - module_name = getattr(obj, "__module__", None) - obj2 = sys.modules[module_name] - for subpath in name.split("."): - obj2 = getattr(obj2, subpath) - return obj2 - - -class TestAutoreload(Fixture): - def test_reload_enums(self): - mod_name, mod_fn = self.new_module( - textwrap.dedent( - """ - from enum import Enum - class MyEnum(Enum): - A = 'A' - B = 'B' - """ - ) - ) - self.shell.magic_autoreload("2") - self.shell.magic_aimport(mod_name) - self.write_file( - mod_fn, - textwrap.dedent( - """ - from enum import Enum - class MyEnum(Enum): - A = 'A' - B = 'B' - C = 'C' - """ - ), - ) - with tt.AssertNotPrints( - ("[autoreload of %s failed:" % mod_name), channel="stderr" - ): - self.shell.run_code("pass") # trigger another reload - - def test_reload_class_type(self): - self.shell.magic_autoreload("2") - mod_name, mod_fn = self.new_module( - """ - class Test(): - def meth(self): - return "old" - """ - ) - assert "test" not in self.shell.ns - assert "result" not in self.shell.ns - - self.shell.run_code("from %s import Test" % mod_name) - self.shell.run_code("test = Test()") - - self.write_file( - mod_fn, - """ - class Test(): - def meth(self): - return "new" - """, - ) - - test_object = self.shell.ns["test"] - - # important to trigger autoreload logic ! - self.shell.run_code("pass") - - test_class = pickle_get_current_class(test_object) - assert isinstance(test_object, test_class) - - # extra check. - self.shell.run_code("import pickle") - self.shell.run_code("p = pickle.dumps(test)") - - def test_reload_class_attributes(self): - self.shell.magic_autoreload("2") - mod_name, mod_fn = self.new_module( - textwrap.dedent( - """ - class MyClass: - - def __init__(self, a=10): - self.a = a - self.b = 22 - # self.toto = 33 - - def square(self): - print('compute square') - return self.a*self.a - """ - ) - ) - self.shell.run_code("from %s import MyClass" % mod_name) - self.shell.run_code("first = MyClass(5)") - self.shell.run_code("first.square()") - with self.assertRaises(AttributeError): - self.shell.run_code("first.cube()") - with self.assertRaises(AttributeError): - self.shell.run_code("first.power(5)") - self.shell.run_code("first.b") - with self.assertRaises(AttributeError): - self.shell.run_code("first.toto") - - # remove square, add power - - self.write_file( - mod_fn, - textwrap.dedent( - """ - class MyClass: - - def __init__(self, a=10): - self.a = a - self.b = 11 - - def power(self, p): - print('compute power '+str(p)) - return self.a**p - """ - ), - ) - - self.shell.run_code("second = MyClass(5)") - - for object_name in {"first", "second"}: - self.shell.run_code(f"{object_name}.power(5)") - with self.assertRaises(AttributeError): - self.shell.run_code(f"{object_name}.cube()") - with self.assertRaises(AttributeError): - self.shell.run_code(f"{object_name}.square()") - self.shell.run_code(f"{object_name}.b") - self.shell.run_code(f"{object_name}.a") - with self.assertRaises(AttributeError): - self.shell.run_code(f"{object_name}.toto") - - @skipif_not_numpy - def test_comparing_numpy_structures(self): - self.shell.magic_autoreload("2") - self.shell.run_code("1+1") - mod_name, mod_fn = self.new_module( - textwrap.dedent( - """ - import numpy as np - class MyClass: - a = (np.array((.1, .2)), - np.array((.2, .3))) - """ - ) - ) - self.shell.run_code("from %s import MyClass" % mod_name) - self.shell.run_code("first = MyClass()") - - # change property `a` - self.write_file( - mod_fn, - textwrap.dedent( - """ - import numpy as np - class MyClass: - a = (np.array((.3, .4)), - np.array((.5, .6))) - """ - ), - ) - - with tt.AssertNotPrints( - ("[autoreload of %s failed:" % mod_name), channel="stderr" - ): - self.shell.run_code("pass") # trigger another reload - - def test_autoload_newly_added_objects(self): - # All of these fail with %autoreload 2 - self.shell.magic_autoreload("3") - mod_code = """ - def func1(): pass - """ - mod_name, mod_fn = self.new_module(textwrap.dedent(mod_code)) - self.shell.run_code(f"from {mod_name} import *") - self.shell.run_code("func1()") - with self.assertRaises(NameError): - self.shell.run_code("func2()") - with self.assertRaises(NameError): - self.shell.run_code("t = Test()") - with self.assertRaises(NameError): - self.shell.run_code("number") - - # ----------- TEST NEW OBJ LOADED -------------------------- - - new_code = """ - def func1(): pass - def func2(): pass - class Test: pass - number = 0 - from enum import Enum - class TestEnum(Enum): - A = 'a' - """ - self.write_file(mod_fn, textwrap.dedent(new_code)) - - # test function now exists in shell's namespace namespace - self.shell.run_code("func2()") - # test function now exists in module's dict - self.shell.run_code(f"import sys; sys.modules['{mod_name}'].func2()") - # test class now exists - self.shell.run_code("t = Test()") - # test global built-in var now exists - self.shell.run_code("number") - # test the enumerations gets loaded successfully - self.shell.run_code("TestEnum.A") - - # ----------- TEST NEW OBJ CAN BE CHANGED -------------------- - - new_code = """ - def func1(): return 'changed' - def func2(): return 'changed' - class Test: - def new_func(self): - return 'changed' - number = 1 - from enum import Enum - class TestEnum(Enum): - A = 'a' - B = 'added' - """ - self.write_file(mod_fn, textwrap.dedent(new_code)) - self.shell.run_code("assert func1() == 'changed'") - self.shell.run_code("assert func2() == 'changed'") - self.shell.run_code("t = Test(); assert t.new_func() == 'changed'") - self.shell.run_code("assert number == 1") - if sys.version_info < (3, 12): - self.shell.run_code("assert TestEnum.B.value == 'added'") - - # ----------- TEST IMPORT FROM MODULE -------------------------- - - new_mod_code = """ - from enum import Enum - class Ext(Enum): - A = 'ext' - def ext_func(): - return 'ext' - class ExtTest: - def meth(self): - return 'ext' - ext_int = 2 - """ - new_mod_name, new_mod_fn = self.new_module(textwrap.dedent(new_mod_code)) - current_mod_code = f""" - from {new_mod_name} import * - """ - self.write_file(mod_fn, textwrap.dedent(current_mod_code)) - self.shell.run_code("assert Ext.A.value == 'ext'") - self.shell.run_code("assert ext_func() == 'ext'") - self.shell.run_code("t = ExtTest(); assert t.meth() == 'ext'") - self.shell.run_code("assert ext_int == 2") - - def test_verbose_names(self): - # Asserts correspondense between original mode names and their verbose equivalents. - @dataclass - class AutoreloadSettings: - check_all: bool - enabled: bool - autoload_obj: bool - - def gather_settings(mode): - self.shell.magic_autoreload(mode) - module_reloader = self.shell.auto_magics._reloader - return AutoreloadSettings( - module_reloader.check_all, - module_reloader.enabled, - module_reloader.autoload_obj, - ) - - assert gather_settings("0") == gather_settings("off") - assert gather_settings("0") == gather_settings("OFF") # Case insensitive - assert gather_settings("1") == gather_settings("explicit") - assert gather_settings("2") == gather_settings("all") - assert gather_settings("3") == gather_settings("complete") - - # And an invalid mode name raises an exception. - with self.assertRaises(ValueError): - self.shell.magic_autoreload("4") - - def test_aimport_parsing(self): - # Modules can be included or excluded all in one line. - module_reloader = self.shell.auto_magics._reloader - self.shell.magic_aimport("os") # import and mark `os` for auto-reload. - assert module_reloader.modules["os"] is True - assert "os" not in module_reloader.skip_modules.keys() - - self.shell.magic_aimport("-math") # forbid autoreloading of `math` - assert module_reloader.skip_modules["math"] is True - assert "math" not in module_reloader.modules.keys() - - self.shell.magic_aimport( - "-os, math" - ) # Can do this all in one line; wasn't possible before. - assert module_reloader.modules["math"] is True - assert "math" not in module_reloader.skip_modules.keys() - assert module_reloader.skip_modules["os"] is True - assert "os" not in module_reloader.modules.keys() - - def test_autoreload_output(self): - self.shell.magic_autoreload("complete") - mod_code = """ - def func1(): pass - """ - mod_name, mod_fn = self.new_module(mod_code) - self.shell.run_code(f"import {mod_name}") - with tt.AssertPrints("", channel="stdout"): # no output; this is default - self.shell.run_code("pass") - - self.shell.magic_autoreload("complete --print") - self.write_file(mod_fn, mod_code) # "modify" the module - with tt.AssertPrints( - f"Reloading '{mod_name}'.", channel="stdout" - ): # see something printed out - self.shell.run_code("pass") - - self.shell.magic_autoreload("complete -p") - self.write_file(mod_fn, mod_code) # "modify" the module - with tt.AssertPrints( - f"Reloading '{mod_name}'.", channel="stdout" - ): # see something printed out - self.shell.run_code("pass") - - self.shell.magic_autoreload("complete --print --log") - self.write_file(mod_fn, mod_code) # "modify" the module - with tt.AssertPrints( - f"Reloading '{mod_name}'.", channel="stdout" - ): # see something printed out - self.shell.run_code("pass") - - self.shell.magic_autoreload("complete --print --log") - self.write_file(mod_fn, mod_code) # "modify" the module - with self.assertLogs(logger="autoreload") as lo: # see something printed out - self.shell.run_code("pass") - assert lo.output == [f"INFO:autoreload:Reloading '{mod_name}'."] - - self.shell.magic_autoreload("complete -l") - self.write_file(mod_fn, mod_code) # "modify" the module - with self.assertLogs(logger="autoreload") as lo: # see something printed out - self.shell.run_code("pass") - assert lo.output == [f"INFO:autoreload:Reloading '{mod_name}'."] - - def _check_smoketest(self, use_aimport=True): - """ - Functional test for the automatic reloader using either - '%autoreload 1' or '%autoreload 2' - """ - - mod_name, mod_fn = self.new_module( - """ -x = 9 - -z = 123 # this item will be deleted - -def foo(y): - return y + 3 - -class Baz(object): - def __init__(self, x): - self.x = x - def bar(self, y): - return self.x + y - @property - def quux(self): - return 42 - def zzz(self): - '''This method will be deleted below''' - return 99 - -class Bar: # old-style class: weakref doesn't work for it on Python < 2.7 - def foo(self): - return 1 -""" - ) - - # - # Import module, and mark for reloading - # - if use_aimport: - self.shell.magic_autoreload("1") - self.shell.magic_aimport(mod_name) - stream = StringIO() - self.shell.magic_aimport("", stream=stream) - self.assertIn(("Modules to reload:\n%s" % mod_name), stream.getvalue()) - - with self.assertRaises(ImportError): - self.shell.magic_aimport("tmpmod_as318989e89ds") - else: - self.shell.magic_autoreload("2") - self.shell.run_code("import %s" % mod_name) - stream = StringIO() - self.shell.magic_aimport("", stream=stream) - self.assertTrue( - "Modules to reload:\nall-except-skipped" in stream.getvalue() - ) - self.assertIn(mod_name, self.shell.ns) - - mod = sys.modules[mod_name] - - # - # Test module contents - # - old_foo = mod.foo - old_obj = mod.Baz(9) - old_obj2 = mod.Bar() - - def check_module_contents(): - self.assertEqual(mod.x, 9) - self.assertEqual(mod.z, 123) - - self.assertEqual(old_foo(0), 3) - self.assertEqual(mod.foo(0), 3) - - obj = mod.Baz(9) - self.assertEqual(old_obj.bar(1), 10) - self.assertEqual(obj.bar(1), 10) - self.assertEqual(obj.quux, 42) - self.assertEqual(obj.zzz(), 99) - - obj2 = mod.Bar() - self.assertEqual(old_obj2.foo(), 1) - self.assertEqual(obj2.foo(), 1) - - check_module_contents() - - # - # Simulate a failed reload: no reload should occur and exactly - # one error message should be printed - # - self.write_file( - mod_fn, - """ -a syntax error -""", - ) - - with tt.AssertPrints( - ("[autoreload of %s failed:" % mod_name), channel="stderr" - ): - self.shell.run_code("pass") # trigger reload - with tt.AssertNotPrints( - ("[autoreload of %s failed:" % mod_name), channel="stderr" - ): - self.shell.run_code("pass") # trigger another reload - check_module_contents() - - # - # Rewrite module (this time reload should succeed) - # - self.write_file( - mod_fn, - """ -x = 10 - -def foo(y): - return y + 4 - -class Baz(object): - def __init__(self, x): - self.x = x - def bar(self, y): - return self.x + y + 1 - @property - def quux(self): - return 43 - -class Bar: # old-style class - def foo(self): - return 2 -""", - ) - - def check_module_contents(): - self.assertEqual(mod.x, 10) - self.assertFalse(hasattr(mod, "z")) - - self.assertEqual(old_foo(0), 4) # superreload magic! - self.assertEqual(mod.foo(0), 4) - - obj = mod.Baz(9) - self.assertEqual(old_obj.bar(1), 11) # superreload magic! - self.assertEqual(obj.bar(1), 11) - - self.assertEqual(old_obj.quux, 43) - self.assertEqual(obj.quux, 43) - - self.assertFalse(hasattr(old_obj, "zzz")) - self.assertFalse(hasattr(obj, "zzz")) - - obj2 = mod.Bar() - self.assertEqual(old_obj2.foo(), 2) - self.assertEqual(obj2.foo(), 2) - - self.shell.run_code("pass") # trigger reload - check_module_contents() - - # - # Another failure case: deleted file (shouldn't reload) - # - os.unlink(mod_fn) - - self.shell.run_code("pass") # trigger reload - check_module_contents() - - # - # Disable autoreload and rewrite module: no reload should occur - # - if use_aimport: - self.shell.magic_aimport("-" + mod_name) - stream = StringIO() - self.shell.magic_aimport("", stream=stream) - self.assertTrue(("Modules to skip:\n%s" % mod_name) in stream.getvalue()) - - # This should succeed, although no such module exists - self.shell.magic_aimport("-tmpmod_as318989e89ds") - else: - self.shell.magic_autoreload("0") - - self.write_file( - mod_fn, - """ -x = -99 -""", - ) - - self.shell.run_code("pass") # trigger reload - self.shell.run_code("pass") - check_module_contents() - - # - # Re-enable autoreload: reload should now occur - # - if use_aimport: - self.shell.magic_aimport(mod_name) - else: - self.shell.magic_autoreload("") - - self.shell.run_code("pass") # trigger reload - self.assertEqual(mod.x, -99) - - def test_smoketest_aimport(self): - self._check_smoketest(use_aimport=True) - - def test_smoketest_autoreload(self): - self._check_smoketest(use_aimport=False) diff --git a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/test_storemagic.py b/.venv/lib/python3.12/site-packages/IPython/extensions/tests/test_storemagic.py deleted file mode 100644 index 66122ab..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/extensions/tests/test_storemagic.py +++ /dev/null @@ -1,71 +0,0 @@ -import tempfile, os -from pathlib import Path - -from traitlets.config.loader import Config - - -def setup_module(): - ip.run_line_magic("load_ext", "storemagic") - - -def test_store_restore(): - assert "bar" not in ip.user_ns, "Error: some other test leaked `bar` in user_ns" - assert "foo" not in ip.user_ns, "Error: some other test leaked `foo` in user_ns" - assert ( - "foobar" not in ip.user_ns - ), "Error: some other test leaked `foobar` in user_ns" - assert ( - "foobaz" not in ip.user_ns - ), "Error: some other test leaked `foobaz` in user_ns" - ip.user_ns["foo"] = 78 - ip.run_line_magic("alias", 'bar echo "hello"') - ip.user_ns["foobar"] = 79 - ip.user_ns["foobaz"] = "80" - tmpd = tempfile.mkdtemp() - ip.run_line_magic("cd", tmpd) - ip.run_line_magic("store", "foo") - ip.run_line_magic("store", "bar") - ip.run_line_magic("store", "foobar foobaz") - - # Check storing - assert ip.db["autorestore/foo"] == 78 - assert "bar" in ip.db["stored_aliases"] - assert ip.db["autorestore/foobar"] == 79 - assert ip.db["autorestore/foobaz"] == "80" - - # Remove those items - ip.user_ns.pop("foo", None) - ip.user_ns.pop("foobar", None) - ip.user_ns.pop("foobaz", None) - ip.alias_manager.undefine_alias("bar") - ip.run_line_magic("cd", "-") - ip.user_ns["_dh"][:] = [] - - # Check restoring - ip.run_line_magic("store", "-r foo bar foobar foobaz") - assert ip.user_ns["foo"] == 78 - assert ip.alias_manager.is_alias("bar") - assert ip.user_ns["foobar"] == 79 - assert ip.user_ns["foobaz"] == "80" - - ip.run_line_magic("store", "-r") # restores _dh too - assert any(Path(tmpd).samefile(p) for p in ip.user_ns["_dh"]) - - os.rmdir(tmpd) - -def test_autorestore(): - ip.user_ns["foo"] = 95 - ip.run_line_magic("store", "foo") - del ip.user_ns["foo"] - c = Config() - c.StoreMagics.autorestore = False - orig_config = ip.config - try: - ip.config = c - ip.extension_manager.reload_extension("storemagic") - assert "foo" not in ip.user_ns - c.StoreMagics.autorestore = True - ip.extension_manager.reload_extension("storemagic") - assert ip.user_ns["foo"] == 95 - finally: - ip.config = orig_config diff --git a/.venv/lib/python3.12/site-packages/IPython/external/__init__.py b/.venv/lib/python3.12/site-packages/IPython/external/__init__.py deleted file mode 100644 index eedc338..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/external/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -""" -This package contains all third-party modules bundled with IPython. -""" - -from typing import List - -__all__: List[str] = [] diff --git a/.venv/lib/python3.12/site-packages/IPython/external/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/external/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index c149db2ada7be6b70a93755454addc0686806876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 385 zcmXv~Jx{|h5Ve!^LlG4VsB}OwW08mjtQ8vr5<(0hq%Kw(TZw7vMD{fh2Eclwb9`^{qrUuyyCU;lOP4F$cPb53EynC~#?Jc9n)57TtZG7;OBL(ds`hNE zTm!mVx4lYb5Q5B%SIPG|47{UKfSnl#7CbFp!T84GN(On#vK)m*R)P{sA=- zgf+UH!O)d0DsDk&6{eIisU$EKzkJ+~A%f%RfI}Y}K+6ZsGZ+0JA PvyEBw*n2}=U2pyu*J^IX diff --git a/.venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_for_kernel.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_for_kernel.cpython-312.pyc deleted file mode 100644 index 59dcea10fa70cea9916a55d1f05ad7be3bf5af4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3675 zcmb7G%Wo9P8LyuA^t^0iz}Q|~#s=)g%wQIK6US`A0?S&8h`l(9wuN@wOxMh`-H)NV zW?;Ot*&)io76`2UZ90@60ax)NVB~JOOdwRxLnp3zGtWq6KZ z)xa{=Wy2s8TV<8Ww={zDCdIOWXJ)IcXc~BlP=jb`QJgQT7KR@y60Eu`$`(qoQo#TZ9-* z3BX=9s&|Tn5==CUOo`FO8->gq!BH3ZWKwX+Jk`d(JfSYN1TQC3jR- z6rJOaPw>b-xt6Rd7!)gl(9sslA&}I*J%!}uvc_;pW<`7!PTw+>DrTmpfG*tO4t0x| z(JGG=hl5EKLS2JBb-CxT$FiyW7@n=(P!+;QuvKi`onx%yo2G9qxoWw#TsN6}ulOWH z5;zWmOd~omm=iQ$wWeWNy8{H=>kzpME{}yVSiA09Xhv$;yV3&6kbbf++rz=gRd_(GF{-tYmL9TjUd>WaW}-$B9wavw1nkOj@<$ zuI%jWr*rd@cCxj)F>~eWa?M&wo0fYbLmp z%8=v;vKYOzVfQOkLv^7l)X<{y@%3(zpF7YL03#0+z7T2vOiLpO(a+z4Ltq~VU(M&p z_bqxbxKEx3R7%j15oRIpV?nrqYX6-k)TD{L1x>g~=)nK{#aA5q^HRNz2XP;stTit<+GPf!(voc4QAnzCg&ja0Tuw8UHFA% zJMq)k?eHx*w?quZ4!JMy8X~IYbUIKXjWG!=>W#L`SHXp-M)$VG$ zK5Lfvt7g%Dko+P1tyj?1(bKS4|GW`NHjdHiwm_(t{N@J=#Qzt#vR*GIO) zy^U1YT5YxVBsK6jHL#g@$aYc}RsxM!YGt}{=qQY9Q>#<=r#F7E9UI#19$f$NR{TUG z(YYqAO80MW{9-#XyxV(Izne5Aeo>2~7OZuh|Y#jQBrO&;6o{aK^;_;bI|H}Db( zDZGb-D1I94SpRrC+W-G5@cwq}#BMiU|6nUV_@8+0C6M^eORyg0c;_{KQx0bR(ZMX% z!ZQycz5pD%=dZc>+ALWRTI5)Fpe=?EY{2p$rrk@ksCTL+EVj_V+XK!mOla>Zeh(MC zQ3))8E;P(u&)W`6AcLl3YKy6vP`O5$G@*^j1o!=KI>Ggq6tRkhj+!+f<$wU;BO=@aBMzK8{qQ(dBEO5LTwV zT+~#HVKa~AT#l67ig9ipLz!fa@hU+fIZ9++@<5#fwE{m{q9hL$oRK4dQer!CUI}T) zUt!!9&e_6w02QaKT29RvfJ9KnKwZJhujTGB4o$G(02EXxluY4e-xwb4qC7-wzg4yD zux=`4jaZcX%?`3MR1bD6n{AdP*{mJ3N}9?XII(>uPyi07)HIyLrTlTCJh~iUp*(`@ z2owSQ@we>wCuM`FI&q-K4lJ6g0lJ6W`hXteheOS?JkkMxXdmB<@sh&>h;i7t34iO) z(ACkuLMYjD|7QK8MmVt*KGx_svT}DN^-N5xomoAzmRZegj6DqOh-d4UIh1_)&BW%R zZwDR>JQIqt<>;VWcXPk#gSp{v(?WwKHgMz5@#Il z^wYq)xp+p$>63KCm0_*^T$Q{a!3|M%+W8sJNFzV#japK8_CjJ=tsbpV++e z?aYIj-xvQn{QjO_=>H){k138GQ+pxQd6cV5-vL`jkJ{mERxxwgEPWT&^dxk4pI41} zFbWS**6|p%DEE?cdz4oWZ}Pqa`TJggF@BDRJ>`D1BXBR=vlf4iE}ImdwmEjKtn%ST zr9g-Ip_o&&6^T|N^moY7)w!2fk!d$vKA=-@jsudVK?ha}!gF805P12afCTYxNc=vK z5`5nyuiHC?f}M>(*V90U(;waIjK+QS$cvsH0l&D=C-gj@M)9NfFV-X94V>D%yEAa^ dG3u{}R)Q<#_563q-i^u4$(`i8_hODV{{~RHsn`Gj diff --git a/.venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_loaders.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/external/__pycache__/qt_loaders.cpython-312.pyc deleted file mode 100644 index 55ddf2771a21958700b1667b2785bd81626d7b95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14205 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 vU1|ylJC_4%PlHK?pAQyMjUmM~VLf)JZk_ diff --git a/.venv/lib/python3.12/site-packages/IPython/external/qt_for_kernel.py b/.venv/lib/python3.12/site-packages/IPython/external/qt_for_kernel.py deleted file mode 100644 index 11e8862..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/external/qt_for_kernel.py +++ /dev/null @@ -1,124 +0,0 @@ -""" Import Qt in a manner suitable for an IPython kernel. - -This is the import used for the `gui=qt` or `matplotlib=qt` initialization. - -Import Priority: - -if Qt has been imported anywhere else: - use that - -if matplotlib has been imported and doesn't support v2 (<= 1.0.1): - use PyQt4 @v1 - -Next, ask QT_API env variable - -if QT_API not set: - ask matplotlib what it's using. If Qt4Agg or Qt5Agg, then use the - version matplotlib is configured with - - else: (matplotlib said nothing) - # this is the default path - nobody told us anything - try in this order: - PyQt default version, PySide, PyQt5 -else: - use what QT_API says - - Note that %gui's implementation will always set a `QT_API`, see - `IPython.terminal.pt_inputhooks.get_inputhook_name_and_func` - -""" -# NOTE: This is no longer an external, third-party module, and should be -# considered part of IPython. For compatibility however, it is being kept in -# IPython/external. - -import os -import sys - -from IPython.external.qt_loaders import ( - load_qt, - loaded_api, - enum_factory, - # QT6 - QT_API_PYQT6, - QT_API_PYSIDE6, - # QT5 - QT_API_PYQT5, - QT_API_PYSIDE2, - # QT4 - QT_API_PYQT, - QT_API_PYSIDE, - # default - QT_API_PYQT_DEFAULT, -) - -_qt_apis = ( - # QT6 - QT_API_PYQT6, - QT_API_PYSIDE6, - # QT5 - QT_API_PYQT5, - QT_API_PYSIDE2, - # default - QT_API_PYQT_DEFAULT, -) - - -def matplotlib_options(mpl): - """Constraints placed on an imported matplotlib.""" - if mpl is None: - return - backend = mpl.rcParams.get('backend', None) - if backend == 'Qt4Agg': - mpqt = mpl.rcParams.get('backend.qt4', None) - if mpqt is None: - return None - if mpqt.lower() == 'pyside': - return [QT_API_PYSIDE] - elif mpqt.lower() == 'pyqt4': - return [QT_API_PYQT_DEFAULT] - elif mpqt.lower() == 'pyqt4v2': - return [QT_API_PYQT] - raise ImportError("unhandled value for backend.qt4 from matplotlib: %r" % - mpqt) - elif backend == 'Qt5Agg': - mpqt = mpl.rcParams.get('backend.qt5', None) - if mpqt is None: - return None - if mpqt.lower() == 'pyqt5': - return [QT_API_PYQT5] - raise ImportError("unhandled value for backend.qt5 from matplotlib: %r" % - mpqt) - -def get_options(): - """Return a list of acceptable QT APIs, in decreasing order of preference.""" - #already imported Qt somewhere. Use that - loaded = loaded_api() - if loaded is not None: - return [loaded] - - mpl = sys.modules.get("matplotlib", None) - - if mpl is not None and tuple(mpl.__version__.split(".")) < ("1", "0", "2"): - # 1.0.1 only supports PyQt4 v1 - return [QT_API_PYQT_DEFAULT] - - qt_api = os.environ.get('QT_API', None) - if qt_api is None: - #no ETS variable. Ask mpl, then use default fallback path - return matplotlib_options(mpl) or [ - QT_API_PYQT_DEFAULT, - QT_API_PYQT6, - QT_API_PYSIDE6, - QT_API_PYQT5, - QT_API_PYSIDE2, - ] - elif qt_api not in _qt_apis: - raise RuntimeError("Invalid Qt API %r, valid values are: %r" % - (qt_api, ', '.join(_qt_apis))) - else: - return [qt_api] - - -api_opts = get_options() -QtCore, QtGui, QtSvg, QT_API = load_qt(api_opts) -enum_helper = enum_factory(QT_API, QtCore) diff --git a/.venv/lib/python3.12/site-packages/IPython/external/qt_loaders.py b/.venv/lib/python3.12/site-packages/IPython/external/qt_loaders.py deleted file mode 100644 index 87b7165..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/external/qt_loaders.py +++ /dev/null @@ -1,423 +0,0 @@ -""" -This module contains factory functions that attempt -to return Qt submodules from the various python Qt bindings. - -It also protects against double-importing Qt with different -bindings, which is unstable and likely to crash - -This is used primarily by qt and qt_for_kernel, and shouldn't -be accessed directly from the outside -""" - -import importlib.abc -import sys -import os -import types -from functools import partial, lru_cache -import operator - -# ### Available APIs. -# Qt6 -QT_API_PYQT6 = "pyqt6" -QT_API_PYSIDE6 = "pyside6" - -# Qt5 -QT_API_PYQT5 = 'pyqt5' -QT_API_PYSIDE2 = 'pyside2' - -# Qt4 -# NOTE: Here for legacy matplotlib compatibility, but not really supported on the IPython side. -QT_API_PYQT = "pyqt" # Force version 2 -QT_API_PYQTv1 = "pyqtv1" # Force version 2 -QT_API_PYSIDE = "pyside" - -QT_API_PYQT_DEFAULT = "pyqtdefault" # use system default for version 1 vs. 2 - -api_to_module = { - # Qt6 - QT_API_PYQT6: "PyQt6", - QT_API_PYSIDE6: "PySide6", - # Qt5 - QT_API_PYQT5: "PyQt5", - QT_API_PYSIDE2: "PySide2", - # Qt4 - QT_API_PYSIDE: "PySide", - QT_API_PYQT: "PyQt4", - QT_API_PYQTv1: "PyQt4", - # default - QT_API_PYQT_DEFAULT: "PyQt6", -} - - -class ImportDenier(importlib.abc.MetaPathFinder): - """Import Hook that will guard against bad Qt imports - once IPython commits to a specific binding - """ - - def __init__(self): - self.__forbidden = set() - - def forbid(self, module_name): - sys.modules.pop(module_name, None) - self.__forbidden.add(module_name) - - def find_spec(self, fullname, path, target=None): - if path: - return - if fullname in self.__forbidden: - raise ImportError( - """ - Importing %s disabled by IPython, which has - already imported an Incompatible QT Binding: %s - """ - % (fullname, loaded_api()) - ) - - -ID = ImportDenier() -sys.meta_path.insert(0, ID) - - -def commit_api(api): - """Commit to a particular API, and trigger ImportErrors on subsequent - dangerous imports""" - modules = set(api_to_module.values()) - - modules.remove(api_to_module[api]) - for mod in modules: - ID.forbid(mod) - - -def loaded_api(): - """Return which API is loaded, if any - - If this returns anything besides None, - importing any other Qt binding is unsafe. - - Returns - ------- - None, 'pyside6', 'pyqt6', 'pyside2', 'pyside', 'pyqt', 'pyqt5', 'pyqtv1' - """ - if sys.modules.get("PyQt6.QtCore"): - return QT_API_PYQT6 - elif sys.modules.get("PySide6.QtCore"): - return QT_API_PYSIDE6 - elif sys.modules.get("PyQt5.QtCore"): - return QT_API_PYQT5 - elif sys.modules.get("PySide2.QtCore"): - return QT_API_PYSIDE2 - elif sys.modules.get("PyQt4.QtCore"): - if qtapi_version() == 2: - return QT_API_PYQT - else: - return QT_API_PYQTv1 - elif sys.modules.get("PySide.QtCore"): - return QT_API_PYSIDE - - return None - - -def has_binding(api): - """Safely check for PyQt4/5, PySide or PySide2, without importing submodules - - Parameters - ---------- - api : str [ 'pyqtv1' | 'pyqt' | 'pyqt5' | 'pyside' | 'pyside2' | 'pyqtdefault'] - Which module to check for - - Returns - ------- - True if the relevant module appears to be importable - """ - module_name = api_to_module[api] - from importlib.util import find_spec - - required = ['QtCore', 'QtGui', 'QtSvg'] - if api in (QT_API_PYQT5, QT_API_PYSIDE2, QT_API_PYQT6, QT_API_PYSIDE6): - # QT5 requires QtWidgets too - required.append('QtWidgets') - - for submod in required: - try: - spec = find_spec('%s.%s' % (module_name, submod)) - except ImportError: - # Package (e.g. PyQt5) not found - return False - else: - if spec is None: - # Submodule (e.g. PyQt5.QtCore) not found - return False - - if api == QT_API_PYSIDE: - # We can also safely check PySide version - import PySide - - return PySide.__version_info__ >= (1, 0, 3) - - return True - - -def qtapi_version(): - """Return which QString API has been set, if any - - Returns - ------- - The QString API version (1 or 2), or None if not set - """ - try: - import sip - except ImportError: - # as of PyQt5 5.11, sip is no longer available as a top-level - # module and needs to be imported from the PyQt5 namespace - try: - from PyQt5 import sip - except ImportError: - return - try: - return sip.getapi('QString') - except ValueError: - return - - -def can_import(api): - """Safely query whether an API is importable, without importing it""" - if not has_binding(api): - return False - - current = loaded_api() - if api == QT_API_PYQT_DEFAULT: - return current in [QT_API_PYQT6, None] - else: - return current in [api, None] - - -def import_pyqt4(version=2): - """ - Import PyQt4 - - Parameters - ---------- - version : 1, 2, or None - Which QString/QVariant API to use. Set to None to use the system - default - ImportErrors raised within this function are non-recoverable - """ - # The new-style string API (version=2) automatically - # converts QStrings to Unicode Python strings. Also, automatically unpacks - # QVariants to their underlying objects. - import sip - - if version is not None: - sip.setapi('QString', version) - sip.setapi('QVariant', version) - - from PyQt4 import QtGui, QtCore, QtSvg - - if QtCore.PYQT_VERSION < 0x040700: - raise ImportError("IPython requires PyQt4 >= 4.7, found %s" % - QtCore.PYQT_VERSION_STR) - - # Alias PyQt-specific functions for PySide compatibility. - QtCore.Signal = QtCore.pyqtSignal - QtCore.Slot = QtCore.pyqtSlot - - # query for the API version (in case version == None) - version = sip.getapi('QString') - api = QT_API_PYQTv1 if version == 1 else QT_API_PYQT - return QtCore, QtGui, QtSvg, api - - -def import_pyqt5(): - """ - Import PyQt5 - - ImportErrors raised within this function are non-recoverable - """ - - from PyQt5 import QtCore, QtSvg, QtWidgets, QtGui - - # Alias PyQt-specific functions for PySide compatibility. - QtCore.Signal = QtCore.pyqtSignal - QtCore.Slot = QtCore.pyqtSlot - - # Join QtGui and QtWidgets for Qt4 compatibility. - QtGuiCompat = types.ModuleType('QtGuiCompat') - QtGuiCompat.__dict__.update(QtGui.__dict__) - QtGuiCompat.__dict__.update(QtWidgets.__dict__) - - api = QT_API_PYQT5 - return QtCore, QtGuiCompat, QtSvg, api - - -def import_pyqt6(): - """ - Import PyQt6 - - ImportErrors raised within this function are non-recoverable - """ - - from PyQt6 import QtCore, QtSvg, QtWidgets, QtGui - - # Alias PyQt-specific functions for PySide compatibility. - QtCore.Signal = QtCore.pyqtSignal - QtCore.Slot = QtCore.pyqtSlot - - # Join QtGui and QtWidgets for Qt4 compatibility. - QtGuiCompat = types.ModuleType("QtGuiCompat") - QtGuiCompat.__dict__.update(QtGui.__dict__) - QtGuiCompat.__dict__.update(QtWidgets.__dict__) - - api = QT_API_PYQT6 - return QtCore, QtGuiCompat, QtSvg, api - - -def import_pyside(): - """ - Import PySide - - ImportErrors raised within this function are non-recoverable - """ - from PySide import QtGui, QtCore, QtSvg - return QtCore, QtGui, QtSvg, QT_API_PYSIDE - -def import_pyside2(): - """ - Import PySide2 - - ImportErrors raised within this function are non-recoverable - """ - from PySide2 import QtGui, QtCore, QtSvg, QtWidgets, QtPrintSupport - - # Join QtGui and QtWidgets for Qt4 compatibility. - QtGuiCompat = types.ModuleType('QtGuiCompat') - QtGuiCompat.__dict__.update(QtGui.__dict__) - QtGuiCompat.__dict__.update(QtWidgets.__dict__) - QtGuiCompat.__dict__.update(QtPrintSupport.__dict__) - - return QtCore, QtGuiCompat, QtSvg, QT_API_PYSIDE2 - - -def import_pyside6(): - """ - Import PySide6 - - ImportErrors raised within this function are non-recoverable - """ - - def get_attrs(module): - return { - name: getattr(module, name) - for name in dir(module) - if not name.startswith("_") - } - - from PySide6 import QtGui, QtCore, QtSvg, QtWidgets, QtPrintSupport - - # Join QtGui and QtWidgets for Qt4 compatibility. - QtGuiCompat = types.ModuleType("QtGuiCompat") - QtGuiCompat.__dict__.update(QtGui.__dict__) - if QtCore.__version_info__ < (6, 7): - QtGuiCompat.__dict__.update(QtWidgets.__dict__) - QtGuiCompat.__dict__.update(QtPrintSupport.__dict__) - else: - QtGuiCompat.__dict__.update(get_attrs(QtWidgets)) - QtGuiCompat.__dict__.update(get_attrs(QtPrintSupport)) - - return QtCore, QtGuiCompat, QtSvg, QT_API_PYSIDE6 - - -def load_qt(api_options): - """ - Attempt to import Qt, given a preference list - of permissible bindings - - It is safe to call this function multiple times. - - Parameters - ---------- - api_options : List of strings - The order of APIs to try. Valid items are 'pyside', 'pyside2', - 'pyqt', 'pyqt5', 'pyqtv1' and 'pyqtdefault' - - Returns - ------- - A tuple of QtCore, QtGui, QtSvg, QT_API - The first three are the Qt modules. The last is the - string indicating which module was loaded. - - Raises - ------ - ImportError, if it isn't possible to import any requested - bindings (either because they aren't installed, or because - an incompatible library has already been installed) - """ - loaders = { - # Qt6 - QT_API_PYQT6: import_pyqt6, - QT_API_PYSIDE6: import_pyside6, - # Qt5 - QT_API_PYQT5: import_pyqt5, - QT_API_PYSIDE2: import_pyside2, - # Qt4 - QT_API_PYSIDE: import_pyside, - QT_API_PYQT: import_pyqt4, - QT_API_PYQTv1: partial(import_pyqt4, version=1), - # default - QT_API_PYQT_DEFAULT: import_pyqt6, - } - - for api in api_options: - - if api not in loaders: - raise RuntimeError( - "Invalid Qt API %r, valid values are: %s" % - (api, ", ".join(["%r" % k for k in loaders.keys()]))) - - if not can_import(api): - continue - - #cannot safely recover from an ImportError during this - result = loaders[api]() - api = result[-1] # changed if api = QT_API_PYQT_DEFAULT - commit_api(api) - return result - else: - # Clear the environment variable since it doesn't work. - if "QT_API" in os.environ: - del os.environ["QT_API"] - - raise ImportError( - """ - Could not load requested Qt binding. Please ensure that - PyQt4 >= 4.7, PyQt5, PyQt6, PySide >= 1.0.3, PySide2, or - PySide6 is available, and only one is imported per session. - - Currently-imported Qt library: %r - PyQt5 available (requires QtCore, QtGui, QtSvg, QtWidgets): %s - PyQt6 available (requires QtCore, QtGui, QtSvg, QtWidgets): %s - PySide2 installed: %s - PySide6 installed: %s - Tried to load: %r - """ - % ( - loaded_api(), - has_binding(QT_API_PYQT5), - has_binding(QT_API_PYQT6), - has_binding(QT_API_PYSIDE2), - has_binding(QT_API_PYSIDE6), - api_options, - ) - ) - - -def enum_factory(QT_API, QtCore): - """Construct an enum helper to account for PyQt5 <-> PyQt6 changes.""" - - @lru_cache(None) - def _enum(name): - # foo.bar.Enum.Entry (PyQt6) <=> foo.bar.Entry (non-PyQt6). - return operator.attrgetter( - name if QT_API == QT_API_PYQT6 else name.rpartition(".")[0] - )(sys.modules[QtCore.__package__]) - - return _enum diff --git a/.venv/lib/python3.12/site-packages/IPython/external/tests/__init__.py b/.venv/lib/python3.12/site-packages/IPython/external/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 21b1bf29303a72994a17313fd5630f501ca4c97c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmX@j%ge<81d5Cc(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!iq+4^&rQ|ODl1D( z(N9S&(=SOaE-A<^*4Hab%`4N-$xPBOs4U6I&okCDG}155EJ@WZNKDR7OiwM=_Y45b z=%-ecq!#5R=79AU>&M4u=4F<|$LkeT{^GF7%}*)KNwq6t1=_|4#Kj=SM`lJw#v*1Q F3jok^G2H+F diff --git a/.venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/test_qt_loaders.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/external/tests/__pycache__/test_qt_loaders.cpython-312.pyc deleted file mode 100644 index c735599adbc14d482fc170c36eb4d2df817c71b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmbUfO=}ZD^v!;CV@b6wDk7y3O(6xdR1p&pKcXITDPEgP*ks0L(@i$ctZ7#f6a*0j zFG9~ArC$6A_39-;K-k2SUc6Ou2;}6O%`TOA^DXQE>HVvS0iX%m3%|(@CY~Lc$%> zzdN3-7{Eo?06}&Y0$bP_fj4*e)GgR0v-$w0`kcNQo_0Ec-|*U1%GwU2)s{yeyX?s_ zb%b4W8O_v!O!-0Ng6q~>wqI{>Ie*UNa?zpj(Bn0Sh6d(g!Ve8@JA#RDzTE0~+`rGc z$GKc?m~tYG>(s*Zl#Q$9NaP^oF)|ZsHM|zHn%yp=7G+&artRzqE8k`9u7%;&wB@V$ zjVqRLe0I5G*LUn~Cakzqi|zT0w{16y6%npJ@~f_AQ^rNU6NF1LYc*~onw@jGaCv;u zM)Vwpn(?aqqTE}^_O-QP>g3y%*DLRy_SSFpQ@4Ku(X#{d(pW|M^IuzWXfA#;SHGI8 zz0CE#S&)9kBMd5zb&QZ)b~4ryg4u^juEo^JwMr z4Tk6A5%bB2`Qy2wgG5t&fDt+amyc;;-k2WsCSO8PE?F!iI#LNC12{E+^mkYv89FKQ HMb!TRB0tX? diff --git a/.venv/lib/python3.12/site-packages/IPython/external/tests/test_qt_loaders.py b/.venv/lib/python3.12/site-packages/IPython/external/tests/test_qt_loaders.py deleted file mode 100644 index 7bc9ccf..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/external/tests/test_qt_loaders.py +++ /dev/null @@ -1,11 +0,0 @@ -import importlib -import pytest -from IPython.external.qt_loaders import ID - - -def test_import_denier(): - ID.forbid("ipython_denied_module") - with pytest.raises(ImportError, match="disabled by IPython"): - import ipython_denied_module - with pytest.raises(ImportError, match="disabled by IPython"): - importlib.import_module("ipython_denied_module") diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__init__.py b/.venv/lib/python3.12/site-packages/IPython/lib/__init__.py deleted file mode 100644 index cf8ccb0..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# encoding: utf-8 -""" -Extra capabilities for IPython -""" - -# ----------------------------------------------------------------------------- -# Copyright (C) 2008-2011 The IPython Development Team -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -# ----------------------------------------------------------------------------- diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index f669c710fccc83ca54483bdc30d2f47bba247b89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 228 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 L|CaE}*8P70-++%F diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/clipboard.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/clipboard.cpython-312.pyc deleted file mode 100644 index 000ceff3b653481aa93f50e0f63206d20c73ce96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4956 zcma)AT}&HS7QT0W?D4B?w|)Jm&LyV`wl0#c*oWzW6#jDcmF z-h?~n-h1x3zvuhT_1}CxH-glTe?ReW4?_PS1uOAYVS5UMB_yLUBx9LL;W13V%oqb- zHpQm7F%DPS__QOzV3c-_IWc0;IV5wpk<2T?1GZvq%q2T+qcOMaR6JK1S-8!Od1V*W z_+&Ta{y8S>$@hq(MlzK&l8P=~RW(scBotjwW+p^qQW3K$$$;AQF_*!F_3gcJm8Kx51t4l|}dW?AV^XN|d`Fl!3&ct%Pq z@wn-Z$J45uOA*-{kH4RjQk9m^(KfO9WH>UZrj^Ll%#0#OWMw8|D7ulI)+1drN@gaK zN{&aebH=2a>FIjqWJFII%89I$n3g6KJu-NSwos+oQnGUz*?OA6nIN5%Zlg_3(8yuY z`aO#y?PPnm{{zchLaxeDpaPmlQ%$B^n$Xmt8TN{B3cerv8xtdDCk)m+qYvI_YC$Mn-@lG4^Ha$WN znA-9;lo4*afVUA24B^e;kur;2qxfl=CCyKFyvW!1(e+Z(@nX~Qb5YKm(8P3(Y z8EP+uP8LHa|9H04Gg#~y+z7pSr*A9td?^$zhQgn9eCaB6zgg^lb0c(qvG4I#ux0sd zsWnn;jjRW{A0h1O+^QGvOY7caFcy@aJY(V#pms9VOLssBDXihAV2+j^fa@23WL0Qx*^uguX&xZ5Wg1UiQLRW{aPy% zYe#EsL}%>{vsKQ>C_aU=Y*m)Kxfk-E5wV!oQbohV|)&%F;2~c z`)SXChEDbp9Hr_hb*g@CpP!rng=0kXZO9hTjsv+uC84<}G=J6di>*M*y&H=+cHo+c z3%%bpG%mgO@q3@dZw@UC+!^@J7rJ+4@yc@l{Z}`9;e~-M&!Lj1wdiSG9@y|4Ug)DP zLmBnpyK!X?nWk|8rGcnOR5Nc=T>*A}%04BSVKvpL5GaotEb5bLE+vcO3J@E;)N(~z z%2aHmvneGFj4K&Hm6fq`IytHU*7WV=9}*jf%&Tj>KcDF56HYeV^N&0<9kS)9*tD^yX*z1pZd&d?+BV|HGey_i@4p7j9m- zeX-2&eA8wiR0^~g1MM4u!;2hnpv!m9yXd{^r%u~m^t9ja_`+4{j21hi8=hFzc^~hz zP`<-p8~AR$acsl?>vd^-T^J|S1GR*3yoZ34_>L|A^Y`1=g~PO^<7pXygpTn${}cTT zO!Ah{8%Cc7qYktZc12ls<)pXwEW2`+2YJ=ON1NDHk26}&uGUkziH$yoR-dbnzRd1{ z58_;uTDB;B?4peWsAbBIh@n?C$u_LZ%=BqE5szWV@HGd$g`|V)I?iAkGUAyPBW;D+Nyg3T&b#^zr8HAB&qA$~)3riU3Ik$!1gV@B^F@3133>Zb-8uXR8b81|4j} zVltx}QYxj$6q>YLCIgXp1zpVGyM5>4!~Mg<7J zl&uTTmpK+tEzn#FyjTppc%R(}bik_s@HMz_{)Z!=OU*ysftt2Qh=WPMlYqg#UcAk+ z0XG0(5TbI{RR@R&txtCvk@tlIpz?`+4i@`|qtVyUN<$=if?eeWkXIWUVvT6^1Rp)+ zTs`R|HLtm1A$E=N#{BG>pC@voD|Vb+d(jy?%B~&dK@JB@XFM*eiFjNis7sI7tgrqM z0#`&+y5L}}H(ry~kb~cY^sd?~ji(irDAWBbDV3`{>?)Ulysb1}iU*`8!Y?a7?VQyHp-94Aou~nIVEmB5nA>(B?EVJTeUFZQi;l0O<2w$FT_26@ fAox5I8gQ`O?ZUz3o^1r5N6k>N-Q9|Vbd3K3>&c9Q diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/deepreload.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/deepreload.cpython-312.pyc deleted file mode 100644 index c6d92d1b2198eebafd6e59d8baf8e78ddafcb926..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9150 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/demo.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/demo.cpython-312.pyc deleted file mode 100644 index 49ac77d0a2c63873d6123cf802e9bc2dc9ee99fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29141 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/display.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/display.cpython-312.pyc deleted file mode 100644 index 60dd2c988a40983e067ceb40f6099eb65e8638f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29273 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 MQR7bpx?$b_-{fj(J^%m! diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/editorhooks.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/editorhooks.cpython-312.pyc deleted file mode 100644 index 8bfaf65b595334beb150a9f96aad77d8c698fa5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4969 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/latextools.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/latextools.cpython-312.pyc deleted file mode 100644 index 1df5f76af7824c5e1efd11981be2ffefeef2b762..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10395 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/lexers.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/__pycache__/lexers.cpython-312.pyc deleted file mode 100644 index 3de0f156215bd37d5c5818f6b68725a214d81526..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19467 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 B5}N=3 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/backgroundjobs.py b/.venv/lib/python3.12/site-packages/IPython/lib/backgroundjobs.py deleted file mode 100644 index e7ad51e..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/backgroundjobs.py +++ /dev/null @@ -1,491 +0,0 @@ -# -*- coding: utf-8 -*- -"""Manage background (threaded) jobs conveniently from an interactive shell. - -This module provides a BackgroundJobManager class. This is the main class -meant for public usage, it implements an object which can create and manage -new background jobs. - -It also provides the actual job classes managed by these BackgroundJobManager -objects, see their docstrings below. - - -This system was inspired by discussions with B. Granger and the -BackgroundCommand class described in the book Python Scripting for -Computational Science, by H. P. Langtangen: - -http://folk.uio.no/hpl/scripting - -(although ultimately no code from this text was used, as IPython's system is a -separate implementation). - -An example notebook is provided in our documentation illustrating interactive -use of the system. -""" - -#***************************************************************************** -# Copyright (C) 2005-2006 Fernando Perez -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** - -# Code begins -import sys -import threading - -from IPython import get_ipython -from IPython.core.ultratb import AutoFormattedTB -from logging import error, debug - - -class BackgroundJobManager(object): - """Class to manage a pool of backgrounded threaded jobs. - - Below, we assume that 'jobs' is a BackgroundJobManager instance. - - Usage summary (see the method docstrings for details): - - jobs.new(...) -> start a new job - - jobs() or jobs.status() -> print status summary of all jobs - - jobs[N] -> returns job number N. - - foo = jobs[N].result -> assign to variable foo the result of job N - - jobs[N].traceback() -> print the traceback of dead job N - - jobs.remove(N) -> remove (finished) job N - - jobs.flush() -> remove all finished jobs - - As a convenience feature, BackgroundJobManager instances provide the - utility result and traceback methods which retrieve the corresponding - information from the jobs list: - - jobs.result(N) <--> jobs[N].result - jobs.traceback(N) <--> jobs[N].traceback() - - While this appears minor, it allows you to use tab completion - interactively on the job manager instance. - """ - - def __init__(self): - # Lists for job management, accessed via a property to ensure they're - # up to date.x - self._running = [] - self._completed = [] - self._dead = [] - # A dict of all jobs, so users can easily access any of them - self.all = {} - # For reporting - self._comp_report = [] - self._dead_report = [] - # Store status codes locally for fast lookups - self._s_created = BackgroundJobBase.stat_created_c - self._s_running = BackgroundJobBase.stat_running_c - self._s_completed = BackgroundJobBase.stat_completed_c - self._s_dead = BackgroundJobBase.stat_dead_c - self._current_job_id = 0 - - @property - def running(self): - self._update_status() - return self._running - - @property - def dead(self): - self._update_status() - return self._dead - - @property - def completed(self): - self._update_status() - return self._completed - - def new(self, func_or_exp, *args, **kwargs): - """Add a new background job and start it in a separate thread. - - There are two types of jobs which can be created: - - 1. Jobs based on expressions which can be passed to an eval() call. - The expression must be given as a string. For example: - - job_manager.new('myfunc(x,y,z=1)'[,glob[,loc]]) - - The given expression is passed to eval(), along with the optional - global/local dicts provided. If no dicts are given, they are - extracted automatically from the caller's frame. - - A Python statement is NOT a valid eval() expression. Basically, you - can only use as an eval() argument something which can go on the right - of an '=' sign and be assigned to a variable. - - For example,"print 'hello'" is not valid, but '2+3' is. - - 2. Jobs given a function object, optionally passing additional - positional arguments: - - job_manager.new(myfunc, x, y) - - The function is called with the given arguments. - - If you need to pass keyword arguments to your function, you must - supply them as a dict named kw: - - job_manager.new(myfunc, x, y, kw=dict(z=1)) - - The reason for this asymmetry is that the new() method needs to - maintain access to its own keywords, and this prevents name collisions - between arguments to new() and arguments to your own functions. - - In both cases, the result is stored in the job.result field of the - background job object. - - You can set `daemon` attribute of the thread by giving the keyword - argument `daemon`. - - Notes and caveats: - - 1. All threads running share the same standard output. Thus, if your - background jobs generate output, it will come out on top of whatever - you are currently writing. For this reason, background jobs are best - used with silent functions which simply return their output. - - 2. Threads also all work within the same global namespace, and this - system does not lock interactive variables. So if you send job to the - background which operates on a mutable object for a long time, and - start modifying that same mutable object interactively (or in another - backgrounded job), all sorts of bizarre behaviour will occur. - - 3. If a background job is spending a lot of time inside a C extension - module which does not release the Python Global Interpreter Lock - (GIL), this will block the IPython prompt. This is simply because the - Python interpreter can only switch between threads at Python - bytecodes. While the execution is inside C code, the interpreter must - simply wait unless the extension module releases the GIL. - - 4. There is no way, due to limitations in the Python threads library, - to kill a thread once it has started.""" - - if callable(func_or_exp): - kw = kwargs.get('kw',{}) - job = BackgroundJobFunc(func_or_exp,*args,**kw) - elif isinstance(func_or_exp, str): - if not args: - frame = sys._getframe(1) - glob, loc = frame.f_globals, frame.f_locals - elif len(args)==1: - glob = loc = args[0] - elif len(args)==2: - glob,loc = args - else: - raise ValueError( - 'Expression jobs take at most 2 args (globals,locals)') - job = BackgroundJobExpr(func_or_exp, glob, loc) - else: - raise TypeError('invalid args for new job') - - if kwargs.get('daemon', False): - job.daemon = True - job.num = self._current_job_id - self._current_job_id += 1 - self.running.append(job) - self.all[job.num] = job - debug('Starting job # %s in a separate thread.' % job.num) - job.start() - return job - - def __getitem__(self, job_key): - num = job_key if isinstance(job_key, int) else job_key.num - return self.all[num] - - def __call__(self): - """An alias to self.status(), - - This allows you to simply call a job manager instance much like the - Unix `jobs` shell command.""" - - return self.status() - - def _update_status(self): - """Update the status of the job lists. - - This method moves finished jobs to one of two lists: - - self.completed: jobs which completed successfully - - self.dead: jobs which finished but died. - - It also copies those jobs to corresponding _report lists. These lists - are used to report jobs completed/dead since the last update, and are - then cleared by the reporting function after each call.""" - - # Status codes - srun, scomp, sdead = self._s_running, self._s_completed, self._s_dead - # State lists, use the actual lists b/c the public names are properties - # that call this very function on access - running, completed, dead = self._running, self._completed, self._dead - - # Now, update all state lists - for num, job in enumerate(running): - stat = job.stat_code - if stat == srun: - continue - elif stat == scomp: - completed.append(job) - self._comp_report.append(job) - running[num] = False - elif stat == sdead: - dead.append(job) - self._dead_report.append(job) - running[num] = False - # Remove dead/completed jobs from running list - running[:] = filter(None, running) - - def _group_report(self,group,name): - """Report summary for a given job group. - - Return True if the group had any elements.""" - - if group: - print('%s jobs:' % name) - for job in group: - print('%s : %s' % (job.num,job)) - print() - return True - - def _group_flush(self,group,name): - """Flush a given job group - - Return True if the group had any elements.""" - - njobs = len(group) - if njobs: - plural = {1:''}.setdefault(njobs,'s') - print('Flushing %s %s job%s.' % (njobs,name,plural)) - group[:] = [] - return True - - def _status_new(self): - """Print the status of newly finished jobs. - - Return True if any new jobs are reported. - - This call resets its own state every time, so it only reports jobs - which have finished since the last time it was called.""" - - self._update_status() - new_comp = self._group_report(self._comp_report, 'Completed') - new_dead = self._group_report(self._dead_report, - 'Dead, call jobs.traceback() for details') - self._comp_report[:] = [] - self._dead_report[:] = [] - return new_comp or new_dead - - def status(self,verbose=0): - """Print a status of all jobs currently being managed.""" - - self._update_status() - self._group_report(self.running,'Running') - self._group_report(self.completed,'Completed') - self._group_report(self.dead,'Dead') - # Also flush the report queues - self._comp_report[:] = [] - self._dead_report[:] = [] - - def remove(self,num): - """Remove a finished (completed or dead) job.""" - - try: - job = self.all[num] - except KeyError: - error('Job #%s not found' % num) - else: - stat_code = job.stat_code - if stat_code == self._s_running: - error('Job #%s is still running, it can not be removed.' % num) - return - elif stat_code == self._s_completed: - self.completed.remove(job) - elif stat_code == self._s_dead: - self.dead.remove(job) - - def flush(self): - """Flush all finished jobs (completed and dead) from lists. - - Running jobs are never flushed. - - It first calls _status_new(), to update info. If any jobs have - completed since the last _status_new() call, the flush operation - aborts.""" - - # Remove the finished jobs from the master dict - alljobs = self.all - for job in self.completed+self.dead: - del(alljobs[job.num]) - - # Now flush these lists completely - fl_comp = self._group_flush(self.completed, 'Completed') - fl_dead = self._group_flush(self.dead, 'Dead') - if not (fl_comp or fl_dead): - print('No jobs to flush.') - - def result(self,num): - """result(N) -> return the result of job N.""" - try: - return self.all[num].result - except KeyError: - error('Job #%s not found' % num) - - def _traceback(self, job): - num = job if isinstance(job, int) else job.num - try: - self.all[num].traceback() - except KeyError: - error('Job #%s not found' % num) - - def traceback(self, job=None): - if job is None: - self._update_status() - for deadjob in self.dead: - print("Traceback for: %r" % deadjob) - self._traceback(deadjob) - print() - else: - self._traceback(job) - - -class BackgroundJobBase(threading.Thread): - """Base class to build BackgroundJob classes. - - The derived classes must implement: - - - Their own __init__, since the one here raises NotImplementedError. The - derived constructor must call self._init() at the end, to provide common - initialization. - - - A strform attribute used in calls to __str__. - - - A call() method, which will make the actual execution call and must - return a value to be held in the 'result' field of the job object. - """ - - # Class constants for status, in string and as numerical codes (when - # updating jobs lists, we don't want to do string comparisons). This will - # be done at every user prompt, so it has to be as fast as possible - stat_created = 'Created'; stat_created_c = 0 - stat_running = 'Running'; stat_running_c = 1 - stat_completed = 'Completed'; stat_completed_c = 2 - stat_dead = 'Dead (Exception), call jobs.traceback() for details' - stat_dead_c = -1 - - def __init__(self): - """Must be implemented in subclasses. - - Subclasses must call :meth:`_init` for standard initialisation. - """ - raise NotImplementedError("This class can not be instantiated directly.") - - def _init(self): - """Common initialization for all BackgroundJob objects""" - - for attr in ['call','strform']: - assert hasattr(self,attr), "Missing attribute <%s>" % attr - - # The num tag can be set by an external job manager - self.num = None - - self.status = BackgroundJobBase.stat_created - self.stat_code = BackgroundJobBase.stat_created_c - self.finished = False - self.result = '' - - # reuse the ipython traceback handler if we can get to it, otherwise - # make a new one - try: - make_tb = get_ipython().InteractiveTB.text - except: - make_tb = AutoFormattedTB(mode = 'Context', - color_scheme='NoColor', - tb_offset = 1).text - # Note that the actual API for text() requires the three args to be - # passed in, so we wrap it in a simple lambda. - self._make_tb = lambda : make_tb(None, None, None) - - # Hold a formatted traceback if one is generated. - self._tb = None - - threading.Thread.__init__(self) - - def __str__(self): - return self.strform - - def __repr__(self): - return '' % (self.num, self.strform) - - def traceback(self): - print(self._tb) - - def run(self): - try: - self.status = BackgroundJobBase.stat_running - self.stat_code = BackgroundJobBase.stat_running_c - self.result = self.call() - except: - self.status = BackgroundJobBase.stat_dead - self.stat_code = BackgroundJobBase.stat_dead_c - self.finished = None - self.result = ('') - self._tb = self._make_tb() - else: - self.status = BackgroundJobBase.stat_completed - self.stat_code = BackgroundJobBase.stat_completed_c - self.finished = True - - -class BackgroundJobExpr(BackgroundJobBase): - """Evaluate an expression as a background job (uses a separate thread).""" - - def __init__(self, expression, glob=None, loc=None): - """Create a new job from a string which can be fed to eval(). - - global/locals dicts can be provided, which will be passed to the eval - call.""" - - # fail immediately if the given expression can't be compiled - self.code = compile(expression,'','eval') - - glob = {} if glob is None else glob - loc = {} if loc is None else loc - self.expression = self.strform = expression - self.glob = glob - self.loc = loc - self._init() - - def call(self): - return eval(self.code,self.glob,self.loc) - - -class BackgroundJobFunc(BackgroundJobBase): - """Run a function call as a background job (uses a separate thread).""" - - def __init__(self, func, *args, **kwargs): - """Create a new job from a callable object. - - Any positional arguments and keyword args given to this constructor - after the initial callable are passed directly to it.""" - - if not callable(func): - raise TypeError( - 'first argument to BackgroundJobFunc must be callable') - - self.func = func - self.args = args - self.kwargs = kwargs - # The string form will only include the function passed, because - # generating string representations of the arguments is a potentially - # _very_ expensive operation (e.g. with large arrays). - self.strform = str(func) - self._init() - - def call(self): - return self.func(*self.args, **self.kwargs) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/clipboard.py b/.venv/lib/python3.12/site-packages/IPython/lib/clipboard.py deleted file mode 100644 index e0bf80b..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/clipboard.py +++ /dev/null @@ -1,102 +0,0 @@ -""" Utilities for accessing the platform's clipboard. -""" - -import os -import subprocess - -from IPython.core.error import TryNext -import IPython.utils.py3compat as py3compat - - -class ClipboardEmpty(ValueError): - pass - - -def win32_clipboard_get(): - """ Get the current clipboard's text on Windows. - - Requires Mark Hammond's pywin32 extensions. - """ - try: - import win32clipboard - except ImportError as e: - raise TryNext("Getting text from the clipboard requires the pywin32 " - "extensions: http://sourceforge.net/projects/pywin32/") from e - win32clipboard.OpenClipboard() - try: - text = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT) - except (TypeError, win32clipboard.error): - try: - text = win32clipboard.GetClipboardData(win32clipboard.CF_TEXT) - text = py3compat.cast_unicode(text, py3compat.DEFAULT_ENCODING) - except (TypeError, win32clipboard.error) as e: - raise ClipboardEmpty from e - finally: - win32clipboard.CloseClipboard() - return text - - -def osx_clipboard_get() -> str: - """ Get the clipboard's text on OS X. - """ - p = subprocess.Popen(['pbpaste', '-Prefer', 'ascii'], - stdout=subprocess.PIPE) - bytes_, stderr = p.communicate() - # Text comes in with old Mac \r line endings. Change them to \n. - bytes_ = bytes_.replace(b'\r', b'\n') - text = py3compat.decode(bytes_) - return text - - -def tkinter_clipboard_get(): - """ Get the clipboard's text using Tkinter. - - This is the default on systems that are not Windows or OS X. It may - interfere with other UI toolkits and should be replaced with an - implementation that uses that toolkit. - """ - try: - from tkinter import Tk, TclError - except ImportError as e: - raise TryNext("Getting text from the clipboard on this platform requires tkinter.") from e - - root = Tk() - root.withdraw() - try: - text = root.clipboard_get() - except TclError as e: - raise ClipboardEmpty from e - finally: - root.destroy() - text = py3compat.cast_unicode(text, py3compat.DEFAULT_ENCODING) - return text - - -def wayland_clipboard_get(): - """Get the clipboard's text under Wayland using wl-paste command. - - This requires Wayland and wl-clipboard installed and running. - """ - if os.environ.get("XDG_SESSION_TYPE") != "wayland": - raise TryNext("wayland is not detected") - - try: - with subprocess.Popen(["wl-paste"], stdout=subprocess.PIPE) as p: - raw, err = p.communicate() - if p.wait(): - raise TryNext(err) - except FileNotFoundError as e: - raise TryNext( - "Getting text from the clipboard under Wayland requires the wl-clipboard " - "extension: https://github.com/bugaevc/wl-clipboard" - ) from e - - if not raw: - raise ClipboardEmpty - - try: - text = py3compat.decode(raw) - except UnicodeDecodeError as e: - raise ClipboardEmpty from e - - return text diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/deepreload.py b/.venv/lib/python3.12/site-packages/IPython/lib/deepreload.py deleted file mode 100644 index aaedab2..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/deepreload.py +++ /dev/null @@ -1,310 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Provides a reload() function that acts recursively. - -Python's normal :func:`python:reload` function only reloads the module that it's -passed. The :func:`reload` function in this module also reloads everything -imported from that module, which is useful when you're changing files deep -inside a package. - -To use this as your default reload function, type this:: - - import builtins - from IPython.lib import deepreload - builtins.reload = deepreload.reload - -A reference to the original :func:`python:reload` is stored in this module as -:data:`original_reload`, so you can restore it later. - -This code is almost entirely based on knee.py, which is a Python -re-implementation of hierarchical module import. -""" -#***************************************************************************** -# Copyright (C) 2001 Nathaniel Gray -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -#***************************************************************************** - -import builtins as builtin_mod -from contextlib import contextmanager -import importlib -import sys - -from types import ModuleType -from warnings import warn -import types - -original_import = builtin_mod.__import__ - -@contextmanager -def replace_import_hook(new_import): - saved_import = builtin_mod.__import__ - builtin_mod.__import__ = new_import - try: - yield - finally: - builtin_mod.__import__ = saved_import - -def get_parent(globals, level): - """ - parent, name = get_parent(globals, level) - - Return the package that an import is being performed in. If globals comes - from the module foo.bar.bat (not itself a package), this returns the - sys.modules entry for foo.bar. If globals is from a package's __init__.py, - the package's entry in sys.modules is returned. - - If globals doesn't come from a package or a module in a package, or a - corresponding entry is not found in sys.modules, None is returned. - """ - orig_level = level - - if not level or not isinstance(globals, dict): - return None, '' - - pkgname = globals.get('__package__', None) - - if pkgname is not None: - # __package__ is set, so use it - if not hasattr(pkgname, 'rindex'): - raise ValueError('__package__ set to non-string') - if len(pkgname) == 0: - if level > 0: - raise ValueError('Attempted relative import in non-package') - return None, '' - name = pkgname - else: - # __package__ not set, so figure it out and set it - if '__name__' not in globals: - return None, '' - modname = globals['__name__'] - - if '__path__' in globals: - # __path__ is set, so modname is already the package name - globals['__package__'] = name = modname - else: - # Normal module, so work out the package name if any - lastdot = modname.rfind('.') - if lastdot < 0 < level: - raise ValueError("Attempted relative import in non-package") - if lastdot < 0: - globals['__package__'] = None - return None, '' - globals['__package__'] = name = modname[:lastdot] - - dot = len(name) - for x in range(level, 1, -1): - try: - dot = name.rindex('.', 0, dot) - except ValueError as e: - raise ValueError("attempted relative import beyond top-level " - "package") from e - name = name[:dot] - - try: - parent = sys.modules[name] - except BaseException as e: - if orig_level < 1: - warn("Parent module '%.200s' not found while handling absolute " - "import" % name) - parent = None - else: - raise SystemError("Parent module '%.200s' not loaded, cannot " - "perform relative import" % name) from e - - # We expect, but can't guarantee, if parent != None, that: - # - parent.__name__ == name - # - parent.__dict__ is globals - # If this is violated... Who cares? - return parent, name - -def load_next(mod, altmod, name, buf): - """ - mod, name, buf = load_next(mod, altmod, name, buf) - - altmod is either None or same as mod - """ - - if len(name) == 0: - # completely empty module name should only happen in - # 'from . import' (or '__import__("")') - return mod, None, buf - - dot = name.find('.') - if dot == 0: - raise ValueError('Empty module name') - - if dot < 0: - subname = name - next = None - else: - subname = name[:dot] - next = name[dot+1:] - - if buf != '': - buf += '.' - buf += subname - - result = import_submodule(mod, subname, buf) - if result is None and mod != altmod: - result = import_submodule(altmod, subname, subname) - if result is not None: - buf = subname - - if result is None: - raise ImportError("No module named %.200s" % name) - - return result, next, buf - - -# Need to keep track of what we've already reloaded to prevent cyclic evil -found_now = {} - -def import_submodule(mod, subname, fullname): - """m = import_submodule(mod, subname, fullname)""" - # Require: - # if mod == None: subname == fullname - # else: mod.__name__ + "." + subname == fullname - - global found_now - if fullname in found_now and fullname in sys.modules: - m = sys.modules[fullname] - else: - print('Reloading', fullname) - found_now[fullname] = 1 - oldm = sys.modules.get(fullname, None) - try: - if oldm is not None: - m = importlib.reload(oldm) - else: - m = importlib.import_module(subname, mod) - except: - # load_module probably removed name from modules because of - # the error. Put back the original module object. - if oldm: - sys.modules[fullname] = oldm - raise - - add_submodule(mod, m, fullname, subname) - - return m - -def add_submodule(mod, submod, fullname, subname): - """mod.{subname} = submod""" - if mod is None: - return #Nothing to do here. - - if submod is None: - submod = sys.modules[fullname] - - setattr(mod, subname, submod) - - return - -def ensure_fromlist(mod, fromlist, buf, recursive): - """Handle 'from module import a, b, c' imports.""" - if not hasattr(mod, '__path__'): - return - for item in fromlist: - if not hasattr(item, 'rindex'): - raise TypeError("Item in ``from list'' not a string") - if item == '*': - if recursive: - continue # avoid endless recursion - try: - all = mod.__all__ - except AttributeError: - pass - else: - ret = ensure_fromlist(mod, all, buf, 1) - if not ret: - return 0 - elif not hasattr(mod, item): - import_submodule(mod, item, buf + '.' + item) - -def deep_import_hook(name, globals=None, locals=None, fromlist=None, level=-1): - """Replacement for __import__()""" - parent, buf = get_parent(globals, level) - - head, name, buf = load_next(parent, None if level < 0 else parent, name, buf) - - tail = head - while name: - tail, name, buf = load_next(tail, tail, name, buf) - - # If tail is None, both get_parent and load_next found - # an empty module name: someone called __import__("") or - # doctored faulty bytecode - if tail is None: - raise ValueError('Empty module name') - - if not fromlist: - return head - - ensure_fromlist(tail, fromlist, buf, 0) - return tail - -modules_reloading = {} - -def deep_reload_hook(m): - """Replacement for reload().""" - # Hardcode this one as it would raise a NotImplementedError from the - # bowels of Python and screw up the import machinery after. - # unlike other imports the `exclude` list already in place is not enough. - - if m is types: - return m - if not isinstance(m, ModuleType): - raise TypeError("reload() argument must be module") - - name = m.__name__ - - if name not in sys.modules: - raise ImportError("reload(): module %.200s not in sys.modules" % name) - - global modules_reloading - try: - return modules_reloading[name] - except: - modules_reloading[name] = m - - try: - newm = importlib.reload(m) - except: - sys.modules[name] = m - raise - finally: - modules_reloading.clear() - return newm - -# Save the original hooks -original_reload = importlib.reload - -# Replacement for reload() -def reload( - module, - exclude=( - *sys.builtin_module_names, - "sys", - "os.path", - "builtins", - "__main__", - "numpy", - "numpy._globals", - ), -): - """Recursively reload all modules used in the given module. Optionally - takes a list of modules to exclude from reloading. The default exclude - list contains modules listed in sys.builtin_module_names with additional - sys, os.path, builtins and __main__, to prevent, e.g., resetting - display, exception, and io hooks. - """ - global found_now - for i in exclude: - found_now[i] = 1 - try: - with replace_import_hook(deep_import_hook): - return deep_reload_hook(module) - finally: - found_now = {} diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/demo.py b/.venv/lib/python3.12/site-packages/IPython/lib/demo.py deleted file mode 100644 index ebffd54..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/demo.py +++ /dev/null @@ -1,672 +0,0 @@ -"""Module for interactive demos using IPython. - -This module implements a few classes for running Python scripts interactively -in IPython for demonstrations. With very simple markup (a few tags in -comments), you can control points where the script stops executing and returns -control to IPython. - - -Provided classes ----------------- - -The classes are (see their docstrings for further details): - - - Demo: pure python demos - - - IPythonDemo: demos with input to be processed by IPython as if it had been - typed interactively (so magics work, as well as any other special syntax you - may have added via input prefilters). - - - LineDemo: single-line version of the Demo class. These demos are executed - one line at a time, and require no markup. - - - IPythonLineDemo: IPython version of the LineDemo class (the demo is - executed a line at a time, but processed via IPython). - - - ClearMixin: mixin to make Demo classes with less visual clutter. It - declares an empty marquee and a pre_cmd that clears the screen before each - block (see Subclassing below). - - - ClearDemo, ClearIPDemo: mixin-enabled versions of the Demo and IPythonDemo - classes. - -Inheritance diagram: - -.. inheritance-diagram:: IPython.lib.demo - :parts: 3 - -Subclassing ------------ - -The classes here all include a few methods meant to make customization by -subclassing more convenient. Their docstrings below have some more details: - - - highlight(): format every block and optionally highlight comments and - docstring content. - - - marquee(): generates a marquee to provide visible on-screen markers at each - block start and end. - - - pre_cmd(): run right before the execution of each block. - - - post_cmd(): run right after the execution of each block. If the block - raises an exception, this is NOT called. - - -Operation ---------- - -The file is run in its own empty namespace (though you can pass it a string of -arguments as if in a command line environment, and it will see those as -sys.argv). But at each stop, the global IPython namespace is updated with the -current internal demo namespace, so you can work interactively with the data -accumulated so far. - -By default, each block of code is printed (with syntax highlighting) before -executing it and you have to confirm execution. This is intended to show the -code to an audience first so you can discuss it, and only proceed with -execution once you agree. There are a few tags which allow you to modify this -behavior. - -The supported tags are: - -# stop - - Defines block boundaries, the points where IPython stops execution of the - file and returns to the interactive prompt. - - You can optionally mark the stop tag with extra dashes before and after the - word 'stop', to help visually distinguish the blocks in a text editor: - - # --- stop --- - - -# silent - - Make a block execute silently (and hence automatically). Typically used in - cases where you have some boilerplate or initialization code which you need - executed but do not want to be seen in the demo. - -# auto - - Make a block execute automatically, but still being printed. Useful for - simple code which does not warrant discussion, since it avoids the extra - manual confirmation. - -# auto_all - - This tag can _only_ be in the first block, and if given it overrides the - individual auto tags to make the whole demo fully automatic (no block asks - for confirmation). It can also be given at creation time (or the attribute - set later) to override what's in the file. - -While _any_ python file can be run as a Demo instance, if there are no stop -tags the whole file will run in a single block (no different that calling -first %pycat and then %run). The minimal markup to make this useful is to -place a set of stop tags; the other tags are only there to let you fine-tune -the execution. - -This is probably best explained with the simple example file below. You can -copy this into a file named ex_demo.py, and try running it via:: - - from IPython.lib.demo import Demo - d = Demo('ex_demo.py') - d() - -Each time you call the demo object, it runs the next block. The demo object -has a few useful methods for navigation, like again(), edit(), jump(), seek() -and back(). It can be reset for a new run via reset() or reloaded from disk -(in case you've edited the source) via reload(). See their docstrings below. - -Note: To make this simpler to explore, a file called "demo-exercizer.py" has -been added to the "docs/examples/core" directory. Just cd to this directory in -an IPython session, and type:: - - %run demo-exercizer.py - -and then follow the directions. - -Example -------- - -The following is a very simple example of a valid demo file. - -:: - - #################### EXAMPLE DEMO ############################### - '''A simple interactive demo to illustrate the use of IPython's Demo class.''' - - print('Hello, welcome to an interactive IPython demo.') - - # The mark below defines a block boundary, which is a point where IPython will - # stop execution and return to the interactive prompt. The dashes are actually - # optional and used only as a visual aid to clearly separate blocks while - # editing the demo code. - # stop - - x = 1 - y = 2 - - # stop - - # the mark below makes this block as silent - # silent - - print('This is a silent block, which gets executed but not printed.') - - # stop - # auto - print('This is an automatic block.') - print('It is executed without asking for confirmation, but printed.') - z = x + y - - print('z =', x) - - # stop - # This is just another normal block. - print('z is now:', z) - - print('bye!') - ################### END EXAMPLE DEMO ############################ -""" - - -#***************************************************************************** -# Copyright (C) 2005-2006 Fernando Perez. -# -# Distributed under the terms of the BSD License. The full license is in -# the file COPYING, distributed as part of this software. -# -#***************************************************************************** - -import os -import re -import shlex -import sys -import pygments -from pathlib import Path - -from IPython.utils.text import marquee -from IPython.utils import openpy -from IPython.utils import py3compat -__all__ = ['Demo','IPythonDemo','LineDemo','IPythonLineDemo','DemoError'] - -class DemoError(Exception): pass - -def re_mark(mark): - return re.compile(r'^\s*#\s+\s+%s\s*$' % mark,re.MULTILINE) - -class Demo(object): - - re_stop = re_mark(r'-*\s?stop\s?-*') - re_silent = re_mark('silent') - re_auto = re_mark('auto') - re_auto_all = re_mark('auto_all') - - def __init__(self,src,title='',arg_str='',auto_all=None, format_rst=False, - formatter='terminal', style='default'): - """Make a new demo object. To run the demo, simply call the object. - - See the module docstring for full details and an example (you can use - IPython.Demo? in IPython to see it). - - Inputs: - - - src is either a file, or file-like object, or a - string that can be resolved to a filename. - - Optional inputs: - - - title: a string to use as the demo name. Of most use when the demo - you are making comes from an object that has no filename, or if you - want an alternate denotation distinct from the filename. - - - arg_str(''): a string of arguments, internally converted to a list - just like sys.argv, so the demo script can see a similar - environment. - - - auto_all(None): global flag to run all blocks automatically without - confirmation. This attribute overrides the block-level tags and - applies to the whole demo. It is an attribute of the object, and - can be changed at runtime simply by reassigning it to a boolean - value. - - - format_rst(False): a bool to enable comments and doc strings - formatting with pygments rst lexer - - - formatter('terminal'): a string of pygments formatter name to be - used. Useful values for terminals: terminal, terminal256, - terminal16m - - - style('default'): a string of pygments style name to be used. - """ - if hasattr(src, "read"): - # It seems to be a file or a file-like object - self.fname = "from a file-like object" - if title == '': - self.title = "from a file-like object" - else: - self.title = title - else: - # Assume it's a string or something that can be converted to one - self.fname = src - if title == '': - (filepath, filename) = os.path.split(src) - self.title = filename - else: - self.title = title - self.sys_argv = [src] + shlex.split(arg_str) - self.auto_all = auto_all - self.src = src - - try: - ip = get_ipython() # this is in builtins whenever IPython is running - self.inside_ipython = True - except NameError: - self.inside_ipython = False - - if self.inside_ipython: - # get a few things from ipython. While it's a bit ugly design-wise, - # it ensures that things like color scheme and the like are always in - # sync with the ipython mode being used. This class is only meant to - # be used inside ipython anyways, so it's OK. - self.ip_ns = ip.user_ns - self.ip_colorize = ip.pycolorize - self.ip_showtb = ip.showtraceback - self.ip_run_cell = ip.run_cell - self.shell = ip - - self.formatter = pygments.formatters.get_formatter_by_name(formatter, - style=style) - self.python_lexer = pygments.lexers.get_lexer_by_name("py3") - self.format_rst = format_rst - if format_rst: - self.rst_lexer = pygments.lexers.get_lexer_by_name("rst") - - # load user data and initialize data structures - self.reload() - - def fload(self): - """Load file object.""" - # read data and parse into blocks - if hasattr(self, 'fobj') and self.fobj is not None: - self.fobj.close() - if hasattr(self.src, "read"): - # It seems to be a file or a file-like object - self.fobj = self.src - else: - # Assume it's a string or something that can be converted to one - self.fobj = openpy.open(self.fname) - - def reload(self): - """Reload source from disk and initialize state.""" - self.fload() - - self.src = "".join(openpy.strip_encoding_cookie(self.fobj)) - src_b = [b.strip() for b in self.re_stop.split(self.src) if b] - self._silent = [bool(self.re_silent.findall(b)) for b in src_b] - self._auto = [bool(self.re_auto.findall(b)) for b in src_b] - - # if auto_all is not given (def. None), we read it from the file - if self.auto_all is None: - self.auto_all = bool(self.re_auto_all.findall(src_b[0])) - else: - self.auto_all = bool(self.auto_all) - - # Clean the sources from all markup so it doesn't get displayed when - # running the demo - src_blocks = [] - auto_strip = lambda s: self.re_auto.sub('',s) - for i,b in enumerate(src_b): - if self._auto[i]: - src_blocks.append(auto_strip(b)) - else: - src_blocks.append(b) - # remove the auto_all marker - src_blocks[0] = self.re_auto_all.sub('',src_blocks[0]) - - self.nblocks = len(src_blocks) - self.src_blocks = src_blocks - - # also build syntax-highlighted source - self.src_blocks_colored = list(map(self.highlight,self.src_blocks)) - - # ensure clean namespace and seek offset - self.reset() - - def reset(self): - """Reset the namespace and seek pointer to restart the demo""" - self.user_ns = {} - self.finished = False - self.block_index = 0 - - def _validate_index(self,index): - if index<0 or index>=self.nblocks: - raise ValueError('invalid block index %s' % index) - - def _get_index(self,index): - """Get the current block index, validating and checking status. - - Returns None if the demo is finished""" - - if index is None: - if self.finished: - print('Demo finished. Use .reset() if you want to rerun it.') - return None - index = self.block_index - else: - self._validate_index(index) - return index - - def seek(self,index): - """Move the current seek pointer to the given block. - - You can use negative indices to seek from the end, with identical - semantics to those of Python lists.""" - if index<0: - index = self.nblocks + index - self._validate_index(index) - self.block_index = index - self.finished = False - - def back(self,num=1): - """Move the seek pointer back num blocks (default is 1).""" - self.seek(self.block_index-num) - - def jump(self,num=1): - """Jump a given number of blocks relative to the current one. - - The offset can be positive or negative, defaults to 1.""" - self.seek(self.block_index+num) - - def again(self): - """Move the seek pointer back one block and re-execute.""" - self.back(1) - self() - - def edit(self,index=None): - """Edit a block. - - If no number is given, use the last block executed. - - This edits the in-memory copy of the demo, it does NOT modify the - original source file. If you want to do that, simply open the file in - an editor and use reload() when you make changes to the file. This - method is meant to let you change a block during a demonstration for - explanatory purposes, without damaging your original script.""" - - index = self._get_index(index) - if index is None: - return - # decrease the index by one (unless we're at the very beginning), so - # that the default demo.edit() call opens up the sblock we've last run - if index>0: - index -= 1 - - filename = self.shell.mktempfile(self.src_blocks[index]) - self.shell.hooks.editor(filename, 1) - with open(Path(filename), "r", encoding="utf-8") as f: - new_block = f.read() - # update the source and colored block - self.src_blocks[index] = new_block - self.src_blocks_colored[index] = self.highlight(new_block) - self.block_index = index - # call to run with the newly edited index - self() - - def show(self,index=None): - """Show a single block on screen""" - - index = self._get_index(index) - if index is None: - return - - print(self.marquee('<%s> block # %s (%s remaining)' % - (self.title,index,self.nblocks-index-1))) - print(self.src_blocks_colored[index]) - sys.stdout.flush() - - def show_all(self): - """Show entire demo on screen, block by block""" - - fname = self.title - title = self.title - nblocks = self.nblocks - silent = self._silent - marquee = self.marquee - for index,block in enumerate(self.src_blocks_colored): - if silent[index]: - print(marquee('<%s> SILENT block # %s (%s remaining)' % - (title,index,nblocks-index-1))) - else: - print(marquee('<%s> block # %s (%s remaining)' % - (title,index,nblocks-index-1))) - print(block, end=' ') - sys.stdout.flush() - - def run_cell(self,source): - """Execute a string with one or more lines of code""" - - exec(source, self.user_ns) - - def __call__(self,index=None): - """run a block of the demo. - - If index is given, it should be an integer >=1 and <= nblocks. This - means that the calling convention is one off from typical Python - lists. The reason for the inconsistency is that the demo always - prints 'Block n/N, and N is the total, so it would be very odd to use - zero-indexing here.""" - - index = self._get_index(index) - if index is None: - return - try: - marquee = self.marquee - next_block = self.src_blocks[index] - self.block_index += 1 - if self._silent[index]: - print(marquee('Executing silent block # %s (%s remaining)' % - (index,self.nblocks-index-1))) - else: - self.pre_cmd() - self.show(index) - if self.auto_all or self._auto[index]: - print(marquee('output:')) - else: - print(marquee('Press to quit, to execute...'), end=' ') - ans = py3compat.input().strip() - if ans: - print(marquee('Block NOT executed')) - return - try: - save_argv = sys.argv - sys.argv = self.sys_argv - self.run_cell(next_block) - self.post_cmd() - finally: - sys.argv = save_argv - - except: - if self.inside_ipython: - self.ip_showtb(filename=self.fname) - else: - if self.inside_ipython: - self.ip_ns.update(self.user_ns) - - if self.block_index == self.nblocks: - mq1 = self.marquee('END OF DEMO') - if mq1: - # avoid spurious print if empty marquees are used - print() - print(mq1) - print(self.marquee('Use .reset() if you want to rerun it.')) - self.finished = True - - # These methods are meant to be overridden by subclasses who may wish to - # customize the behavior of of their demos. - def marquee(self,txt='',width=78,mark='*'): - """Return the input string centered in a 'marquee'.""" - return marquee(txt,width,mark) - - def pre_cmd(self): - """Method called before executing each block.""" - pass - - def post_cmd(self): - """Method called after executing each block.""" - pass - - def highlight(self, block): - """Method called on each block to highlight it content""" - tokens = pygments.lex(block, self.python_lexer) - if self.format_rst: - from pygments.token import Token - toks = [] - for token in tokens: - if token[0] == Token.String.Doc and len(token[1]) > 6: - toks += pygments.lex(token[1][:3], self.python_lexer) - # parse doc string content by rst lexer - toks += pygments.lex(token[1][3:-3], self.rst_lexer) - toks += pygments.lex(token[1][-3:], self.python_lexer) - elif token[0] == Token.Comment.Single: - toks.append((Token.Comment.Single, token[1][0])) - # parse comment content by rst lexer - # remove the extra newline added by rst lexer - toks += list(pygments.lex(token[1][1:], self.rst_lexer))[:-1] - else: - toks.append(token) - tokens = toks - return pygments.format(tokens, self.formatter) - - -class IPythonDemo(Demo): - """Class for interactive demos with IPython's input processing applied. - - This subclasses Demo, but instead of executing each block by the Python - interpreter (via exec), it actually calls IPython on it, so that any input - filters which may be in place are applied to the input block. - - If you have an interactive environment which exposes special input - processing, you can use this class instead to write demo scripts which - operate exactly as if you had typed them interactively. The default Demo - class requires the input to be valid, pure Python code. - """ - - def run_cell(self,source): - """Execute a string with one or more lines of code""" - - self.shell.run_cell(source) - -class LineDemo(Demo): - """Demo where each line is executed as a separate block. - - The input script should be valid Python code. - - This class doesn't require any markup at all, and it's meant for simple - scripts (with no nesting or any kind of indentation) which consist of - multiple lines of input to be executed, one at a time, as if they had been - typed in the interactive prompt. - - Note: the input can not have *any* indentation, which means that only - single-lines of input are accepted, not even function definitions are - valid.""" - - def reload(self): - """Reload source from disk and initialize state.""" - # read data and parse into blocks - self.fload() - lines = self.fobj.readlines() - src_b = [l for l in lines if l.strip()] - nblocks = len(src_b) - self.src = ''.join(lines) - self._silent = [False]*nblocks - self._auto = [True]*nblocks - self.auto_all = True - self.nblocks = nblocks - self.src_blocks = src_b - - # also build syntax-highlighted source - self.src_blocks_colored = list(map(self.highlight,self.src_blocks)) - - # ensure clean namespace and seek offset - self.reset() - - -class IPythonLineDemo(IPythonDemo,LineDemo): - """Variant of the LineDemo class whose input is processed by IPython.""" - pass - - -class ClearMixin(object): - """Use this mixin to make Demo classes with less visual clutter. - - Demos using this mixin will clear the screen before every block and use - blank marquees. - - Note that in order for the methods defined here to actually override those - of the classes it's mixed with, it must go /first/ in the inheritance - tree. For example: - - class ClearIPDemo(ClearMixin,IPythonDemo): pass - - will provide an IPythonDemo class with the mixin's features. - """ - - def marquee(self,txt='',width=78,mark='*'): - """Blank marquee that returns '' no matter what the input.""" - return '' - - def pre_cmd(self): - """Method called before executing each block. - - This one simply clears the screen.""" - from IPython.utils.terminal import _term_clear - _term_clear() - -class ClearDemo(ClearMixin,Demo): - pass - - -class ClearIPDemo(ClearMixin,IPythonDemo): - pass - - -def slide(file_path, noclear=False, format_rst=True, formatter="terminal", - style="native", auto_all=False, delimiter='...'): - if noclear: - demo_class = Demo - else: - demo_class = ClearDemo - demo = demo_class(file_path, format_rst=format_rst, formatter=formatter, - style=style, auto_all=auto_all) - while not demo.finished: - demo() - try: - py3compat.input('\n' + delimiter) - except KeyboardInterrupt: - exit(1) - -if __name__ == '__main__': - import argparse - parser = argparse.ArgumentParser(description='Run python demos') - parser.add_argument('--noclear', '-C', action='store_true', - help='Do not clear terminal on each slide') - parser.add_argument('--rst', '-r', action='store_true', - help='Highlight comments and dostrings as rst') - parser.add_argument('--formatter', '-f', default='terminal', - help='pygments formatter name could be: terminal, ' - 'terminal256, terminal16m') - parser.add_argument('--style', '-s', default='default', - help='pygments style name') - parser.add_argument('--auto', '-a', action='store_true', - help='Run all blocks automatically without' - 'confirmation') - parser.add_argument('--delimiter', '-d', default='...', - help='slides delimiter added after each slide run') - parser.add_argument('file', nargs=1, - help='python demo file') - args = parser.parse_args() - slide(args.file[0], noclear=args.noclear, format_rst=args.rst, - formatter=args.formatter, style=args.style, auto_all=args.auto, - delimiter=args.delimiter) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/display.py b/.venv/lib/python3.12/site-packages/IPython/lib/display.py deleted file mode 100644 index f39f389..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/display.py +++ /dev/null @@ -1,677 +0,0 @@ -"""Various display related classes. - -Authors : MinRK, gregcaporaso, dannystaple -""" -from html import escape as html_escape -from os.path import exists, isfile, splitext, abspath, join, isdir -from os import walk, sep, fsdecode - -from IPython.core.display import DisplayObject, TextDisplayObject - -from typing import Tuple, Iterable, Optional - -__all__ = ['Audio', 'IFrame', 'YouTubeVideo', 'VimeoVideo', 'ScribdDocument', - 'FileLink', 'FileLinks', 'Code'] - - -class Audio(DisplayObject): - """Create an audio object. - - When this object is returned by an input cell or passed to the - display function, it will result in Audio controls being displayed - in the frontend (only works in the notebook). - - Parameters - ---------- - data : numpy array, list, unicode, str or bytes - Can be one of - - * Numpy 1d array containing the desired waveform (mono) - * Numpy 2d array containing waveforms for each channel. - Shape=(NCHAN, NSAMPLES). For the standard channel order, see - http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx - * List of float or integer representing the waveform (mono) - * String containing the filename - * Bytestring containing raw PCM data or - * URL pointing to a file on the web. - - If the array option is used, the waveform will be normalized. - - If a filename or url is used, the format support will be browser - dependent. - url : unicode - A URL to download the data from. - filename : unicode - Path to a local file to load the data from. - embed : boolean - Should the audio data be embedded using a data URI (True) or should - the original source be referenced. Set this to True if you want the - audio to playable later with no internet connection in the notebook. - - Default is `True`, unless the keyword argument `url` is set, then - default value is `False`. - rate : integer - The sampling rate of the raw data. - Only required when data parameter is being used as an array - autoplay : bool - Set to True if the audio should immediately start playing. - Default is `False`. - normalize : bool - Whether audio should be normalized (rescaled) to the maximum possible - range. Default is `True`. When set to `False`, `data` must be between - -1 and 1 (inclusive), otherwise an error is raised. - Applies only when `data` is a list or array of samples; other types of - audio are never normalized. - - Examples - -------- - - >>> import pytest - >>> np = pytest.importorskip("numpy") - - Generate a sound - - >>> import numpy as np - >>> framerate = 44100 - >>> t = np.linspace(0,5,framerate*5) - >>> data = np.sin(2*np.pi*220*t) + np.sin(2*np.pi*224*t) - >>> Audio(data, rate=framerate) - - - Can also do stereo or more channels - - >>> dataleft = np.sin(2*np.pi*220*t) - >>> dataright = np.sin(2*np.pi*224*t) - >>> Audio([dataleft, dataright], rate=framerate) - - - From URL: - - >>> Audio("http://www.nch.com.au/acm/8k16bitpcm.wav") # doctest: +SKIP - >>> Audio(url="http://www.w3schools.com/html/horse.ogg") # doctest: +SKIP - - From a File: - - >>> Audio('IPython/lib/tests/test.wav') # doctest: +SKIP - >>> Audio(filename='IPython/lib/tests/test.wav') # doctest: +SKIP - - From Bytes: - - >>> Audio(b'RAW_WAV_DATA..') # doctest: +SKIP - >>> Audio(data=b'RAW_WAV_DATA..') # doctest: +SKIP - - See Also - -------- - ipywidgets.Audio - - Audio widget with more more flexibility and options. - - """ - _read_flags = 'rb' - - def __init__(self, data=None, filename=None, url=None, embed=None, rate=None, autoplay=False, normalize=True, *, - element_id=None): - if filename is None and url is None and data is None: - raise ValueError("No audio data found. Expecting filename, url, or data.") - if embed is False and url is None: - raise ValueError("No url found. Expecting url when embed=False") - - if url is not None and embed is not True: - self.embed = False - else: - self.embed = True - self.autoplay = autoplay - self.element_id = element_id - super(Audio, self).__init__(data=data, url=url, filename=filename) - - if self.data is not None and not isinstance(self.data, bytes): - if rate is None: - raise ValueError("rate must be specified when data is a numpy array or list of audio samples.") - self.data = Audio._make_wav(data, rate, normalize) - - def reload(self): - """Reload the raw data from file or URL.""" - import mimetypes - if self.embed: - super(Audio, self).reload() - - if self.filename is not None: - self.mimetype = mimetypes.guess_type(self.filename)[0] - elif self.url is not None: - self.mimetype = mimetypes.guess_type(self.url)[0] - else: - self.mimetype = "audio/wav" - - @staticmethod - def _make_wav(data, rate, normalize): - """ Transform a numpy array to a PCM bytestring """ - from io import BytesIO - import wave - - try: - scaled, nchan = Audio._validate_and_normalize_with_numpy(data, normalize) - except ImportError: - scaled, nchan = Audio._validate_and_normalize_without_numpy(data, normalize) - - fp = BytesIO() - waveobj = wave.open(fp,mode='wb') - waveobj.setnchannels(nchan) - waveobj.setframerate(rate) - waveobj.setsampwidth(2) - waveobj.setcomptype('NONE','NONE') - waveobj.writeframes(scaled) - val = fp.getvalue() - waveobj.close() - - return val - - @staticmethod - def _validate_and_normalize_with_numpy(data, normalize) -> Tuple[bytes, int]: - import numpy as np - - data = np.array(data, dtype=float) - if len(data.shape) == 1: - nchan = 1 - elif len(data.shape) == 2: - # In wave files,channels are interleaved. E.g., - # "L1R1L2R2..." for stereo. See - # http://msdn.microsoft.com/en-us/library/windows/hardware/dn653308(v=vs.85).aspx - # for channel ordering - nchan = data.shape[0] - data = data.T.ravel() - else: - raise ValueError('Array audio input must be a 1D or 2D array') - - max_abs_value = np.max(np.abs(data)) - normalization_factor = Audio._get_normalization_factor(max_abs_value, normalize) - scaled = data / normalization_factor * 32767 - return scaled.astype(" 1: - raise ValueError('Audio data must be between -1 and 1 when normalize=False.') - return max_abs_value if normalize else 1 - - def _data_and_metadata(self): - """shortcut for returning metadata with url information, if defined""" - md = {} - if self.url: - md['url'] = self.url - if md: - return self.data, md - else: - return self.data - - def _repr_html_(self): - src = """ - - """ - return src.format(src=self.src_attr(), type=self.mimetype, autoplay=self.autoplay_attr(), - element_id=self.element_id_attr()) - - def src_attr(self): - import base64 - if self.embed and (self.data is not None): - data = base64=base64.b64encode(self.data).decode('ascii') - return """data:{type};base64,{base64}""".format(type=self.mimetype, - base64=data) - elif self.url is not None: - return self.url - else: - return "" - - def autoplay_attr(self): - if(self.autoplay): - return 'autoplay="autoplay"' - else: - return '' - - def element_id_attr(self): - if (self.element_id): - return 'id="{element_id}"'.format(element_id=self.element_id) - else: - return '' - -class IFrame(object): - """ - Generic class to embed an iframe in an IPython notebook - """ - - iframe = """ - - """ - - def __init__( - self, src, width, height, extras: Optional[Iterable[str]] = None, **kwargs - ): - if extras is None: - extras = [] - - self.src = src - self.width = width - self.height = height - self.extras = extras - self.params = kwargs - - def _repr_html_(self): - """return the embed iframe""" - if self.params: - from urllib.parse import urlencode - params = "?" + urlencode(self.params) - else: - params = "" - return self.iframe.format( - src=self.src, - width=self.width, - height=self.height, - params=params, - extras=" ".join(self.extras), - ) - - -class YouTubeVideo(IFrame): - """Class for embedding a YouTube Video in an IPython session, based on its video id. - - e.g. to embed the video from https://www.youtube.com/watch?v=foo , you would - do:: - - vid = YouTubeVideo("foo") - display(vid) - - To start from 30 seconds:: - - vid = YouTubeVideo("abc", start=30) - display(vid) - - To calculate seconds from time as hours, minutes, seconds use - :class:`datetime.timedelta`:: - - start=int(timedelta(hours=1, minutes=46, seconds=40).total_seconds()) - - Other parameters can be provided as documented at - https://developers.google.com/youtube/player_parameters#Parameters - - When converting the notebook using nbconvert, a jpeg representation of the video - will be inserted in the document. - """ - - def __init__(self, id, width=400, height=300, allow_autoplay=False, **kwargs): - self.id=id - src = "https://www.youtube.com/embed/{0}".format(id) - if allow_autoplay: - extras = list(kwargs.get("extras", [])) + ['allow="autoplay"'] - kwargs.update(autoplay=1, extras=extras) - super(YouTubeVideo, self).__init__(src, width, height, **kwargs) - - def _repr_jpeg_(self): - # Deferred import - from urllib.request import urlopen - - try: - return urlopen("https://img.youtube.com/vi/{id}/hqdefault.jpg".format(id=self.id)).read() - except IOError: - return None - -class VimeoVideo(IFrame): - """ - Class for embedding a Vimeo video in an IPython session, based on its video id. - """ - - def __init__(self, id, width=400, height=300, **kwargs): - src="https://player.vimeo.com/video/{0}".format(id) - super(VimeoVideo, self).__init__(src, width, height, **kwargs) - -class ScribdDocument(IFrame): - """ - Class for embedding a Scribd document in an IPython session - - Use the start_page params to specify a starting point in the document - Use the view_mode params to specify display type one off scroll | slideshow | book - - e.g to Display Wes' foundational paper about PANDAS in book mode from page 3 - - ScribdDocument(71048089, width=800, height=400, start_page=3, view_mode="book") - """ - - def __init__(self, id, width=400, height=300, **kwargs): - src="https://www.scribd.com/embeds/{0}/content".format(id) - super(ScribdDocument, self).__init__(src, width, height, **kwargs) - -class FileLink(object): - """Class for embedding a local file link in an IPython session, based on path - - e.g. to embed a link that was generated in the IPython notebook as my/data.txt - - you would do:: - - local_file = FileLink("my/data.txt") - display(local_file) - - or in the HTML notebook, just:: - - FileLink("my/data.txt") - """ - - html_link_str = "%s" - - def __init__(self, - path, - url_prefix='', - result_html_prefix='', - result_html_suffix='
'): - """ - Parameters - ---------- - path : str - path to the file or directory that should be formatted - url_prefix : str - prefix to be prepended to all files to form a working link [default: - ''] - result_html_prefix : str - text to append to beginning to link [default: ''] - result_html_suffix : str - text to append at the end of link [default: '
'] - """ - if isdir(path): - raise ValueError("Cannot display a directory using FileLink. " - "Use FileLinks to display '%s'." % path) - self.path = fsdecode(path) - self.url_prefix = url_prefix - self.result_html_prefix = result_html_prefix - self.result_html_suffix = result_html_suffix - - def _format_path(self): - fp = ''.join([self.url_prefix, html_escape(self.path)]) - return ''.join([self.result_html_prefix, - self.html_link_str % \ - (fp, html_escape(self.path, quote=False)), - self.result_html_suffix]) - - def _repr_html_(self): - """return html link to file - """ - if not exists(self.path): - return ("Path (%s) doesn't exist. " - "It may still be in the process of " - "being generated, or you may have the " - "incorrect path." % self.path) - - return self._format_path() - - def __repr__(self): - """return absolute path to file - """ - return abspath(self.path) - -class FileLinks(FileLink): - """Class for embedding local file links in an IPython session, based on path - - e.g. to embed links to files that were generated in the IPython notebook - under ``my/data``, you would do:: - - local_files = FileLinks("my/data") - display(local_files) - - or in the HTML notebook, just:: - - FileLinks("my/data") - """ - def __init__(self, - path, - url_prefix='', - included_suffixes=None, - result_html_prefix='', - result_html_suffix='
', - notebook_display_formatter=None, - terminal_display_formatter=None, - recursive=True): - """ - See :class:`FileLink` for the ``path``, ``url_prefix``, - ``result_html_prefix`` and ``result_html_suffix`` parameters. - - included_suffixes : list - Filename suffixes to include when formatting output [default: include - all files] - - notebook_display_formatter : function - Used to format links for display in the notebook. See discussion of - formatter functions below. - - terminal_display_formatter : function - Used to format links for display in the terminal. See discussion of - formatter functions below. - - Formatter functions must be of the form:: - - f(dirname, fnames, included_suffixes) - - dirname : str - The name of a directory - fnames : list - The files in that directory - included_suffixes : list - The file suffixes that should be included in the output (passing None - meansto include all suffixes in the output in the built-in formatters) - recursive : boolean - Whether to recurse into subdirectories. Default is True. - - The function should return a list of lines that will be printed in the - notebook (if passing notebook_display_formatter) or the terminal (if - passing terminal_display_formatter). This function is iterated over for - each directory in self.path. Default formatters are in place, can be - passed here to support alternative formatting. - - """ - if isfile(path): - raise ValueError("Cannot display a file using FileLinks. " - "Use FileLink to display '%s'." % path) - self.included_suffixes = included_suffixes - # remove trailing slashes for more consistent output formatting - path = path.rstrip('/') - - self.path = path - self.url_prefix = url_prefix - self.result_html_prefix = result_html_prefix - self.result_html_suffix = result_html_suffix - - self.notebook_display_formatter = \ - notebook_display_formatter or self._get_notebook_display_formatter() - self.terminal_display_formatter = \ - terminal_display_formatter or self._get_terminal_display_formatter() - - self.recursive = recursive - - def _get_display_formatter( - self, dirname_output_format, fname_output_format, fp_format, fp_cleaner=None - ): - """generate built-in formatter function - - this is used to define both the notebook and terminal built-in - formatters as they only differ by some wrapper text for each entry - - dirname_output_format: string to use for formatting directory - names, dirname will be substituted for a single "%s" which - must appear in this string - fname_output_format: string to use for formatting file names, - if a single "%s" appears in the string, fname will be substituted - if two "%s" appear in the string, the path to fname will be - substituted for the first and fname will be substituted for the - second - fp_format: string to use for formatting filepaths, must contain - exactly two "%s" and the dirname will be substituted for the first - and fname will be substituted for the second - """ - def f(dirname, fnames, included_suffixes=None): - result = [] - # begin by figuring out which filenames, if any, - # are going to be displayed - display_fnames = [] - for fname in fnames: - if (isfile(join(dirname,fname)) and - (included_suffixes is None or - splitext(fname)[1] in included_suffixes)): - display_fnames.append(fname) - - if len(display_fnames) == 0: - # if there are no filenames to display, don't print anything - # (not even the directory name) - pass - else: - # otherwise print the formatted directory name followed by - # the formatted filenames - dirname_output_line = dirname_output_format % dirname - result.append(dirname_output_line) - for fname in display_fnames: - fp = fp_format % (dirname,fname) - if fp_cleaner is not None: - fp = fp_cleaner(fp) - try: - # output can include both a filepath and a filename... - fname_output_line = fname_output_format % (fp, fname) - except TypeError: - # ... or just a single filepath - fname_output_line = fname_output_format % fname - result.append(fname_output_line) - return result - return f - - def _get_notebook_display_formatter(self, - spacer="  "): - """ generate function to use for notebook formatting - """ - dirname_output_format = \ - self.result_html_prefix + "%s/" + self.result_html_suffix - fname_output_format = \ - self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix - fp_format = self.url_prefix + '%s/%s' - if sep == "\\": - # Working on a platform where the path separator is "\", so - # must convert these to "/" for generating a URI - def fp_cleaner(fp): - # Replace all occurrences of backslash ("\") with a forward - # slash ("/") - this is necessary on windows when a path is - # provided as input, but we must link to a URI - return fp.replace('\\','/') - else: - fp_cleaner = None - - return self._get_display_formatter(dirname_output_format, - fname_output_format, - fp_format, - fp_cleaner) - - def _get_terminal_display_formatter(self, - spacer=" "): - """ generate function to use for terminal formatting - """ - dirname_output_format = "%s/" - fname_output_format = spacer + "%s" - fp_format = '%s/%s' - - return self._get_display_formatter(dirname_output_format, - fname_output_format, - fp_format) - - def _format_path(self): - result_lines = [] - if self.recursive: - walked_dir = list(walk(self.path)) - else: - walked_dir = [next(walk(self.path))] - walked_dir.sort() - for dirname, subdirs, fnames in walked_dir: - result_lines += self.notebook_display_formatter(dirname, fnames, self.included_suffixes) - return '\n'.join(result_lines) - - def __repr__(self): - """return newline-separated absolute paths - """ - result_lines = [] - if self.recursive: - walked_dir = list(walk(self.path)) - else: - walked_dir = [next(walk(self.path))] - walked_dir.sort() - for dirname, subdirs, fnames in walked_dir: - result_lines += self.terminal_display_formatter(dirname, fnames, self.included_suffixes) - return '\n'.join(result_lines) - - -class Code(TextDisplayObject): - """Display syntax-highlighted source code. - - This uses Pygments to highlight the code for HTML and Latex output. - - Parameters - ---------- - data : str - The code as a string - url : str - A URL to fetch the code from - filename : str - A local filename to load the code from - language : str - The short name of a Pygments lexer to use for highlighting. - If not specified, it will guess the lexer based on the filename - or the code. Available lexers: http://pygments.org/docs/lexers/ - """ - def __init__(self, data=None, url=None, filename=None, language=None): - self.language = language - super().__init__(data=data, url=url, filename=filename) - - def _get_lexer(self): - if self.language: - from pygments.lexers import get_lexer_by_name - return get_lexer_by_name(self.language) - elif self.filename: - from pygments.lexers import get_lexer_for_filename - return get_lexer_for_filename(self.filename) - else: - from pygments.lexers import guess_lexer - return guess_lexer(self.data) - - def __repr__(self): - return self.data - - def _repr_html_(self): - from pygments import highlight - from pygments.formatters import HtmlFormatter - fmt = HtmlFormatter() - style = ''.format(fmt.get_style_defs('.output_html')) - return style + highlight(self.data, self._get_lexer(), fmt) - - def _repr_latex_(self): - from pygments import highlight - from pygments.formatters import LatexFormatter - return highlight(self.data, self._get_lexer(), LatexFormatter()) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/editorhooks.py b/.venv/lib/python3.12/site-packages/IPython/lib/editorhooks.py deleted file mode 100644 index d8bd6ac..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/editorhooks.py +++ /dev/null @@ -1,127 +0,0 @@ -""" 'editor' hooks for common editors that work well with ipython - -They should honor the line number argument, at least. - -Contributions are *very* welcome. -""" - -import os -import shlex -import subprocess -import sys - -from IPython import get_ipython -from IPython.core.error import TryNext -from IPython.utils import py3compat - - -def install_editor(template, wait=False): - """Installs the editor that is called by IPython for the %edit magic. - - This overrides the default editor, which is generally set by your EDITOR - environment variable or is notepad (windows) or vi (linux). By supplying a - template string `run_template`, you can control how the editor is invoked - by IPython -- (e.g. the format in which it accepts command line options) - - Parameters - ---------- - template : basestring - run_template acts as a template for how your editor is invoked by - the shell. It should contain '{filename}', which will be replaced on - invocation with the file name, and '{line}', $line by line number - (or 0) to invoke the file with. - wait : bool - If `wait` is true, wait until the user presses enter before returning, - to facilitate non-blocking editors that exit immediately after - the call. - """ - - # not all editors support $line, so we'll leave out this check - # for substitution in ['$file', '$line']: - # if not substitution in run_template: - # raise ValueError(('run_template should contain %s' - # ' for string substitution. You supplied "%s"' % (substitution, - # run_template))) - - def call_editor(self, filename, line=0): - if line is None: - line = 0 - cmd = template.format(filename=shlex.quote(filename), line=line) - print(">", cmd) - # shlex.quote doesn't work right on Windows, but it does after splitting - if sys.platform.startswith('win'): - cmd = shlex.split(cmd) - proc = subprocess.Popen(cmd, shell=True) - if proc.wait() != 0: - raise TryNext() - if wait: - py3compat.input("Press Enter when done editing:") - - get_ipython().set_hook('editor', call_editor) - get_ipython().editor = template - - -# in these, exe is always the path/name of the executable. Useful -# if you don't have the editor directory in your path -def komodo(exe=u'komodo'): - """ Activestate Komodo [Edit] """ - install_editor(exe + u' -l {line} {filename}', wait=True) - - -def scite(exe=u"scite"): - """ SciTE or Sc1 """ - install_editor(exe + u' {filename} -goto:{line}') - - -def notepadplusplus(exe=u'notepad++'): - """ Notepad++ http://notepad-plus.sourceforge.net """ - install_editor(exe + u' -n{line} {filename}') - - -def jed(exe=u'jed'): - """ JED, the lightweight emacsish editor """ - install_editor(exe + u' +{line} {filename}') - - -def idle(exe=u'idle'): - """ Idle, the editor bundled with python - - Parameters - ---------- - exe : str, None - If none, should be pretty smart about finding the executable. - """ - if exe is None: - import idlelib - p = os.path.dirname(idlelib.__filename__) - # i'm not sure if this actually works. Is this idle.py script - # guaranteed to be executable? - exe = os.path.join(p, 'idle.py') - install_editor(exe + u' {filename}') - - -def mate(exe=u'mate'): - """ TextMate, the missing editor""" - # wait=True is not required since we're using the -w flag to mate - install_editor(exe + u' -w -l {line} {filename}') - - -# ########################################## -# these are untested, report any problems -# ########################################## - - -def emacs(exe=u'emacs'): - install_editor(exe + u' +{line} {filename}') - - -def gnuclient(exe=u'gnuclient'): - install_editor(exe + u' -nw +{line} {filename}') - - -def crimson_editor(exe=u'cedt.exe'): - install_editor(exe + u' /L:{line} {filename}') - - -def kate(exe=u'kate'): - install_editor(exe + u' -u -l {line} {filename}') diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/guisupport.py b/.venv/lib/python3.12/site-packages/IPython/lib/guisupport.py deleted file mode 100644 index 4d532d0..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/guisupport.py +++ /dev/null @@ -1,155 +0,0 @@ -# coding: utf-8 -""" -Support for creating GUI apps and starting event loops. - -IPython's GUI integration allows interactive plotting and GUI usage in IPython -session. IPython has two different types of GUI integration: - -1. The terminal based IPython supports GUI event loops through Python's - PyOS_InputHook. PyOS_InputHook is a hook that Python calls periodically - whenever raw_input is waiting for a user to type code. We implement GUI - support in the terminal by setting PyOS_InputHook to a function that - iterates the event loop for a short while. It is important to note that - in this situation, the real GUI event loop is NOT run in the normal - manner, so you can't use the normal means to detect that it is running. -2. In the two process IPython kernel/frontend, the GUI event loop is run in - the kernel. In this case, the event loop is run in the normal manner by - calling the function or method of the GUI toolkit that starts the event - loop. - -In addition to starting the GUI event loops in one of these two ways, IPython -will *always* create an appropriate GUI application object when GUi -integration is enabled. - -If you want your GUI apps to run in IPython you need to do two things: - -1. Test to see if there is already an existing main application object. If - there is, you should use it. If there is not an existing application object - you should create one. -2. Test to see if the GUI event loop is running. If it is, you should not - start it. If the event loop is not running you may start it. - -This module contains functions for each toolkit that perform these things -in a consistent manner. Because of how PyOS_InputHook runs the event loop -you cannot detect if the event loop is running using the traditional calls -(such as ``wx.GetApp.IsMainLoopRunning()`` in wxPython). If PyOS_InputHook is -set These methods will return a false negative. That is, they will say the -event loop is not running, when is actually is. To work around this limitation -we proposed the following informal protocol: - -* Whenever someone starts the event loop, they *must* set the ``_in_event_loop`` - attribute of the main application object to ``True``. This should be done - regardless of how the event loop is actually run. -* Whenever someone stops the event loop, they *must* set the ``_in_event_loop`` - attribute of the main application object to ``False``. -* If you want to see if the event loop is running, you *must* use ``hasattr`` - to see if ``_in_event_loop`` attribute has been set. If it is set, you - *must* use its value. If it has not been set, you can query the toolkit - in the normal manner. -* If you want GUI support and no one else has created an application or - started the event loop you *must* do this. We don't want projects to - attempt to defer these things to someone else if they themselves need it. - -The functions below implement this logic for each GUI toolkit. If you need -to create custom application subclasses, you will likely have to modify this -code for your own purposes. This code can be copied into your own project -so you don't have to depend on IPython. - -""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - -from IPython.core.getipython import get_ipython - -#----------------------------------------------------------------------------- -# wx -#----------------------------------------------------------------------------- - -def get_app_wx(*args, **kwargs): - """Create a new wx app or return an exiting one.""" - import wx - app = wx.GetApp() - if app is None: - if 'redirect' not in kwargs: - kwargs['redirect'] = False - app = wx.PySimpleApp(*args, **kwargs) - return app - -def is_event_loop_running_wx(app=None): - """Is the wx event loop running.""" - # New way: check attribute on shell instance - ip = get_ipython() - if ip is not None: - if ip.active_eventloop and ip.active_eventloop == 'wx': - return True - # Fall through to checking the application, because Wx has a native way - # to check if the event loop is running, unlike Qt. - - # Old way: check Wx application - if app is None: - app = get_app_wx() - if hasattr(app, '_in_event_loop'): - return app._in_event_loop - else: - return app.IsMainLoopRunning() - -def start_event_loop_wx(app=None): - """Start the wx event loop in a consistent manner.""" - if app is None: - app = get_app_wx() - if not is_event_loop_running_wx(app): - app._in_event_loop = True - app.MainLoop() - app._in_event_loop = False - else: - app._in_event_loop = True - -#----------------------------------------------------------------------------- -# Qt -#----------------------------------------------------------------------------- - -def get_app_qt4(*args, **kwargs): - """Create a new Qt app or return an existing one.""" - from IPython.external.qt_for_kernel import QtGui - app = QtGui.QApplication.instance() - if app is None: - if not args: - args = ([""],) - app = QtGui.QApplication(*args, **kwargs) - return app - -def is_event_loop_running_qt4(app=None): - """Is the qt event loop running.""" - # New way: check attribute on shell instance - ip = get_ipython() - if ip is not None: - return ip.active_eventloop and ip.active_eventloop.startswith('qt') - - # Old way: check attribute on QApplication singleton - if app is None: - app = get_app_qt4([""]) - if hasattr(app, '_in_event_loop'): - return app._in_event_loop - else: - # Does qt provide a other way to detect this? - return False - -def start_event_loop_qt4(app=None): - """Start the qt event loop in a consistent manner.""" - if app is None: - app = get_app_qt4([""]) - if not is_event_loop_running_qt4(app): - app._in_event_loop = True - app.exec_() - app._in_event_loop = False - else: - app._in_event_loop = True - -#----------------------------------------------------------------------------- -# Tk -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# gtk -#----------------------------------------------------------------------------- diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/latextools.py b/.venv/lib/python3.12/site-packages/IPython/lib/latextools.py deleted file mode 100644 index 7bea589..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/latextools.py +++ /dev/null @@ -1,257 +0,0 @@ -# -*- coding: utf-8 -*- -"""Tools for handling LaTeX.""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - -from io import BytesIO, open -import os -import tempfile -import shutil -import subprocess -from base64 import encodebytes -import textwrap - -from pathlib import Path - -from IPython.utils.process import find_cmd, FindCmdError -from traitlets.config import get_config -from traitlets.config.configurable import SingletonConfigurable -from traitlets import List, Bool, Unicode - - -class LaTeXTool(SingletonConfigurable): - """An object to store configuration of the LaTeX tool.""" - def _config_default(self): - return get_config() - - backends = List( - Unicode(), ["matplotlib", "dvipng"], - help="Preferred backend to draw LaTeX math equations. " - "Backends in the list are checked one by one and the first " - "usable one is used. Note that `matplotlib` backend " - "is usable only for inline style equations. To draw " - "display style equations, `dvipng` backend must be specified. ", - # It is a List instead of Enum, to make configuration more - # flexible. For example, to use matplotlib mainly but dvipng - # for display style, the default ["matplotlib", "dvipng"] can - # be used. To NOT use dvipng so that other repr such as - # unicode pretty printing is used, you can use ["matplotlib"]. - ).tag(config=True) - - use_breqn = Bool( - True, - help="Use breqn.sty to automatically break long equations. " - "This configuration takes effect only for dvipng backend.", - ).tag(config=True) - - packages = List( - ['amsmath', 'amsthm', 'amssymb', 'bm'], - help="A list of packages to use for dvipng backend. " - "'breqn' will be automatically appended when use_breqn=True.", - ).tag(config=True) - - preamble = Unicode( - help="Additional preamble to use when generating LaTeX source " - "for dvipng backend.", - ).tag(config=True) - - -def latex_to_png( - s: str, encode=False, backend=None, wrap=False, color="Black", scale=1.0 -): - """Render a LaTeX string to PNG. - - Parameters - ---------- - s : str - The raw string containing valid inline LaTeX. - encode : bool, optional - Should the PNG data base64 encoded to make it JSON'able. - backend : {matplotlib, dvipng} - Backend for producing PNG data. - wrap : bool - If true, Automatically wrap `s` as a LaTeX equation. - color : string - Foreground color name among dvipsnames, e.g. 'Maroon' or on hex RGB - format, e.g. '#AA20FA'. - scale : float - Scale factor for the resulting PNG. - None is returned when the backend cannot be used. - - """ - assert isinstance(s, str) - allowed_backends = LaTeXTool.instance().backends - if backend is None: - backend = allowed_backends[0] - if backend not in allowed_backends: - return None - if backend == 'matplotlib': - f = latex_to_png_mpl - elif backend == 'dvipng': - f = latex_to_png_dvipng - if color.startswith('#'): - # Convert hex RGB color to LaTeX RGB color. - if len(color) == 7: - try: - color = "RGB {}".format(" ".join([str(int(x, 16)) for x in - textwrap.wrap(color[1:], 2)])) - except ValueError as e: - raise ValueError('Invalid color specification {}.'.format(color)) from e - else: - raise ValueError('Invalid color specification {}.'.format(color)) - else: - raise ValueError('No such backend {0}'.format(backend)) - bin_data = f(s, wrap, color, scale) - if encode and bin_data: - bin_data = encodebytes(bin_data) - return bin_data - - -def latex_to_png_mpl(s, wrap, color='Black', scale=1.0): - try: - from matplotlib import figure, font_manager, mathtext - from matplotlib.backends import backend_agg - from pyparsing import ParseFatalException - except ImportError: - return None - - # mpl mathtext doesn't support display math, force inline - s = s.replace('$$', '$') - if wrap: - s = u'${0}$'.format(s) - - try: - prop = font_manager.FontProperties(size=12) - dpi = 120 * scale - buffer = BytesIO() - - # Adapted from mathtext.math_to_image - parser = mathtext.MathTextParser("path") - width, height, depth, _, _ = parser.parse(s, dpi=72, prop=prop) - fig = figure.Figure(figsize=(width / 72, height / 72)) - fig.text(0, depth / height, s, fontproperties=prop, color=color) - backend_agg.FigureCanvasAgg(fig) - fig.savefig(buffer, dpi=dpi, format="png", transparent=True) - return buffer.getvalue() - except (ValueError, RuntimeError, ParseFatalException): - return None - - -def latex_to_png_dvipng(s, wrap, color='Black', scale=1.0): - try: - find_cmd('latex') - find_cmd('dvipng') - except FindCmdError: - return None - - startupinfo = None - if os.name == "nt": - # prevent popup-windows - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - - try: - workdir = Path(tempfile.mkdtemp()) - tmpfile = "tmp.tex" - dvifile = "tmp.dvi" - outfile = "tmp.png" - - with workdir.joinpath(tmpfile).open("w", encoding="utf8") as f: - f.writelines(genelatex(s, wrap)) - - subprocess.check_call( - ["latex", "-halt-on-error", "-interaction", "batchmode", tmpfile], - cwd=workdir, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - startupinfo=startupinfo, - ) - - resolution = round(150 * scale) - subprocess.check_call( - [ - "dvipng", - "-T", - "tight", - "-D", - str(resolution), - "-z", - "9", - "-bg", - "Transparent", - "-o", - outfile, - dvifile, - "-fg", - color, - ], - cwd=workdir, - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - startupinfo=startupinfo, - ) - - with workdir.joinpath(outfile).open("rb") as f: - return f.read() - except subprocess.CalledProcessError: - return None - finally: - shutil.rmtree(workdir) - - -def kpsewhich(filename): - """Invoke kpsewhich command with an argument `filename`.""" - try: - find_cmd("kpsewhich") - proc = subprocess.Popen( - ["kpsewhich", filename], - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (stdout, stderr) = proc.communicate() - return stdout.strip().decode('utf8', 'replace') - except FindCmdError: - pass - - -def genelatex(body, wrap): - """Generate LaTeX document for dvipng backend.""" - lt = LaTeXTool.instance() - breqn = wrap and lt.use_breqn and kpsewhich("breqn.sty") - yield r'\documentclass{article}' - packages = lt.packages - if breqn: - packages = packages + ['breqn'] - for pack in packages: - yield r'\usepackage{{{0}}}'.format(pack) - yield r'\pagestyle{empty}' - if lt.preamble: - yield lt.preamble - yield r'\begin{document}' - if breqn: - yield r'\begin{dmath*}' - yield body - yield r'\end{dmath*}' - elif wrap: - yield u'$${0}$$'.format(body) - else: - yield body - yield u'\\end{document}' - - -_data_uri_template_png = u"""%s""" - -def latex_to_html(s, alt='image'): - """Render LaTeX to HTML with embedded PNG data using data URIs. - - Parameters - ---------- - s : str - The raw string containing valid inline LateX. - alt : str - The alt text to use for the HTML. - """ - base64_data = latex_to_png(s, encode=True).decode('ascii') - if base64_data: - return _data_uri_template_png % (base64_data, alt) - - diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/lexers.py b/.venv/lib/python3.12/site-packages/IPython/lib/lexers.py deleted file mode 100644 index 9aa3433..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/lexers.py +++ /dev/null @@ -1,540 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Defines a variety of Pygments lexers for highlighting IPython code. - -This includes: - - IPythonLexer, IPython3Lexer - Lexers for pure IPython (python + magic/shell commands) - - IPythonPartialTracebackLexer, IPythonTracebackLexer - Supports 2.x and 3.x via keyword `python3`. The partial traceback - lexer reads everything but the Python code appearing in a traceback. - The full lexer combines the partial lexer with an IPython lexer. - - IPythonConsoleLexer - A lexer for IPython console sessions, with support for tracebacks. - - IPyLexer - A friendly lexer which examines the first line of text and from it, - decides whether to use an IPython lexer or an IPython console lexer. - This is probably the only lexer that needs to be explicitly added - to Pygments. - -""" -#----------------------------------------------------------------------------- -# Copyright (c) 2013, the IPython Development Team. -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -# Standard library -import re - -# Third party -from pygments.lexers import ( - BashLexer, HtmlLexer, JavascriptLexer, RubyLexer, PerlLexer, PythonLexer, - Python3Lexer, TexLexer) -from pygments.lexer import ( - Lexer, DelegatingLexer, RegexLexer, do_insertions, bygroups, using, -) -from pygments.token import ( - Generic, Keyword, Literal, Name, Operator, Other, Text, Error, -) -from pygments.util import get_bool_opt - -# Local - -line_re = re.compile('.*?\n') - -__all__ = ['build_ipy_lexer', 'IPython3Lexer', 'IPythonLexer', - 'IPythonPartialTracebackLexer', 'IPythonTracebackLexer', - 'IPythonConsoleLexer', 'IPyLexer'] - - -def build_ipy_lexer(python3): - """Builds IPython lexers depending on the value of `python3`. - - The lexer inherits from an appropriate Python lexer and then adds - information about IPython specific keywords (i.e. magic commands, - shell commands, etc.) - - Parameters - ---------- - python3 : bool - If `True`, then build an IPython lexer from a Python 3 lexer. - - """ - # It would be nice to have a single IPython lexer class which takes - # a boolean `python3`. But since there are two Python lexer classes, - # we will also have two IPython lexer classes. - if python3: - PyLexer = Python3Lexer - name = 'IPython3' - aliases = ['ipython3'] - doc = """IPython3 Lexer""" - else: - PyLexer = PythonLexer - name = 'IPython' - aliases = ['ipython2', 'ipython'] - doc = """IPython Lexer""" - - ipython_tokens = [ - (r'(?s)(\s*)(%%capture)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), - (r'(?s)(\s*)(%%debug)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), - (r'(?is)(\s*)(%%html)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(HtmlLexer))), - (r'(?s)(\s*)(%%javascript)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(JavascriptLexer))), - (r'(?s)(\s*)(%%js)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(JavascriptLexer))), - (r'(?s)(\s*)(%%latex)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(TexLexer))), - (r'(?s)(\s*)(%%perl)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PerlLexer))), - (r'(?s)(\s*)(%%prun)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), - (r'(?s)(\s*)(%%pypy)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), - (r'(?s)(\s*)(%%python)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), - (r'(?s)(\s*)(%%python2)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PythonLexer))), - (r'(?s)(\s*)(%%python3)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(Python3Lexer))), - (r'(?s)(\s*)(%%ruby)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(RubyLexer))), - (r'(?s)(\s*)(%%time)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), - (r'(?s)(\s*)(%%timeit)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), - (r'(?s)(\s*)(%%writefile)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), - (r'(?s)(\s*)(%%file)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(PyLexer))), - (r"(?s)(\s*)(%%)(\w+)(.*)", bygroups(Text, Operator, Keyword, Text)), - (r'(?s)(^\s*)(%%!)([^\n]*\n)(.*)', bygroups(Text, Operator, Text, using(BashLexer))), - (r"(%%?)(\w+)(\?\??)$", bygroups(Operator, Keyword, Operator)), - (r"\b(\?\??)(\s*)$", bygroups(Operator, Text)), - (r'(%)(sx|sc|system)(.*)(\n)', bygroups(Operator, Keyword, - using(BashLexer), Text)), - (r'(%)(\w+)(.*\n)', bygroups(Operator, Keyword, Text)), - (r'^(!!)(.+)(\n)', bygroups(Operator, using(BashLexer), Text)), - (r'(!)(?!=)(.+)(\n)', bygroups(Operator, using(BashLexer), Text)), - (r'^(\s*)(\?\??)(\s*%{0,2}[\w\.\*]*)', bygroups(Text, Operator, Text)), - (r'(\s*%{0,2}[\w\.\*]*)(\?\??)(\s*)$', bygroups(Text, Operator, Text)), - ] - - tokens = PyLexer.tokens.copy() - tokens['root'] = ipython_tokens + tokens['root'] - - attrs = {'name': name, 'aliases': aliases, 'filenames': [], - '__doc__': doc, 'tokens': tokens} - - return type(name, (PyLexer,), attrs) - - -IPython3Lexer = build_ipy_lexer(python3=True) -IPythonLexer = build_ipy_lexer(python3=False) - - -class IPythonPartialTracebackLexer(RegexLexer): - """ - Partial lexer for IPython tracebacks. - - Handles all the non-python output. - - """ - name = 'IPython Partial Traceback' - - tokens = { - 'root': [ - # Tracebacks for syntax errors have a different style. - # For both types of tracebacks, we mark the first line with - # Generic.Traceback. For syntax errors, we mark the filename - # as we mark the filenames for non-syntax tracebacks. - # - # These two regexps define how IPythonConsoleLexer finds a - # traceback. - # - ## Non-syntax traceback - (r'^(\^C)?(-+\n)', bygroups(Error, Generic.Traceback)), - ## Syntax traceback - (r'^( File)(.*)(, line )(\d+\n)', - bygroups(Generic.Traceback, Name.Namespace, - Generic.Traceback, Literal.Number.Integer)), - - # (Exception Identifier)(Whitespace)(Traceback Message) - (r'(?u)(^[^\d\W]\w*)(\s*)(Traceback.*?\n)', - bygroups(Name.Exception, Generic.Whitespace, Text)), - # (Module/Filename)(Text)(Callee)(Function Signature) - # Better options for callee and function signature? - (r'(.*)( in )(.*)(\(.*\)\n)', - bygroups(Name.Namespace, Text, Name.Entity, Name.Tag)), - # Regular line: (Whitespace)(Line Number)(Python Code) - (r'(\s*?)(\d+)(.*?\n)', - bygroups(Generic.Whitespace, Literal.Number.Integer, Other)), - # Emphasized line: (Arrow)(Line Number)(Python Code) - # Using Exception token so arrow color matches the Exception. - (r'(-*>?\s?)(\d+)(.*?\n)', - bygroups(Name.Exception, Literal.Number.Integer, Other)), - # (Exception Identifier)(Message) - (r'(?u)(^[^\d\W]\w*)(:.*?\n)', - bygroups(Name.Exception, Text)), - # Tag everything else as Other, will be handled later. - (r'.*\n', Other), - ], - } - - -class IPythonTracebackLexer(DelegatingLexer): - """ - IPython traceback lexer. - - For doctests, the tracebacks can be snipped as much as desired with the - exception to the lines that designate a traceback. For non-syntax error - tracebacks, this is the line of hyphens. For syntax error tracebacks, - this is the line which lists the File and line number. - - """ - # The lexer inherits from DelegatingLexer. The "root" lexer is an - # appropriate IPython lexer, which depends on the value of the boolean - # `python3`. First, we parse with the partial IPython traceback lexer. - # Then, any code marked with the "Other" token is delegated to the root - # lexer. - # - name = 'IPython Traceback' - aliases = ['ipythontb'] - - def __init__(self, **options): - """ - A subclass of `DelegatingLexer` which delegates to the appropriate to either IPyLexer, - IPythonPartialTracebackLexer. - """ - # note we need a __init__ doc, as otherwise it inherits the doc from the super class - # which will fail the documentation build as it references section of the pygments docs that - # do not exists when building IPython's docs. - self.python3 = get_bool_opt(options, 'python3', False) - if self.python3: - self.aliases = ['ipython3tb'] - else: - self.aliases = ['ipython2tb', 'ipythontb'] - - if self.python3: - IPyLexer = IPython3Lexer - else: - IPyLexer = IPythonLexer - - DelegatingLexer.__init__(self, IPyLexer, - IPythonPartialTracebackLexer, **options) - -class IPythonConsoleLexer(Lexer): - """ - An IPython console lexer for IPython code-blocks and doctests, such as: - - .. code-block:: rst - - .. code-block:: ipythonconsole - - In [1]: a = 'foo' - - In [2]: a - Out[2]: 'foo' - - In [3]: print(a) - foo - - - Support is also provided for IPython exceptions: - - .. code-block:: rst - - .. code-block:: ipythonconsole - - In [1]: raise Exception - Traceback (most recent call last): - ... - Exception - - """ - name = 'IPython console session' - aliases = ['ipythonconsole'] - mimetypes = ['text/x-ipython-console'] - - # The regexps used to determine what is input and what is output. - # The default prompts for IPython are: - # - # in = 'In [#]: ' - # continuation = ' .D.: ' - # template = 'Out[#]: ' - # - # Where '#' is the 'prompt number' or 'execution count' and 'D' - # D is a number of dots matching the width of the execution count - # - in1_regex = r'In \[[0-9]+\]: ' - in2_regex = r' \.\.+\.: ' - out_regex = r'Out\[[0-9]+\]: ' - - #: The regex to determine when a traceback starts. - ipytb_start = re.compile(r'^(\^C)?(-+\n)|^( File)(.*)(, line )(\d+\n)') - - def __init__(self, **options): - """Initialize the IPython console lexer. - - Parameters - ---------- - python3 : bool - If `True`, then the console inputs are parsed using a Python 3 - lexer. Otherwise, they are parsed using a Python 2 lexer. - in1_regex : RegexObject - The compiled regular expression used to detect the start - of inputs. Although the IPython configuration setting may have a - trailing whitespace, do not include it in the regex. If `None`, - then the default input prompt is assumed. - in2_regex : RegexObject - The compiled regular expression used to detect the continuation - of inputs. Although the IPython configuration setting may have a - trailing whitespace, do not include it in the regex. If `None`, - then the default input prompt is assumed. - out_regex : RegexObject - The compiled regular expression used to detect outputs. If `None`, - then the default output prompt is assumed. - - """ - self.python3 = get_bool_opt(options, 'python3', False) - if self.python3: - self.aliases = ['ipython3console'] - else: - self.aliases = ['ipython2console', 'ipythonconsole'] - - in1_regex = options.get('in1_regex', self.in1_regex) - in2_regex = options.get('in2_regex', self.in2_regex) - out_regex = options.get('out_regex', self.out_regex) - - # So that we can work with input and output prompts which have been - # rstrip'd (possibly by editors) we also need rstrip'd variants. If - # we do not do this, then such prompts will be tagged as 'output'. - # The reason can't just use the rstrip'd variants instead is because - # we want any whitespace associated with the prompt to be inserted - # with the token. This allows formatted code to be modified so as hide - # the appearance of prompts, with the whitespace included. One example - # use of this is in copybutton.js from the standard lib Python docs. - in1_regex_rstrip = in1_regex.rstrip() + '\n' - in2_regex_rstrip = in2_regex.rstrip() + '\n' - out_regex_rstrip = out_regex.rstrip() + '\n' - - # Compile and save them all. - attrs = ['in1_regex', 'in2_regex', 'out_regex', - 'in1_regex_rstrip', 'in2_regex_rstrip', 'out_regex_rstrip'] - for attr in attrs: - self.__setattr__(attr, re.compile(locals()[attr])) - - Lexer.__init__(self, **options) - - if self.python3: - pylexer = IPython3Lexer - tblexer = IPythonTracebackLexer - else: - pylexer = IPythonLexer - tblexer = IPythonTracebackLexer - - self.pylexer = pylexer(**options) - self.tblexer = tblexer(**options) - - self.reset() - - def reset(self): - self.mode = 'output' - self.index = 0 - self.buffer = u'' - self.insertions = [] - - def buffered_tokens(self): - """ - Generator of unprocessed tokens after doing insertions and before - changing to a new state. - - """ - if self.mode == 'output': - tokens = [(0, Generic.Output, self.buffer)] - elif self.mode == 'input': - tokens = self.pylexer.get_tokens_unprocessed(self.buffer) - else: # traceback - tokens = self.tblexer.get_tokens_unprocessed(self.buffer) - - for i, t, v in do_insertions(self.insertions, tokens): - # All token indexes are relative to the buffer. - yield self.index + i, t, v - - # Clear it all - self.index += len(self.buffer) - self.buffer = u'' - self.insertions = [] - - def get_mci(self, line): - """ - Parses the line and returns a 3-tuple: (mode, code, insertion). - - `mode` is the next mode (or state) of the lexer, and is always equal - to 'input', 'output', or 'tb'. - - `code` is a portion of the line that should be added to the buffer - corresponding to the next mode and eventually lexed by another lexer. - For example, `code` could be Python code if `mode` were 'input'. - - `insertion` is a 3-tuple (index, token, text) representing an - unprocessed "token" that will be inserted into the stream of tokens - that are created from the buffer once we change modes. This is usually - the input or output prompt. - - In general, the next mode depends on current mode and on the contents - of `line`. - - """ - # To reduce the number of regex match checks, we have multiple - # 'if' blocks instead of 'if-elif' blocks. - - # Check for possible end of input - in2_match = self.in2_regex.match(line) - in2_match_rstrip = self.in2_regex_rstrip.match(line) - if (in2_match and in2_match.group().rstrip() == line.rstrip()) or \ - in2_match_rstrip: - end_input = True - else: - end_input = False - if end_input and self.mode != 'tb': - # Only look for an end of input when not in tb mode. - # An ellipsis could appear within the traceback. - mode = 'output' - code = u'' - insertion = (0, Generic.Prompt, line) - return mode, code, insertion - - # Check for output prompt - out_match = self.out_regex.match(line) - out_match_rstrip = self.out_regex_rstrip.match(line) - if out_match or out_match_rstrip: - mode = 'output' - if out_match: - idx = out_match.end() - else: - idx = out_match_rstrip.end() - code = line[idx:] - # Use the 'heading' token for output. We cannot use Generic.Error - # since it would conflict with exceptions. - insertion = (0, Generic.Heading, line[:idx]) - return mode, code, insertion - - - # Check for input or continuation prompt (non stripped version) - in1_match = self.in1_regex.match(line) - if in1_match or (in2_match and self.mode != 'tb'): - # New input or when not in tb, continued input. - # We do not check for continued input when in tb since it is - # allowable to replace a long stack with an ellipsis. - mode = 'input' - if in1_match: - idx = in1_match.end() - else: # in2_match - idx = in2_match.end() - code = line[idx:] - insertion = (0, Generic.Prompt, line[:idx]) - return mode, code, insertion - - # Check for input or continuation prompt (stripped version) - in1_match_rstrip = self.in1_regex_rstrip.match(line) - if in1_match_rstrip or (in2_match_rstrip and self.mode != 'tb'): - # New input or when not in tb, continued input. - # We do not check for continued input when in tb since it is - # allowable to replace a long stack with an ellipsis. - mode = 'input' - if in1_match_rstrip: - idx = in1_match_rstrip.end() - else: # in2_match - idx = in2_match_rstrip.end() - code = line[idx:] - insertion = (0, Generic.Prompt, line[:idx]) - return mode, code, insertion - - # Check for traceback - if self.ipytb_start.match(line): - mode = 'tb' - code = line - insertion = None - return mode, code, insertion - - # All other stuff... - if self.mode in ('input', 'output'): - # We assume all other text is output. Multiline input that - # does not use the continuation marker cannot be detected. - # For example, the 3 in the following is clearly output: - # - # In [1]: print(3) - # 3 - # - # But the following second line is part of the input: - # - # In [2]: while True: - # print(True) - # - # In both cases, the 2nd line will be 'output'. - # - mode = 'output' - else: - mode = 'tb' - - code = line - insertion = None - - return mode, code, insertion - - def get_tokens_unprocessed(self, text): - self.reset() - for match in line_re.finditer(text): - line = match.group() - mode, code, insertion = self.get_mci(line) - - if mode != self.mode: - # Yield buffered tokens before transitioning to new mode. - for token in self.buffered_tokens(): - yield token - self.mode = mode - - if insertion: - self.insertions.append((len(self.buffer), [insertion])) - self.buffer += code - - for token in self.buffered_tokens(): - yield token - -class IPyLexer(Lexer): - r""" - Primary lexer for all IPython-like code. - - This is a simple helper lexer. If the first line of the text begins with - "In \[[0-9]+\]:", then the entire text is parsed with an IPython console - lexer. If not, then the entire text is parsed with an IPython lexer. - - The goal is to reduce the number of lexers that are registered - with Pygments. - - """ - name = 'IPy session' - aliases = ['ipy'] - - def __init__(self, **options): - """ - Create a new IPyLexer instance which dispatch to either an - IPythonCOnsoleLexer (if In prompts are present) or and IPythonLexer (if - In prompts are not present). - """ - # init docstring is necessary for docs not to fail to build do to parent - # docs referenceing a section in pygments docs. - self.python3 = get_bool_opt(options, 'python3', False) - if self.python3: - self.aliases = ['ipy3'] - else: - self.aliases = ['ipy2', 'ipy'] - - Lexer.__init__(self, **options) - - self.IPythonLexer = IPythonLexer(**options) - self.IPythonConsoleLexer = IPythonConsoleLexer(**options) - - def get_tokens_unprocessed(self, text): - # Search for the input prompt anywhere...this allows code blocks to - # begin with comments as well. - if re.match(r'.*(In \[[0-9]+\]:)', text.strip(), re.DOTALL): - lex = self.IPythonConsoleLexer - else: - lex = self.IPythonLexer - for token in lex.get_tokens_unprocessed(text): - yield token - diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/pretty.py b/.venv/lib/python3.12/site-packages/IPython/lib/pretty.py deleted file mode 100644 index a232e4e..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/pretty.py +++ /dev/null @@ -1,961 +0,0 @@ -""" -Python advanced pretty printer. This pretty printer is intended to -replace the old `pprint` python module which does not allow developers -to provide their own pretty print callbacks. - -This module is based on ruby's `prettyprint.rb` library by `Tanaka Akira`. - - -Example Usage -------------- - -To directly print the representation of an object use `pprint`:: - - from pretty import pprint - pprint(complex_object) - -To get a string of the output use `pretty`:: - - from pretty import pretty - string = pretty(complex_object) - - -Extending ---------- - -The pretty library allows developers to add pretty printing rules for their -own objects. This process is straightforward. All you have to do is to -add a `_repr_pretty_` method to your object and call the methods on the -pretty printer passed:: - - class MyObject(object): - - def _repr_pretty_(self, p, cycle): - ... - -Here's an example for a class with a simple constructor:: - - class MySimpleObject: - - def __init__(self, a, b, *, c=None): - self.a = a - self.b = b - self.c = c - - def _repr_pretty_(self, p, cycle): - ctor = CallExpression.factory(self.__class__.__name__) - if self.c is None: - p.pretty(ctor(a, b)) - else: - p.pretty(ctor(a, b, c=c)) - -Here is an example implementation of a `_repr_pretty_` method for a list -subclass:: - - class MyList(list): - - def _repr_pretty_(self, p, cycle): - if cycle: - p.text('MyList(...)') - else: - with p.group(8, 'MyList([', '])'): - for idx, item in enumerate(self): - if idx: - p.text(',') - p.breakable() - p.pretty(item) - -The `cycle` parameter is `True` if pretty detected a cycle. You *have* to -react to that or the result is an infinite loop. `p.text()` just adds -non breaking text to the output, `p.breakable()` either adds a whitespace -or breaks here. If you pass it an argument it's used instead of the -default space. `p.pretty` prettyprints another object using the pretty print -method. - -The first parameter to the `group` function specifies the extra indentation -of the next line. In this example the next item will either be on the same -line (if the items are short enough) or aligned with the right edge of the -opening bracket of `MyList`. - -If you just want to indent something you can use the group function -without open / close parameters. You can also use this code:: - - with p.indent(2): - ... - -Inheritance diagram: - -.. inheritance-diagram:: IPython.lib.pretty - :parts: 3 - -:copyright: 2007 by Armin Ronacher. - Portions (c) 2009 by Robert Kern. -:license: BSD License. -""" - -from contextlib import contextmanager -import datetime -import os -import re -import sys -import types -from collections import deque -from inspect import signature -from io import StringIO -from warnings import warn - -from IPython.utils.decorators import undoc -from IPython.utils.py3compat import PYPY - -from typing import Dict - -__all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter', - 'for_type', 'for_type_by_name', 'RawText', 'RawStringLiteral', 'CallExpression'] - - -MAX_SEQ_LENGTH = 1000 -_re_pattern_type = type(re.compile('')) - -def _safe_getattr(obj, attr, default=None): - """Safe version of getattr. - - Same as getattr, but will return ``default`` on any Exception, - rather than raising. - """ - try: - return getattr(obj, attr, default) - except Exception: - return default - -@undoc -class CUnicodeIO(StringIO): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - warn(("CUnicodeIO is deprecated since IPython 6.0. " - "Please use io.StringIO instead."), - DeprecationWarning, stacklevel=2) - -def _sorted_for_pprint(items): - """ - Sort the given items for pretty printing. Since some predictable - sorting is better than no sorting at all, we sort on the string - representation if normal sorting fails. - """ - items = list(items) - try: - return sorted(items) - except Exception: - try: - return sorted(items, key=str) - except Exception: - return items - -def pretty(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): - """ - Pretty print the object's representation. - """ - stream = StringIO() - printer = RepresentationPrinter(stream, verbose, max_width, newline, max_seq_length=max_seq_length) - printer.pretty(obj) - printer.flush() - return stream.getvalue() - - -def pprint(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): - """ - Like `pretty` but print to stdout. - """ - printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline, max_seq_length=max_seq_length) - printer.pretty(obj) - printer.flush() - sys.stdout.write(newline) - sys.stdout.flush() - -class _PrettyPrinterBase(object): - - @contextmanager - def indent(self, indent): - """with statement support for indenting/dedenting.""" - self.indentation += indent - try: - yield - finally: - self.indentation -= indent - - @contextmanager - def group(self, indent=0, open='', close=''): - """like begin_group / end_group but for the with statement.""" - self.begin_group(indent, open) - try: - yield - finally: - self.end_group(indent, close) - -class PrettyPrinter(_PrettyPrinterBase): - """ - Baseclass for the `RepresentationPrinter` prettyprinter that is used to - generate pretty reprs of objects. Contrary to the `RepresentationPrinter` - this printer knows nothing about the default pprinters or the `_repr_pretty_` - callback method. - """ - - def __init__(self, output, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH): - self.output = output - self.max_width = max_width - self.newline = newline - self.max_seq_length = max_seq_length - self.output_width = 0 - self.buffer_width = 0 - self.buffer = deque() - - root_group = Group(0) - self.group_stack = [root_group] - self.group_queue = GroupQueue(root_group) - self.indentation = 0 - - def _break_one_group(self, group): - while group.breakables: - x = self.buffer.popleft() - self.output_width = x.output(self.output, self.output_width) - self.buffer_width -= x.width - while self.buffer and isinstance(self.buffer[0], Text): - x = self.buffer.popleft() - self.output_width = x.output(self.output, self.output_width) - self.buffer_width -= x.width - - def _break_outer_groups(self): - while self.max_width < self.output_width + self.buffer_width: - group = self.group_queue.deq() - if not group: - return - self._break_one_group(group) - - def text(self, obj): - """Add literal text to the output.""" - width = len(obj) - if self.buffer: - text = self.buffer[-1] - if not isinstance(text, Text): - text = Text() - self.buffer.append(text) - text.add(obj, width) - self.buffer_width += width - self._break_outer_groups() - else: - self.output.write(obj) - self.output_width += width - - def breakable(self, sep=' '): - """ - Add a breakable separator to the output. This does not mean that it - will automatically break here. If no breaking on this position takes - place the `sep` is inserted which default to one space. - """ - width = len(sep) - group = self.group_stack[-1] - if group.want_break: - self.flush() - self.output.write(self.newline) - self.output.write(' ' * self.indentation) - self.output_width = self.indentation - self.buffer_width = 0 - else: - self.buffer.append(Breakable(sep, width, self)) - self.buffer_width += width - self._break_outer_groups() - - def break_(self): - """ - Explicitly insert a newline into the output, maintaining correct indentation. - """ - group = self.group_queue.deq() - if group: - self._break_one_group(group) - self.flush() - self.output.write(self.newline) - self.output.write(' ' * self.indentation) - self.output_width = self.indentation - self.buffer_width = 0 - - - def begin_group(self, indent=0, open=''): - """ - Begin a group. - The first parameter specifies the indentation for the next line (usually - the width of the opening text), the second the opening text. All - parameters are optional. - """ - if open: - self.text(open) - group = Group(self.group_stack[-1].depth + 1) - self.group_stack.append(group) - self.group_queue.enq(group) - self.indentation += indent - - def _enumerate(self, seq): - """like enumerate, but with an upper limit on the number of items""" - for idx, x in enumerate(seq): - if self.max_seq_length and idx >= self.max_seq_length: - self.text(',') - self.breakable() - self.text('...') - return - yield idx, x - - def end_group(self, dedent=0, close=''): - """End a group. See `begin_group` for more details.""" - self.indentation -= dedent - group = self.group_stack.pop() - if not group.breakables: - self.group_queue.remove(group) - if close: - self.text(close) - - def flush(self): - """Flush data that is left in the buffer.""" - for data in self.buffer: - self.output_width += data.output(self.output, self.output_width) - self.buffer.clear() - self.buffer_width = 0 - - -def _get_mro(obj_class): - """ Get a reasonable method resolution order of a class and its superclasses - for both old-style and new-style classes. - """ - if not hasattr(obj_class, '__mro__'): - # Old-style class. Mix in object to make a fake new-style class. - try: - obj_class = type(obj_class.__name__, (obj_class, object), {}) - except TypeError: - # Old-style extension type that does not descend from object. - # FIXME: try to construct a more thorough MRO. - mro = [obj_class] - else: - mro = obj_class.__mro__[1:-1] - else: - mro = obj_class.__mro__ - return mro - - -class RepresentationPrinter(PrettyPrinter): - """ - Special pretty printer that has a `pretty` method that calls the pretty - printer for a python object. - - This class stores processing data on `self` so you must *never* use - this class in a threaded environment. Always lock it or reinstanciate - it. - - Instances also have a verbose flag callbacks can access to control their - output. For example the default instance repr prints all attributes and - methods that are not prefixed by an underscore if the printer is in - verbose mode. - """ - - def __init__(self, output, verbose=False, max_width=79, newline='\n', - singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None, - max_seq_length=MAX_SEQ_LENGTH): - - PrettyPrinter.__init__(self, output, max_width, newline, max_seq_length=max_seq_length) - self.verbose = verbose - self.stack = [] - if singleton_pprinters is None: - singleton_pprinters = _singleton_pprinters.copy() - self.singleton_pprinters = singleton_pprinters - if type_pprinters is None: - type_pprinters = _type_pprinters.copy() - self.type_pprinters = type_pprinters - if deferred_pprinters is None: - deferred_pprinters = _deferred_type_pprinters.copy() - self.deferred_pprinters = deferred_pprinters - - def pretty(self, obj): - """Pretty print the given object.""" - obj_id = id(obj) - cycle = obj_id in self.stack - self.stack.append(obj_id) - self.begin_group() - try: - obj_class = _safe_getattr(obj, '__class__', None) or type(obj) - # First try to find registered singleton printers for the type. - try: - printer = self.singleton_pprinters[obj_id] - except (TypeError, KeyError): - pass - else: - return printer(obj, self, cycle) - # Next walk the mro and check for either: - # 1) a registered printer - # 2) a _repr_pretty_ method - for cls in _get_mro(obj_class): - if cls in self.type_pprinters: - # printer registered in self.type_pprinters - return self.type_pprinters[cls](obj, self, cycle) - else: - # deferred printer - printer = self._in_deferred_types(cls) - if printer is not None: - return printer(obj, self, cycle) - else: - # Finally look for special method names. - # Some objects automatically create any requested - # attribute. Try to ignore most of them by checking for - # callability. - if '_repr_pretty_' in cls.__dict__: - meth = cls._repr_pretty_ - if callable(meth): - return meth(obj, self, cycle) - if ( - cls is not object - # check if cls defines __repr__ - and "__repr__" in cls.__dict__ - # check if __repr__ is callable. - # Note: we need to test getattr(cls, '__repr__') - # instead of cls.__dict__['__repr__'] - # in order to work with descriptors like partialmethod, - and callable(_safe_getattr(cls, "__repr__", None)) - ): - return _repr_pprint(obj, self, cycle) - - return _default_pprint(obj, self, cycle) - finally: - self.end_group() - self.stack.pop() - - def _in_deferred_types(self, cls): - """ - Check if the given class is specified in the deferred type registry. - - Returns the printer from the registry if it exists, and None if the - class is not in the registry. Successful matches will be moved to the - regular type registry for future use. - """ - mod = _safe_getattr(cls, '__module__', None) - name = _safe_getattr(cls, '__name__', None) - key = (mod, name) - printer = None - if key in self.deferred_pprinters: - # Move the printer over to the regular registry. - printer = self.deferred_pprinters.pop(key) - self.type_pprinters[cls] = printer - return printer - - -class Printable(object): - - def output(self, stream, output_width): - return output_width - - -class Text(Printable): - - def __init__(self): - self.objs = [] - self.width = 0 - - def output(self, stream, output_width): - for obj in self.objs: - stream.write(obj) - return output_width + self.width - - def add(self, obj, width): - self.objs.append(obj) - self.width += width - - -class Breakable(Printable): - - def __init__(self, seq, width, pretty): - self.obj = seq - self.width = width - self.pretty = pretty - self.indentation = pretty.indentation - self.group = pretty.group_stack[-1] - self.group.breakables.append(self) - - def output(self, stream, output_width): - self.group.breakables.popleft() - if self.group.want_break: - stream.write(self.pretty.newline) - stream.write(' ' * self.indentation) - return self.indentation - if not self.group.breakables: - self.pretty.group_queue.remove(self.group) - stream.write(self.obj) - return output_width + self.width - - -class Group(Printable): - - def __init__(self, depth): - self.depth = depth - self.breakables = deque() - self.want_break = False - - -class GroupQueue(object): - - def __init__(self, *groups): - self.queue = [] - for group in groups: - self.enq(group) - - def enq(self, group): - depth = group.depth - while depth > len(self.queue) - 1: - self.queue.append([]) - self.queue[depth].append(group) - - def deq(self): - for stack in self.queue: - for idx, group in enumerate(reversed(stack)): - if group.breakables: - del stack[idx] - group.want_break = True - return group - for group in stack: - group.want_break = True - del stack[:] - - def remove(self, group): - try: - self.queue[group.depth].remove(group) - except ValueError: - pass - - -class RawText: - """ Object such that ``p.pretty(RawText(value))`` is the same as ``p.text(value)``. - - An example usage of this would be to show a list as binary numbers, using - ``p.pretty([RawText(bin(i)) for i in integers])``. - """ - def __init__(self, value): - self.value = value - - def _repr_pretty_(self, p, cycle): - p.text(self.value) - - -class CallExpression: - """ Object which emits a line-wrapped call expression in the form `__name(*args, **kwargs)` """ - def __init__(__self, __name, *args, **kwargs): - # dunders are to avoid clashes with kwargs, as python's name managing - # will kick in. - self = __self - self.name = __name - self.args = args - self.kwargs = kwargs - - @classmethod - def factory(cls, name): - def inner(*args, **kwargs): - return cls(name, *args, **kwargs) - return inner - - def _repr_pretty_(self, p, cycle): - # dunders are to avoid clashes with kwargs, as python's name managing - # will kick in. - - started = False - def new_item(): - nonlocal started - if started: - p.text(",") - p.breakable() - started = True - - prefix = self.name + "(" - with p.group(len(prefix), prefix, ")"): - for arg in self.args: - new_item() - p.pretty(arg) - for arg_name, arg in self.kwargs.items(): - new_item() - arg_prefix = arg_name + "=" - with p.group(len(arg_prefix), arg_prefix): - p.pretty(arg) - - -class RawStringLiteral: - """ Wrapper that shows a string with a `r` prefix """ - def __init__(self, value): - self.value = value - - def _repr_pretty_(self, p, cycle): - base_repr = repr(self.value) - if base_repr[:1] in 'uU': - base_repr = base_repr[1:] - prefix = 'ur' - else: - prefix = 'r' - base_repr = prefix + base_repr.replace('\\\\', '\\') - p.text(base_repr) - - -def _default_pprint(obj, p, cycle): - """ - The default print function. Used if an object does not provide one and - it's none of the builtin objects. - """ - klass = _safe_getattr(obj, '__class__', None) or type(obj) - if _safe_getattr(klass, '__repr__', None) is not object.__repr__: - # A user-provided repr. Find newlines and replace them with p.break_() - _repr_pprint(obj, p, cycle) - return - p.begin_group(1, '<') - p.pretty(klass) - p.text(' at 0x%x' % id(obj)) - if cycle: - p.text(' ...') - elif p.verbose: - first = True - for key in dir(obj): - if not key.startswith('_'): - try: - value = getattr(obj, key) - except AttributeError: - continue - if isinstance(value, types.MethodType): - continue - if not first: - p.text(',') - p.breakable() - p.text(key) - p.text('=') - step = len(key) + 1 - p.indentation += step - p.pretty(value) - p.indentation -= step - first = False - p.end_group(1, '>') - - -def _seq_pprinter_factory(start, end): - """ - Factory that returns a pprint function useful for sequences. Used by - the default pprint for tuples and lists. - """ - def inner(obj, p, cycle): - if cycle: - return p.text(start + '...' + end) - step = len(start) - p.begin_group(step, start) - for idx, x in p._enumerate(obj): - if idx: - p.text(',') - p.breakable() - p.pretty(x) - if len(obj) == 1 and isinstance(obj, tuple): - # Special case for 1-item tuples. - p.text(',') - p.end_group(step, end) - return inner - - -def _set_pprinter_factory(start, end): - """ - Factory that returns a pprint function useful for sets and frozensets. - """ - def inner(obj, p, cycle): - if cycle: - return p.text(start + '...' + end) - if len(obj) == 0: - # Special case. - p.text(type(obj).__name__ + '()') - else: - step = len(start) - p.begin_group(step, start) - # Like dictionary keys, we will try to sort the items if there aren't too many - if not (p.max_seq_length and len(obj) >= p.max_seq_length): - items = _sorted_for_pprint(obj) - else: - items = obj - for idx, x in p._enumerate(items): - if idx: - p.text(',') - p.breakable() - p.pretty(x) - p.end_group(step, end) - return inner - - -def _dict_pprinter_factory(start, end): - """ - Factory that returns a pprint function used by the default pprint of - dicts and dict proxies. - """ - def inner(obj, p, cycle): - if cycle: - return p.text('{...}') - step = len(start) - p.begin_group(step, start) - keys = obj.keys() - for idx, key in p._enumerate(keys): - if idx: - p.text(',') - p.breakable() - p.pretty(key) - p.text(': ') - p.pretty(obj[key]) - p.end_group(step, end) - return inner - - -def _super_pprint(obj, p, cycle): - """The pprint for the super type.""" - p.begin_group(8, '') - - - -class _ReFlags: - def __init__(self, value): - self.value = value - - def _repr_pretty_(self, p, cycle): - done_one = False - for flag in ( - "IGNORECASE", - "LOCALE", - "MULTILINE", - "DOTALL", - "UNICODE", - "VERBOSE", - "DEBUG", - ): - if self.value & getattr(re, flag): - if done_one: - p.text('|') - p.text('re.' + flag) - done_one = True - - -def _re_pattern_pprint(obj, p, cycle): - """The pprint function for regular expression patterns.""" - re_compile = CallExpression.factory('re.compile') - if obj.flags: - p.pretty(re_compile(RawStringLiteral(obj.pattern), _ReFlags(obj.flags))) - else: - p.pretty(re_compile(RawStringLiteral(obj.pattern))) - - -def _types_simplenamespace_pprint(obj, p, cycle): - """The pprint function for types.SimpleNamespace.""" - namespace = CallExpression.factory('namespace') - if cycle: - p.pretty(namespace(RawText("..."))) - else: - p.pretty(namespace(**obj.__dict__)) - - -def _type_pprint(obj, p, cycle): - """The pprint for classes and types.""" - # Heap allocated types might not have the module attribute, - # and others may set it to None. - - # Checks for a __repr__ override in the metaclass. Can't compare the - # type(obj).__repr__ directly because in PyPy the representation function - # inherited from type isn't the same type.__repr__ - if [m for m in _get_mro(type(obj)) if "__repr__" in vars(m)][:1] != [type]: - _repr_pprint(obj, p, cycle) - return - - mod = _safe_getattr(obj, '__module__', None) - try: - name = obj.__qualname__ - if not isinstance(name, str): - # This can happen if the type implements __qualname__ as a property - # or other descriptor in Python 2. - raise Exception("Try __name__") - except Exception: - name = obj.__name__ - if not isinstance(name, str): - name = '' - - if mod in (None, '__builtin__', 'builtins', 'exceptions'): - p.text(name) - else: - p.text(mod + '.' + name) - - -def _repr_pprint(obj, p, cycle): - """A pprint that just redirects to the normal repr function.""" - # Find newlines and replace them with p.break_() - output = repr(obj) - lines = output.splitlines() - with p.group(): - for idx, output_line in enumerate(lines): - if idx: - p.break_() - p.text(output_line) - - -def _function_pprint(obj, p, cycle): - """Base pprint for all functions and builtin functions.""" - name = _safe_getattr(obj, '__qualname__', obj.__name__) - mod = obj.__module__ - if mod and mod not in ('__builtin__', 'builtins', 'exceptions'): - name = mod + '.' + name - try: - func_def = name + str(signature(obj)) - except ValueError: - func_def = name - p.text('' % func_def) - - -def _exception_pprint(obj, p, cycle): - """Base pprint for all exceptions.""" - name = getattr(obj.__class__, '__qualname__', obj.__class__.__name__) - if obj.__class__.__module__ not in ('exceptions', 'builtins'): - name = '%s.%s' % (obj.__class__.__module__, name) - - p.pretty(CallExpression(name, *getattr(obj, 'args', ()))) - - -#: the exception base -_exception_base: type -try: - _exception_base = BaseException -except NameError: - _exception_base = Exception - - -#: printers for builtin types -_type_pprinters = { - int: _repr_pprint, - float: _repr_pprint, - str: _repr_pprint, - tuple: _seq_pprinter_factory('(', ')'), - list: _seq_pprinter_factory('[', ']'), - dict: _dict_pprinter_factory('{', '}'), - set: _set_pprinter_factory('{', '}'), - frozenset: _set_pprinter_factory('frozenset({', '})'), - super: _super_pprint, - _re_pattern_type: _re_pattern_pprint, - type: _type_pprint, - types.FunctionType: _function_pprint, - types.BuiltinFunctionType: _function_pprint, - types.MethodType: _repr_pprint, - types.SimpleNamespace: _types_simplenamespace_pprint, - datetime.datetime: _repr_pprint, - datetime.timedelta: _repr_pprint, - _exception_base: _exception_pprint -} - -# render os.environ like a dict -_env_type = type(os.environ) -# future-proof in case os.environ becomes a plain dict? -if _env_type is not dict: - _type_pprinters[_env_type] = _dict_pprinter_factory('environ{', '}') - -_type_pprinters[types.MappingProxyType] = _dict_pprinter_factory("mappingproxy({", "})") -_type_pprinters[slice] = _repr_pprint - -_type_pprinters[range] = _repr_pprint -_type_pprinters[bytes] = _repr_pprint - -#: printers for types specified by name -_deferred_type_pprinters: Dict = {} - - -def for_type(typ, func): - """ - Add a pretty printer for a given type. - """ - oldfunc = _type_pprinters.get(typ, None) - if func is not None: - # To support easy restoration of old pprinters, we need to ignore Nones. - _type_pprinters[typ] = func - return oldfunc - -def for_type_by_name(type_module, type_name, func): - """ - Add a pretty printer for a type specified by the module and name of a type - rather than the type object itself. - """ - key = (type_module, type_name) - oldfunc = _deferred_type_pprinters.get(key, None) - if func is not None: - # To support easy restoration of old pprinters, we need to ignore Nones. - _deferred_type_pprinters[key] = func - return oldfunc - - -#: printers for the default singletons -_singleton_pprinters = dict.fromkeys(map(id, [None, True, False, Ellipsis, - NotImplemented]), _repr_pprint) - - -def _defaultdict_pprint(obj, p, cycle): - cls_ctor = CallExpression.factory(obj.__class__.__name__) - if cycle: - p.pretty(cls_ctor(RawText("..."))) - else: - p.pretty(cls_ctor(obj.default_factory, dict(obj))) - -def _ordereddict_pprint(obj, p, cycle): - cls_ctor = CallExpression.factory(obj.__class__.__name__) - if cycle: - p.pretty(cls_ctor(RawText("..."))) - elif len(obj): - p.pretty(cls_ctor(list(obj.items()))) - else: - p.pretty(cls_ctor()) - -def _deque_pprint(obj, p, cycle): - cls_ctor = CallExpression.factory(obj.__class__.__name__) - if cycle: - p.pretty(cls_ctor(RawText("..."))) - elif obj.maxlen is not None: - p.pretty(cls_ctor(list(obj), maxlen=obj.maxlen)) - else: - p.pretty(cls_ctor(list(obj))) - -def _counter_pprint(obj, p, cycle): - cls_ctor = CallExpression.factory(obj.__class__.__name__) - if cycle: - p.pretty(cls_ctor(RawText("..."))) - elif len(obj): - p.pretty(cls_ctor(dict(obj.most_common()))) - else: - p.pretty(cls_ctor()) - - -def _userlist_pprint(obj, p, cycle): - cls_ctor = CallExpression.factory(obj.__class__.__name__) - if cycle: - p.pretty(cls_ctor(RawText("..."))) - else: - p.pretty(cls_ctor(obj.data)) - - -for_type_by_name('collections', 'defaultdict', _defaultdict_pprint) -for_type_by_name('collections', 'OrderedDict', _ordereddict_pprint) -for_type_by_name('collections', 'deque', _deque_pprint) -for_type_by_name('collections', 'Counter', _counter_pprint) -for_type_by_name("collections", "UserList", _userlist_pprint) - -if __name__ == '__main__': - from random import randrange - class Foo(object): - def __init__(self): - self.foo = 1 - self.bar = re.compile(r'\s+') - self.blub = dict.fromkeys(range(30), randrange(1, 40)) - self.hehe = 23424.234234 - self.list = ["blub", "blah", self] - - def get_foo(self): - print("foo") - - pprint(Foo(), verbose=True) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__init__.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index bc4e2e87e028ae750c28de9e3491b48f436390f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185 zcmX@j%ge<81d5Cc(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!iqOx<&rQ|ODl1D( z(N9S&(=SOaE-A<^*4Hab%`4N-$xPBOs4U6I&okCDG}155EJ@WZNKDR7OiwM=_Y45b yfE9tX73;^xXXa&=#K-FuRQ}?y$<0qG%}KQ@Vg*{n2*kx8#z$sGM#ds$APWGg&o8V1 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_backgroundjobs.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_backgroundjobs.cpython-312.pyc deleted file mode 100644 index f5049113d10fc57a0230f4dd1bb32942c6acac81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3190 zcmeHJL2nyH6rR~#$7@fLrfNx(Hgz{~D(XODQ4mzLYE@dQ5=sPuQ!bY6-8gnOyVlGm zsUxRyt4M9&P!32foQi~ys&L@SZ{Xr2NLZ_!fJ?3uD$b z=WJ^%`UrnLk)VEeCY_zhad*x!3vNc_MlTKg`qS%2FJx(bbJ&HT9e`HfsMnk;lQJzU z-_TVR)d*Qqy}Cq5K?}xOd6}%%Z7C_MACiPJkx+d-?|2rUPuqUf^`o&PXLR6Vf=YS^_$mnZ$c~Q-4Va)wom&0qp(7-jv`iK|NYlr+DEN1=|FV@f4Y*umA@5Ba4PP54 zMMC8fFyx3(Kl1kVtX1^#t^>okBxlGvfeE}*@GI|z-VbMaTEH#wL+~|>(fz+Kr`8U?xe+~E)z0!B(8)q;60V7D`)go-b>7vw*%B#}Li4=!LFha3Ah9=GftB_w<*N<#yjSX$E;mYNj-g#GF(LXz~ zq4!rV*0j*=D>tt!U#+puyJuF;d^*0yPJH#oIvc5KBWrAApF27YQTt!qk%t(R1oz&& zlg8K%(oMQ^Pi;1c*j>~>h^g$@!0HEgsln$CR@&CwZyzmdmeho{*we&I)^$AY+K({* zalFonM1;S9AHB$qAjA0QeZYLxwj4i_b!UsVpV+?7`qVi&wRHmBoYM(n{%*^Y=ekXR)dltFl-vi1X!Z zds(fq`2R2h$G6g-z-T{cw!m4!s9(aU4k5#xG7t`!hJ=I?H{gGJ;0ZId#1kJxX$V;y z8K&)LVHA-t!lgNuvJ23J0QN7Ss10OmEcPsjG}wr&7gzt$Tx8PKdVO7@Ub9|6KG>r+ z?3Fp%Z1&3xYD>1E1&s7v)B=;|-ABus&%KY<45cMPi}BsivRwzN(&?$_DpJNRY;wb?U_;IgJPi*%xIxK(k2j2H!FaQ7m diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_clipboard.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_clipboard.cpython-312.pyc deleted file mode 100644 index fc41f121a935fc6e040484f171bb513ebb3195d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmYjPy^9k;6o0du&DZT-Li7;QoQWc&$nHfEEkqEpP%sGETna-jJ0_d2U1r8y78K;L z5c~tq!a_^AKfv1B#-MPpTne$Wi{=VR<(oBg=Yx6kdtdY3?=hb(D+?$k^1d_H0DeeA z3EHtNuH&^2F1Ta>L((8bVr`%e^@bi}eUKO$4TAtR+{8;bSQR#sp;1ZxlvagAsYfiV z(}_U1etX~rJAR9~cZPuorHA*upy@qnj{N4NR%@?bh_3`{9naz&s(r|SAP8bnoqB3k z6~Mb^{AaA7%6|?brJ~P3q!m6`y~DM8ut!3;03zOxj9&zXY_}l?KGWJNB54#?HXoasG9=V%IJ^+!M4KwA%evhjQocgSda3B+GbQ z+&me>4#KD)1E(%I8C%EBNj$uc>IKZR8KZn;o_l@&(A=Dwn}=p~YF59R&MR`9hkWr( z>FvXBxzd+(X__njInIGu{0*96eNUT5YXt@82D+Af1E1V0UxSaCTbBMwOG|AM)N*Tu z)x>t&XVj*Q`7B;Yw4nmX*FKp)-dI#rG0DUmb!?Ync}w_=Gx-BzIv-$x5SWE(nZ7af q-KPV3lbuCV?wOZS&2>V^3@*)JYX(>6Nzn4YG>eoMxru_wfxWdZ- diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_deepreload.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_deepreload.cpython-312.pyc deleted file mode 100644 index f012ae766a84ade612c88ad4f528a8c8438a68a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3024 zcmb7GU2Gf07M}6`*=sva?2x3izTFl|>$KQ}I#Gmf(mJJ)C~5&I62bymu6NV;cdgk; zQkw)7gmiQ7t#nf^QYyiNDRQ>EAl?$MhTN9AF!E4p1=!Tx5X2z;nRdAMb(&mE~dI5eLuS36tD0UxS zcZ5MSk0`U?Z4O;`ECvxqRC-iDk162XYIA^N-H(v&(S;l0b;k>M^vrn*KG&)}>XPdn z(39EUb>|(yUOT-if6J@)_r2;qT`o!U0w3jhaZV_N+VQxOi^aS|yIkFzsH+$74gZb^ zBiqj;@YCVW+M{c$2d0tbIfLH8dT>t2@Ds|cXs>Hq=yRp^NFR4)z2ip6^~K-AA4K&C zj#1YO{f8^L_~^dk5#&S$8FahP+auvo{~1aTWwj$ZcPET?_uoQ={&ggSE|R`SPRzrZ z*W@SA0J89`2cy^E^kTG#FCV)oyoP4+E>Ajke{%WS@92kj*Vp8hKGs=3!7HCmWvQk+ z)vlX{#j9UyDJ(5p(KV}>uUeXMF;|*~(sd}oir2+dyjrvIY+ahBlTQyrfqRWg&eWmo z>j!eBtYv90oi6}6Jf~{Vs-RHKqBf#UkZD6bR~N@%ef`NiBND2mRCsPMA#N6rX@_SG zElYrt@)hH-N?769I0btsP9PKGb^i{VPq8hPvotpq>m(u=6IP&v)wnI1KsvTGOMv4D z)IT^Hv*lK3w&LV&t9dJ5v1qoEGi;ApwB>4z0yP4CW%HI{*&Qh!Uf!&nCd4GRP%N4d19-rk5e}ZjU%hg-vujDYqOA0du63T+6qxepAsxe`gj zitarNsmsqdyLy+RSE3)j_1PP1U8jD5sQR0oy;pJLRAcZ?XN>LAe?QW*)_Y_%68q$p zZzJ)QKzt<0LeA9u@wxP0a=gq3_Rx$xp*@}W?q+mXSQz##OS zg8*h%F9Q@iv=rjwS5v@RMWjbIqn{zGTJSTclZ`#zopF3F?r!OSit z@o-FOSFOd^fULx+s6?*m#%aV@fSJ}sRP+(YNt+Y}iaQ@&GHVtw&=iHyBA`hJG4!M8 z_s!n!Ey)upDNZs3znz_(nVtRK-#2srnwRHcpwzLi_XamI%zxsISsauOZi$m`^_7g(#sFW0~fo8?-7 z_YDaf7^P$*LjY?}GcOICW6twWGv`>pFYbFnQ8m@q6C=JOj}K{mv1n5`bh=3nsRQBQ zP?N{=5x(Eg>BXJFh$26sLVMTXF&d3_H_<3D~{vk~l`eUJ}?vz6$3f((l zoC{xYAgC(35Q%l4@w2+KZAeqpBadM<^B$-cs%Jt2p`JiArUjydk%6J^%!kv92oRC8 z@D%`87!8=hDE*vS%U)&n&CK)RReEYTFD?Bh!qiMzSD{?6jilgR0{<)MZP5|=Yx@fu+pTR*E;{B1iQ}!dlj`gLrvNVhpBXMz$EOzkY0_=f$VZav1q_t87YGWY=M7uD}WK^ zm+r!8cV)_5Ikq+JZX9W|?yogWS8YyJZNA=;uG*b;?|H6m0R}LOh=+uu#2bLh-4HLq z^jieNS&d@yc)!zZ$zEm7B$dh?Wu9k;c)t*DH@|9+??5md4n=!?0iq0$K%W)~2Yj)p zFB*$(RnCW0O^Is09w4sjBZ@XiqN*?GI~OET7(?>mHSuaBlCN>ErnTBgySEwc{U(7) z0rb=*+dFg*@C4D+b0Mvd6vI=4z@!vAZl-j|yd?lcfYk)d)dY}3vSg`(0r%thCIHLH zG9%?(Y8`D&OV!iTrj)cP*>G@5YEKI7DXE>5!;nREv4rX$;fb9tCWb+LkZ!c}3uY~Q z1^VO=8)z9(wbL&WL=qKkgYp9EK2iaV6N1iZJ){Jxx+B=F4Ff6wJ8Kqf27eBn5(kRZ2e&1aZc{%M!Eqt^t;B;giRF}}mM@2O^ji|VjO)#hp z2R;H|HA2ni6}`Ov#ivF(W(tZfof|#3I&mzK?T6{_g*cieu$l{|prxO>VdkB2O)#dD z!7@XL^zB)se?AyeK|?BpfY)%YPl@^l!2W?Wf!PPKijg5ILY;mGK^E5?V5Gp*=ng^$ z>YgWq;X$Pxhi9b*TmVj!?Rs&8fo$xCTG5(3pvAHZ5p5L8gjxr{z<1G$l^_>_=Y?a> z9eZW-wchF4rc`ayB=^4XzzW=s3e}F#)f@}z2sD{UQCIT>C`NQ=#%6$HWVixuYXUI* zJQ#jE0@hLlXuPz|FJsoMjnpb~nM?$ZAP8YmXPTb1OTtAk3yi z%qRF2ZL*LM`XyN3l9KhShOtN9lE-jst{tKzKEcF6&B#K6>(5`_v%hG0n=HzXH#4q0 zSbwKxts(au=J&`hq%DkazbeA}*w5g7Ip@grzFvMqt zKlMf+J8QBuBI*EyrBQz&d>M-I<<7%>lx&4tH4T*bFSb4Vq>6sYjoNWRQnV21hC zy#!7zkxF%k)CnqtTZc@RFJ8*y$H)H3LhFQC^0nI(uddbtzK1mCHP zeM&eS)5UW!5|$^RiC~DSJ9^NeSM{P$v^zW~D{?>`?CA-eS5y@zwpcyCCwN8)SnrRw z84e7_l@MPn_UP3BtTo%WX>T~z9Sp0jO^fFk#)YD`9bsk)*Ni!n1-_)qM@ed#j#fb(9{f# zL$c;8TU%ntvSDCuD>hSDHpX4{jCH(m^7;dB?V8y2?ZD*mRQ*G#wGZ8N{G{w1^{3~5 zbpFTdlE*)v+J7Ro>qN5PiMwEY%O-g~GseFcn`9G##dhWoXNj!5q0JJl$d+h??%e{B zgTOfC5Q4+VM|Rsn6>qQUSz8r>cVB1)w_@wR2bA${25g4(u>2fwB*X1W>Yenm6GZA znj^B;+;NUAVS}3#TWxX1Z8J7Kkn{9VOOAfhVl@frRfhNxY({``NN9k7IWkCK+=mV5 zDyZmEna;pEgGbG*4Zgshuu;h===?n#g>&VmsXceooT_b}Ecrpj_bc8P_AHO3E$x-K zd+h}yjItz_M%vPn;B2w?sy?=94u^%i(q-0;#jvPZadkp8XOoRQxAQ0iZJBjF&#vZL z$ifXV>+gT2>oNTGCF>bN&wZzj;||6kLkR9E?4xuK5>+wsgvL$itkTi}&aRE~sMY=m ziP-^ut=sDN5wg~8oL8M!HA1bo&WDvKWE&|*`d|cXM-HCWWaDDw->Cz;%&u2ZZna)# z&S5mv;k5Ky>0+~mVL)yy?u9fl2!yrdtSuk*-FkP(7ba4tVvlpx^R+j+x z5LufN*CoO|Z@YKEyi$xW~RP?}ykY@qtE}{hG0I-BE$bf(e9uiARxJP$eBXp6{c#+GK z*`Kx%pB@Vc1PKWa#qZCJ(Dav^&OA+1!+ zqIfKaTVN82F&S`S?D(< z(dK7?48R_u?#1mdq8VP6&0C@(fY_a2i3S(DYBPM{+?*P~a{{qJEr8+$0Jq!X9e0RX zo0R05XA0MW#|TE44_)4AS7pjod2RC>z2A+z9(nuOzYe_b%A6Fi;|z5_^?0{ItDVhr z?ULb_8YP#WGMO_Mu7^Q~9b}%B83y#1h4)-K%jPLr7D(o7IZoboLo`!iuOPTG8EOeKdAGO;Q6dzQaRQ6;Au50mvHz1(XAJohYA8PBybk@SHby#jG{u$ z;`2h|@Im&eiUtQA|4a_A#-=z?Ny8x&NTY^B@gN?Wi0@dP`Ie8Gfmf(803hEr>tFlA z)i2yAd#ie)I$g7Kx@LE(W_Qw6HB;uBXL$FXi|wQHCMItI_yk1jU6(Om{%={ z5lx99&%qqM-@J6qXMGL`N&Syb^$l)D%3Aqo^31)!o@q%vfQQTC$bf(rp*rGiB@N83&cBiu!RSU9sij zky&5;cipeMZ`8l#pYTr}NpEgV`}QThHM4aa$DdAaZ%fs;rRxqPy|o!Z9QRMwzq50y z^vFF(VII7DxfBYpW@<&g1eMk8GWEwZR+?Saic@dh>P=&jMQ%UpJG$+&gTCCx?3N<{ z4>Cn&dtqD1E*>Wszu4K^|M%M0D}=cWBa)Y(J8+`}7ea0QA*_`nKpB8TV&P!qv>a@W z_xv^l&v*d1xdTiJ$~`0pP}^qHd**w71#eaH=;jFX$|2OI<2%P2CdGHkrb-Wu7%Tgo zA?1gLbW)^{R}cq_u|d88ZND!>e7p=14~{oZmc3IyReCss2*_aJ?waAQeFgiYZqAs) zmOGN;+Yu)I#P5RK|AT960swn~rsp>6E&sXq&?h42K7w1HTtN2*0$+w>iN+IxQ3b(dE5ZFa@<#~1ir_MWD+rcQwIACM z{4@Nk7*SkcJ`~G7=6Lbp1)gz~&tVPr$Q|Xm+gP!K&2+>nd+(nK^MUb`sP#af$kSO*EK=%!j0gWF?^V^uYPKZp%l2j##H^ z3qJ{U<_U%*pi0RA1KIO7wlzeoNex8?!x%Xjp#Yw!r-#VGVMSi9Gd_jcXkKiD8DmE> zTLKQlprQ{BnVX>2-KV>c1$#r?$KVXVE*-&N0ci9DpI&l|vQlSE>xd0TW!mUx>3G}H z^tCIkihLVhw15jS;`2F95UW0LmChEFT#Apz$F|-meXDk&_9u@{`5#Xg98bEAe>yAG z&NHl7_49(t_gs~5B15dYrJ~34{PrEp+ur>=|09kCxQH)IRlk5IVXiQ@%l+WlKD~08 z3`0cLdHci-8h{sAdvKIxCM$HzkQS^9i_Y3t@c=YhrX?kNO7kMy1D5E5%Ve`mnvDh! zi#`pFD`gZs7x;}u>&O+Pjl#i)Y`O@T3MH4SZD6WAI0#RaSU?T+!k!SN;s~{927?{D zEoSWL7b9$?Mk@;WFE}-UG5>P@V*w{B23enuFgH%U_3Xs6H(P!-IJNbp$%_IR!nILv z4mGy!eqw0AI6ewG9Q`+P9e}Y5@rZFG!Pu`gqU+oXi9h^Xe8vCa`x*hjntxeYb1m|% zSh}()SS}NUaPoTarv3?1F5nG@OYahnr;@| z+<$X0y}3PA)}EF+epZ%}I+H>t#oi*sS+-*>OuQQ6vimUEGnS@h*vZgeKsaG(OUlZ> zi!jFzb1V0Qr|5YuDW5o$&=c5^cP)=p;3dlpExf!Pk2 zKgZ#3$5{9qGHn^x85j1}t9_8-79hI|zwn9;C{f~p73m(#`SuWcZps7M;b^Ar#d>#N zFd9|Ds_uY9<6t+O3?Gc*50`)eFxjZPaWn&+_-5kSaJ6l-5j_Hl|7&uUAg{TT=d(w0~c^^bv@e z%GXVoZ%&nOPM2@FJ~Z9jo@#DSHy=usAG#>b7L;8Y9vvQga{NrHX8YvsbV18+oG{&Q za8Afyh^@C&6y?|USGIBdyPVi2ITvYXlte0x=vJ-DRH(~ov28zM0F;B3OmgQs)SErD zoB5dxZqSg^Fmv3wSJj5XN-N}#kcV{PKuiXe57q36Y4k3-Z6c?aXrRXf-O$sv8S@V? zCLgiB87hEvSHUIksP|gml&fK6|BU3l)H2%g;=XCAJ|)$Uho+=$Nnu+`+D7FL#2QcM z__yfJKtPUlgF6b_N09;C95PO&A|`ZaOl`uQA>*VD$|sQ#AUX)9HgwluGz3TffSXY5 z5p-L~-yoR8r(7sTnUbK!HXNJRv0bwL;?Y1umDz%G!I`}#S?PwKJHk&IR6|u`Y(=UN zY(TIH!4?E)b?GT_dZd*eb0f#G?IZ%+^Cn+H(1)NO!M7272LZKg$g~8Jxx^Ac5NY`8 zt>mBJDPWpW{}%vwJS+ppSa#~x+Jp8ABr>wFh0vQ;1FGhA(&UH1v+U{A40--8PbR=|_z zd~>vIu9)G9;b0&87;P<{qt$tbz_u=UId=P}bBdF3m4IuUX@GIT7)FSxcw}rMk P=G{86&CkEv$O8O-69oC~ diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_editorhooks.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_editorhooks.cpython-312.pyc deleted file mode 100644 index 041ae8890d6edfc4e9673f8ec3c435ea6ca2c4a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1731 zcmZuxO>7%Q6rR~1d+m+$LjrB%kZgWRYKhotlU7ZLnnF>eA~mW+g%n@R)-$%(UVF{# z+D=@%3aC=!7Li;aIdFiALs2+z;*7X*z%E5G3zaHS4!N~Tq@tXdS$lB`%u4g#oA+kk z+xNZqehdWsfUZ&aWzymS_=5@V;@Zsq9A&lu0#Se<;&d2=l=3>4<)b`gXM!$d#i;1; zqVCChqh88;Zh@$@%7wh;p=;Q*6fI|3s;+Cfq=J!V8AM4LM#kJ@Zk9sO7P3Y>L#dp^ zR!qyUS}7yP#FnvR8*hi?5D(pH%wYdB2*7P|3nalEaa~N%=x#|>VA0doO1ppJ9#D!n z#D62~v^5Y|qN_}^cmK7JSOKo>SwO9QuE9>5NjrITPg^t{cu{5&@*uDK63vnGb!4l@ zy-^c)+VLYPa|!^Hdk1_3Ya;TUV6XVuUhT-TBXboFb)kR;J2$Le_r>%}F4v*ympi=6 zp>EeR5t9J*+=Ep<$D!UTUx6*}RiPqO_>PZNFb+-w6P7p#mT7h%_!zJ7%b)~9eM|p= zY=k=6kJ9Z^xCLrl`X89w005`}>I#0&xq;AxGoYQ77F@1Fk)Sz%YVa%g349lX#HA2t z3o1#PwkK0!wA@!xH7iW8RUo-oQPm5WFz~+yA>Q_=`8>`c!kpN?D{4}UUtzV#6N#P> z2Da^q)7r(zWHySjcKCiIWn^(AT`Xc0LAV&PXpQGHW+Yt1xne}uu18uWJRLrLCSqz9 zp31B7jGDw|c1PfZft~3J5 z+TvrXOKw}6u?O-*U6`oL6HmPU+m#P1yWZi3cX+$-(0kJEKVOp`_rJa_HT~V|AJit- zE;Z%u%~N+4>cU`c;rXl7?^71pp()dU`tIag3;YiY;w8x&^4Z>43>ooQj0{tiEfsQ_ z#j?@@#M`d%79?_83e&c5P;_!dShW&1pq!*0O7mF*6?A-o(1Ay%2+brLYfpIy;jduq WH{gE+PW%Z*9)aTDp)aN7FRgRVH-QCCGK>F@v*o7QsK^8%wV^Ui@uz~ah8%2@ejEjhcLWRLt zF*g!^#E`-Q!@hPeub3K!q7h($PG2at)HO+(rVP0~^a2T?a)UTI*4xXC_NFn|#rnpG zh9~l#IZrVlTQ!Y`CIS!>+2M`_J17H14f_bcjY1y7q`L0sp93ZQsr{&xms8NA-O5Xb z3s0_GR8R%<#MWJuH(huV4lzR;{;OXz^_xyEIap0klZJjD^d(4ayd~xYjdjDH5yLT! nF7h{?$sRJe&@ev6etvYLhMKd=mQkCB;i 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_lexers.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_lexers.cpython-312.pyc deleted file mode 100644 index 1da9973c3ff65fc2e38f57ab4cfc128e58a33be3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8854 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 YdNJcTf0gbE(yMU}`?Wy#aXN>&3} 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 TT2(u~omyKv=W_7vj9~u{-73g) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_pygments.cpython-312.pyc b/.venv/lib/python3.12/site-packages/IPython/lib/tests/__pycache__/test_pygments.cpython-312.pyc deleted file mode 100644 index ae09256e02b704406dccc335e45fa35a38b332f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1414 zcmZ8g&1)M+6n`_jT1kYG_@-J4&{za~i-?sf1s2DD1@uz!o^*5Eq)HK!}v7OAAzSt)MF&QCxG4X0#A(#tN}! zybveAqAbSZ6>SN=hBB?a#` z6ZulVH@qmM(0?ZM8u7-_ksL~n!4mgqprM>}qG3!&cWA|MV*BDA>d`VKs-|mT#h=S( z7V-7vy6{#k&7b_}V$Z9!TZ`?MXuE8gtuyYA4UK`89BQ+HYH;RV<*jm9j^q(MI04ve zAlU*BY4A0Mb%wg+4e9;L7vd1$T$4EC1SQT6k!XEK@5BRSFX7#P{m_kLXP9S}T-S7E zz~;jh2U)Nt+#Da_t^1Hsk~OIGGPyaQ%>@k zP>+jY`dp{yXJppU5Tq}vCOGaH9K<6mB%AQJ0n=~%V1I8v%FgX%=N@L?|2;AP&BwPF zZkN7V`Ykcv*XLg#6FPctkDbu{6kG4Gvd5ets)|?MKMpCYp^c-kg-~B7T@dsfd`^1A zq8n!xYplFxUaK*$hR`B0S62~8-Ya(6bp&*E)vUBR8pHZ?0eomLab}j=oMQpGm0!T3 zT(+WW5Hhc6@+2}pD`6S+zdt&kK!?M4#3YhU7#x7HZ2$F>JBgEhUD7=?gEiqBUawPc zRk`fNH*gpj(m(i0O*}4dQ~$U66T=DRaE!y^xdf2Q73GF}qRVOc>HOu3`NdE3OU32< z<@_hbm4);9OMbLcU&nue`I_*!YR=c2CBEh-Iwg+JJYL^mst?>Kt?UZ5QzumGFJq^g zZRe`XKHw(ik;^82LNd?@A%DP;r;vOCuRVdo&)~uiTo}Y4d;Dkj{`r39+&>!4(8q_; zn~S&3esOkJYJEr}J~Vb~=H|?RQgZ6sl_IsJ%ac1Wf_W%ZAp zen>tXP@TNBETz8gWC46#7|l5Q_{r!b$80R1?*a9aNt=k{fr diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test.wav b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test.wav deleted file mode 100644 index aa74fc5bd273a5ba80a7b677f1cf782e82f54613..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44144 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 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_backgroundjobs.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_backgroundjobs.py deleted file mode 100644 index fc76ff1..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_backgroundjobs.py +++ /dev/null @@ -1,85 +0,0 @@ -"""Tests for pylab tools module. -""" -#----------------------------------------------------------------------------- -# Copyright (c) 2011, the IPython Development Team. -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- - -# Stdlib imports -import time - -# Our own imports -from IPython.lib import backgroundjobs as bg - -#----------------------------------------------------------------------------- -# Globals and constants -#----------------------------------------------------------------------------- -t_short = 0.0001 # very short interval to wait on jobs - -#----------------------------------------------------------------------------- -# Local utilities -#----------------------------------------------------------------------------- -def sleeper(interval=t_short, *a, **kw): - args = dict(interval=interval, - other_args=a, - kw_args=kw) - time.sleep(interval) - return args - -def crasher(interval=t_short, *a, **kw): - time.sleep(interval) - raise Exception("Dead job with interval %s" % interval) - -#----------------------------------------------------------------------------- -# Classes and functions -#----------------------------------------------------------------------------- - -def test_result(): - """Test job submission and result retrieval""" - jobs = bg.BackgroundJobManager() - j = jobs.new(sleeper) - j.join() - assert j.result["interval"] == t_short - - -def test_flush(): - """Test job control""" - jobs = bg.BackgroundJobManager() - j = jobs.new(sleeper) - j.join() - assert len(jobs.completed) == 1 - assert len(jobs.dead) == 0 - jobs.flush() - assert len(jobs.completed) == 0 - - -def test_dead(): - """Test control of dead jobs""" - jobs = bg.BackgroundJobManager() - j = jobs.new(crasher) - j.join() - assert len(jobs.completed) == 0 - assert len(jobs.dead) == 1 - jobs.flush() - assert len(jobs.dead) == 0 - - -def test_longer(): - """Test control of longer-running jobs""" - jobs = bg.BackgroundJobManager() - # Sleep for long enough for the following two checks to still report the - # job as running, but not so long that it makes the test suite noticeably - # slower. - j = jobs.new(sleeper, 0.1) - assert len(jobs.running) == 1 - assert len(jobs.completed) == 0 - j.join() - assert len(jobs.running) == 0 - assert len(jobs.completed) == 1 diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_clipboard.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_clipboard.py deleted file mode 100644 index 6597c94..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_clipboard.py +++ /dev/null @@ -1,20 +0,0 @@ -from IPython.core.error import TryNext -from IPython.lib.clipboard import ClipboardEmpty -from IPython.testing.decorators import skip_if_no_x11 - - -@skip_if_no_x11 -def test_clipboard_get(): - # Smoketest for clipboard access - we can't easily guarantee that the - # clipboard is accessible and has something on it, but this tries to - # exercise the relevant code anyway. - try: - a = get_ipython().hooks.clipboard_get() - except ClipboardEmpty: - # Nothing in clipboard to get - pass - except TryNext: - # No clipboard access API available - pass - else: - assert isinstance(a, str) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_deepreload.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_deepreload.py deleted file mode 100644 index 5da606c..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_deepreload.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- -"""Test suite for the deepreload module.""" - -# Copyright (c) IPython Development Team. -# Distributed under the terms of the Modified BSD License. - -import types -from pathlib import Path - -import pytest -from tempfile import TemporaryDirectory - -from IPython.lib.deepreload import modules_reloading -from IPython.lib.deepreload import reload as dreload -from IPython.utils.syspathcontext import prepended_to_syspath - - -def test_deepreload(): - "Test that dreload does deep reloads and skips excluded modules." - with TemporaryDirectory() as tmpdir: - with prepended_to_syspath(tmpdir): - tmpdirpath = Path(tmpdir) - with open(tmpdirpath / "A.py", "w", encoding="utf-8") as f: - f.write("class Object:\n pass\nok = True\n") - with open(tmpdirpath / "B.py", "w", encoding="utf-8") as f: - f.write("import A\nassert A.ok, 'we are fine'\n") - import A - import B - - # Test that A is not reloaded. - obj = A.Object() - dreload(B, exclude=["A"]) - assert isinstance(obj, A.Object) is True - - # Test that an import failure will not blow-up us. - A.ok = False - with pytest.raises(AssertionError, match="we are fine"): - dreload(B, exclude=["A"]) - assert len(modules_reloading) == 0 - assert not A.ok - - # Test that A is reloaded. - obj = A.Object() - A.ok = False - dreload(B) - assert A.ok - assert isinstance(obj, A.Object) is False - - -def test_not_module(): - pytest.raises(TypeError, dreload, "modulename") - - -def test_not_in_sys_modules(): - fake_module = types.ModuleType("fake_module") - with pytest.raises(ImportError, match="not in sys.modules"): - dreload(fake_module) diff --git a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_display.py b/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_display.py deleted file mode 100644 index f5ed34c..0000000 --- a/.venv/lib/python3.12/site-packages/IPython/lib/tests/test_display.py +++ /dev/null @@ -1,272 +0,0 @@ -"""Tests for IPython.lib.display. - -""" -#----------------------------------------------------------------------------- -# Copyright (c) 2012, the IPython Development Team. -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Imports -#----------------------------------------------------------------------------- -from tempfile import NamedTemporaryFile, mkdtemp -from os.path import split, join as pjoin, dirname -import pathlib -from unittest import TestCase, mock -import struct -import wave -from io import BytesIO - -# Third-party imports -import pytest - -try: - import numpy -except ImportError: - pass - -# Our own imports -from IPython.lib import display - -from IPython.testing.decorators import skipif_not_numpy - -#----------------------------------------------------------------------------- -# Classes and functions -#----------------------------------------------------------------------------- - -#-------------------------- -# FileLink tests -#-------------------------- - -def test_instantiation_FileLink(): - """FileLink: Test class can be instantiated""" - fl = display.FileLink('example.txt') - # TODO: remove if when only Python >= 3.6 is supported - fl = display.FileLink(pathlib.PurePath('example.txt')) - -def test_warning_on_non_existent_path_FileLink(): - """FileLink: Calling _repr_html_ on non-existent files returns a warning""" - fl = display.FileLink("example.txt") - assert fl._repr_html_().startswith("Path (example.txt)") - - -def test_existing_path_FileLink(): - """FileLink: Calling _repr_html_ functions as expected on existing filepath - """ - tf = NamedTemporaryFile() - fl = display.FileLink(tf.name) - actual = fl._repr_html_() - expected = "%s
" % (tf.name, tf.name) - assert actual == expected - - -def test_existing_path_FileLink_repr(): - """FileLink: Calling repr() functions as expected on existing filepath - """ - tf = NamedTemporaryFile() - fl = display.FileLink(tf.name) - actual = repr(fl) - expected = tf.name - assert actual == expected - - -def test_error_on_directory_to_FileLink(): - """FileLink: Raises error when passed directory - """ - td = mkdtemp() - pytest.raises(ValueError, display.FileLink, td) - -#-------------------------- -# FileLinks tests -#-------------------------- - -def test_instantiation_FileLinks(): - """FileLinks: Test class can be instantiated - """ - fls = display.FileLinks('example') - -def test_warning_on_non_existent_path_FileLinks(): - """FileLinks: Calling _repr_html_ on non-existent files returns a warning""" - fls = display.FileLinks("example") - assert fls._repr_html_().startswith("Path (example)") - - -def test_existing_path_FileLinks(): - """FileLinks: Calling _repr_html_ functions as expected on existing dir - """ - td = mkdtemp() - tf1 = NamedTemporaryFile(dir=td) - tf2 = NamedTemporaryFile(dir=td) - fl = display.FileLinks(td) - actual = fl._repr_html_() - actual = actual.split('\n') - actual.sort() - # the links should always have forward slashes, even on windows, so replace - # backslashes with forward slashes here - expected = ["%s/
" % td, - "  %s
" %\ - (tf2.name.replace("\\","/"),split(tf2.name)[1]), - "  %s
" %\ - (tf1.name.replace("\\","/"),split(tf1.name)[1])] - expected.sort() - # We compare the sorted list of links here as that's more reliable - assert actual == expected - - -def test_existing_path_FileLinks_alt_formatter(): - """FileLinks: Calling _repr_html_ functions as expected w/ an alt formatter - """ - td = mkdtemp() - tf1 = NamedTemporaryFile(dir=td) - tf2 = NamedTemporaryFile(dir=td) - def fake_formatter(dirname,fnames,included_suffixes): - return ["hello","world"] - fl = display.FileLinks(td,notebook_display_formatter=fake_formatter) - actual = fl._repr_html_() - actual = actual.split('\n') - actual.sort() - expected = ["hello","world"] - expected.sort() - # We compare the sorted list of links here as that's more reliable - assert actual == expected - - -def test_existing_path_FileLinks_repr(): - """FileLinks: Calling repr() functions as expected on existing directory """ - td = mkdtemp() - tf1 = NamedTemporaryFile(dir=td) - tf2 = NamedTemporaryFile(dir=td) - fl = display.FileLinks(td) - actual = repr(fl) - actual = actual.split('\n') - actual.sort() - expected = ['%s/' % td, ' %s' % split(tf1.name)[1],' %s' % split(tf2.name)[1]] - expected.sort() - # We compare the sorted list of links here as that's more reliable - assert actual == expected - - -def test_existing_path_FileLinks_repr_alt_formatter(): - """FileLinks: Calling repr() functions as expected w/ alt formatter - """ - td = mkdtemp() - tf1 = NamedTemporaryFile(dir=td) - tf2 = NamedTemporaryFile(dir=td) - def fake_formatter(dirname,fnames,included_suffixes): - return ["hello","world"] - fl = display.FileLinks(td,terminal_display_formatter=fake_formatter) - actual = repr(fl) - actual = actual.split('\n') - actual.sort() - expected = ["hello","world"] - expected.sort() - # We compare the sorted list of links here as that's more reliable - assert actual == expected - - -def test_error_on_file_to_FileLinks(): - """FileLinks: Raises error when passed file - """ - td = mkdtemp() - tf1 = NamedTemporaryFile(dir=td) - pytest.raises(ValueError, display.FileLinks, tf1.name) - - -def test_recursive_FileLinks(): - """FileLinks: Does not recurse when recursive=False - """ - td = mkdtemp() - tf = NamedTemporaryFile(dir=td) - subtd = mkdtemp(dir=td) - subtf = NamedTemporaryFile(dir=subtd) - fl = display.FileLinks(td) - actual = str(fl) - actual = actual.split('\n') - assert len(actual) == 4, actual - fl = display.FileLinks(td, recursive=False) - actual = str(fl) - actual = actual.split('\n') - assert len(actual) == 2, actual - -def test_audio_from_file(): - path = pjoin(dirname(__file__), 'test.wav') - display.Audio(filename=path) - -class TestAudioDataWithNumpy(TestCase): - - @skipif_not_numpy - def test_audio_from_numpy_array(self): - test_tone = get_test_tone() - audio = display.Audio(test_tone, rate=44100) - assert len(read_wav(audio.data)) == len(test_tone) - - @skipif_not_numpy - def test_audio_from_list(self): - test_tone = get_test_tone() - audio = display.Audio(list(test_tone), rate=44100) - assert len(read_wav(audio.data)) == len(test_tone) - - @skipif_not_numpy - def test_audio_from_numpy_array_without_rate_raises(self): - self.assertRaises(ValueError, display.Audio, get_test_tone()) - - @skipif_not_numpy - def test_audio_data_normalization(self): - expected_max_value = numpy.iinfo(numpy.int16).max - for scale in [1, 0.5, 2]: - audio = display.Audio(get_test_tone(scale), rate=44100) - actual_max_value = numpy.max(numpy.abs(read_wav(audio.data))) - assert actual_max_value == expected_max_value - - @skipif_not_numpy - def test_audio_data_without_normalization(self): - max_int16 = numpy.iinfo(numpy.int16).max - for scale in [1, 0.5, 0.2]: - test_tone = get_test_tone(scale) - test_tone_max_abs = numpy.max(numpy.abs(test_tone)) - expected_max_value = int(max_int16 * test_tone_max_abs) - audio = display.Audio(test_tone, rate=44100, normalize=False) - actual_max_value = numpy.max(numpy.abs(read_wav(audio.data))) - assert actual_max_value == expected_max_value - - def test_audio_data_without_normalization_raises_for_invalid_data(self): - self.assertRaises( - ValueError, - lambda: display.Audio([1.001], rate=44100, normalize=False)) - self.assertRaises( - ValueError, - lambda: display.Audio([-1.001], rate=44100, normalize=False)) - -def simulate_numpy_not_installed(): - try: - import numpy - return mock.patch('numpy.array', mock.MagicMock(side_effect=ImportError)) - except ModuleNotFoundError: - return lambda x:x - -@simulate_numpy_not_installed() -class TestAudioDataWithoutNumpy(TestAudioDataWithNumpy): - # All tests from `TestAudioDataWithNumpy` are inherited. - - @skipif_not_numpy - def test_audio_raises_for_nested_list(self): - stereo_signal = [list(get_test_tone())] * 2 - self.assertRaises(TypeError, lambda: display.Audio(stereo_signal, rate=44100)) - - -@skipif_not_numpy -def get_test_tone(scale=1): - return numpy.sin(2 * numpy.pi * 440 * numpy.linspace(0, 1, 44100)) * scale - -def read_wav(data): - with wave.open(BytesIO(data)) as wave_file: - wave_data = wave_file.readframes(wave_file.getnframes()) - num_samples = wave_file.getnframes() * wave_file.getnchannels() - return struct.unpack('<%sh' % num_samples, wave_data) - -def test_code_from_file(): - c = display.Code(filename=__file__) - assert c._repr_html_().startswith(' - - -

%(title)s

- -''' - -DOC_HEADER_EXTERNALCSS = '''\ - - - - - %(title)s - - - - -

%(title)s

- -''' - -DOC_FOOTER = '''\ - - -''' - - -class HtmlFormatter(Formatter): - r""" - Format tokens as HTML 4 ```` tags. By default, the content is enclosed - in a ``
`` tag, itself wrapped in a ``
`` tag (but see the `nowrap` option). - The ``
``'s CSS class can be set by the `cssclass` option. - - If the `linenos` option is set to ``"table"``, the ``
`` is
-    additionally wrapped inside a ```` which has one row and two
-    cells: one containing the line numbers and one containing the code.
-    Example:
-
-    .. sourcecode:: html
-
-        
-
- - -
-
1
-            2
-
-
def foo(bar):
-              pass
-            
-
- - (whitespace added to improve clarity). - - A list of lines can be specified using the `hl_lines` option to make these - lines highlighted (as of Pygments 0.11). - - With the `full` option, a complete HTML 4 document is output, including - the style definitions inside a `` - {% else %} - {{ head | safe }} - {% endif %} -{% if not embed %} - - -{% endif %} -{{ body | safe }} -{% for diagram in diagrams %} -
-

{{ diagram.title }}

-
{{ diagram.text }}
-
- {{ diagram.svg }} -
-
-{% endfor %} -{% if not embed %} - - -{% endif %} -""" - -template = Template(jinja2_template_source) - -# Note: ideally this would be a dataclass, but we're supporting Python 3.5+ so we can't do this yet -NamedDiagram = NamedTuple( - "NamedDiagram", - [("name", str), ("diagram", typing.Optional[railroad.DiagramItem]), ("index", int)], -) -""" -A simple structure for associating a name with a railroad diagram -""" - -T = TypeVar("T") - - -class EachItem(railroad.Group): - """ - Custom railroad item to compose a: - - Group containing a - - OneOrMore containing a - - Choice of the elements in the Each - with the group label indicating that all must be matched - """ - - all_label = "[ALL]" - - def __init__(self, *items): - choice_item = railroad.Choice(len(items) - 1, *items) - one_or_more_item = railroad.OneOrMore(item=choice_item) - super().__init__(one_or_more_item, label=self.all_label) - - -class AnnotatedItem(railroad.Group): - """ - Simple subclass of Group that creates an annotation label - """ - - def __init__(self, label: str, item): - super().__init__(item=item, label="[{}]".format(label) if label else label) - - -class EditablePartial(Generic[T]): - """ - Acts like a functools.partial, but can be edited. In other words, it represents a type that hasn't yet been - constructed. - """ - - # We need this here because the railroad constructors actually transform the data, so can't be called until the - # entire tree is assembled - - def __init__(self, func: Callable[..., T], args: list, kwargs: dict): - self.func = func - self.args = args - self.kwargs = kwargs - - @classmethod - def from_call(cls, func: Callable[..., T], *args, **kwargs) -> "EditablePartial[T]": - """ - If you call this function in the same way that you would call the constructor, it will store the arguments - as you expect. For example EditablePartial.from_call(Fraction, 1, 3)() == Fraction(1, 3) - """ - return EditablePartial(func=func, args=list(args), kwargs=kwargs) - - @property - def name(self): - return self.kwargs["name"] - - def __call__(self) -> T: - """ - Evaluate the partial and return the result - """ - args = self.args.copy() - kwargs = self.kwargs.copy() - - # This is a helpful hack to allow you to specify varargs parameters (e.g. *args) as keyword args (e.g. - # args=['list', 'of', 'things']) - arg_spec = inspect.getfullargspec(self.func) - if arg_spec.varargs in self.kwargs: - args += kwargs.pop(arg_spec.varargs) - - return self.func(*args, **kwargs) - - -def railroad_to_html(diagrams: List[NamedDiagram], embed=False, **kwargs) -> str: - """ - Given a list of NamedDiagram, produce a single HTML string that visualises those diagrams - :params kwargs: kwargs to be passed in to the template - """ - data = [] - for diagram in diagrams: - if diagram.diagram is None: - continue - io = StringIO() - try: - css = kwargs.get('css') - diagram.diagram.writeStandalone(io.write, css=css) - except AttributeError: - diagram.diagram.writeSvg(io.write) - title = diagram.name - if diagram.index == 0: - title += " (root)" - data.append({"title": title, "text": "", "svg": io.getvalue()}) - - return template.render(diagrams=data, embed=embed, **kwargs) - - -def resolve_partial(partial: "EditablePartial[T]") -> T: - """ - Recursively resolves a collection of Partials into whatever type they are - """ - if isinstance(partial, EditablePartial): - partial.args = resolve_partial(partial.args) - partial.kwargs = resolve_partial(partial.kwargs) - return partial() - elif isinstance(partial, list): - return [resolve_partial(x) for x in partial] - elif isinstance(partial, dict): - return {key: resolve_partial(x) for key, x in partial.items()} - else: - return partial - - -def to_railroad( - element: pyparsing.ParserElement, - diagram_kwargs: typing.Optional[dict] = None, - vertical: int = 3, - show_results_names: bool = False, - show_groups: bool = False, -) -> List[NamedDiagram]: - """ - Convert a pyparsing element tree into a list of diagrams. This is the recommended entrypoint to diagram - creation if you want to access the Railroad tree before it is converted to HTML - :param element: base element of the parser being diagrammed - :param diagram_kwargs: kwargs to pass to the Diagram() constructor - :param vertical: (optional) - int - limit at which number of alternatives should be - shown vertically instead of horizontally - :param show_results_names - bool to indicate whether results name annotations should be - included in the diagram - :param show_groups - bool to indicate whether groups should be highlighted with an unlabeled - surrounding box - """ - # Convert the whole tree underneath the root - lookup = ConverterState(diagram_kwargs=diagram_kwargs or {}) - _to_diagram_element( - element, - lookup=lookup, - parent=None, - vertical=vertical, - show_results_names=show_results_names, - show_groups=show_groups, - ) - - root_id = id(element) - # Convert the root if it hasn't been already - if root_id in lookup: - if not element.customName: - lookup[root_id].name = "" - lookup[root_id].mark_for_extraction(root_id, lookup, force=True) - - # Now that we're finished, we can convert from intermediate structures into Railroad elements - diags = list(lookup.diagrams.values()) - if len(diags) > 1: - # collapse out duplicate diags with the same name - seen = set() - deduped_diags = [] - for d in diags: - # don't extract SkipTo elements, they are uninformative as subdiagrams - if d.name == "...": - continue - if d.name is not None and d.name not in seen: - seen.add(d.name) - deduped_diags.append(d) - resolved = [resolve_partial(partial) for partial in deduped_diags] - else: - # special case - if just one diagram, always display it, even if - # it has no name - resolved = [resolve_partial(partial) for partial in diags] - return sorted(resolved, key=lambda diag: diag.index) - - -def _should_vertical( - specification: int, exprs: Iterable[pyparsing.ParserElement] -) -> bool: - """ - Returns true if we should return a vertical list of elements - """ - if specification is None: - return False - else: - return len(_visible_exprs(exprs)) >= specification - - -class ElementState: - """ - State recorded for an individual pyparsing Element - """ - - # Note: this should be a dataclass, but we have to support Python 3.5 - def __init__( - self, - element: pyparsing.ParserElement, - converted: EditablePartial, - parent: EditablePartial, - number: int, - name: str = None, - parent_index: typing.Optional[int] = None, - ): - #: The pyparsing element that this represents - self.element: pyparsing.ParserElement = element - #: The name of the element - self.name: typing.Optional[str] = name - #: The output Railroad element in an unconverted state - self.converted: EditablePartial = converted - #: The parent Railroad element, which we store so that we can extract this if it's duplicated - self.parent: EditablePartial = parent - #: The order in which we found this element, used for sorting diagrams if this is extracted into a diagram - self.number: int = number - #: The index of this inside its parent - self.parent_index: typing.Optional[int] = parent_index - #: If true, we should extract this out into a subdiagram - self.extract: bool = False - #: If true, all of this element's children have been filled out - self.complete: bool = False - - def mark_for_extraction( - self, el_id: int, state: "ConverterState", name: str = None, force: bool = False - ): - """ - Called when this instance has been seen twice, and thus should eventually be extracted into a sub-diagram - :param el_id: id of the element - :param state: element/diagram state tracker - :param name: name to use for this element's text - :param force: If true, force extraction now, regardless of the state of this. Only useful for extracting the - root element when we know we're finished - """ - self.extract = True - - # Set the name - if not self.name: - if name: - # Allow forcing a custom name - self.name = name - elif self.element.customName: - self.name = self.element.customName - else: - self.name = "" - - # Just because this is marked for extraction doesn't mean we can do it yet. We may have to wait for children - # to be added - # Also, if this is just a string literal etc, don't bother extracting it - if force or (self.complete and _worth_extracting(self.element)): - state.extract_into_diagram(el_id) - - -class ConverterState: - """ - Stores some state that persists between recursions into the element tree - """ - - def __init__(self, diagram_kwargs: typing.Optional[dict] = None): - #: A dictionary mapping ParserElements to state relating to them - self._element_diagram_states: Dict[int, ElementState] = {} - #: A dictionary mapping ParserElement IDs to subdiagrams generated from them - self.diagrams: Dict[int, EditablePartial[NamedDiagram]] = {} - #: The index of the next unnamed element - self.unnamed_index: int = 1 - #: The index of the next element. This is used for sorting - self.index: int = 0 - #: Shared kwargs that are used to customize the construction of diagrams - self.diagram_kwargs: dict = diagram_kwargs or {} - self.extracted_diagram_names: Set[str] = set() - - def __setitem__(self, key: int, value: ElementState): - self._element_diagram_states[key] = value - - def __getitem__(self, key: int) -> ElementState: - return self._element_diagram_states[key] - - def __delitem__(self, key: int): - del self._element_diagram_states[key] - - def __contains__(self, key: int): - return key in self._element_diagram_states - - def generate_unnamed(self) -> int: - """ - Generate a number used in the name of an otherwise unnamed diagram - """ - self.unnamed_index += 1 - return self.unnamed_index - - def generate_index(self) -> int: - """ - Generate a number used to index a diagram - """ - self.index += 1 - return self.index - - def extract_into_diagram(self, el_id: int): - """ - Used when we encounter the same token twice in the same tree. When this - happens, we replace all instances of that token with a terminal, and - create a new subdiagram for the token - """ - position = self[el_id] - - # Replace the original definition of this element with a regular block - if position.parent: - ret = EditablePartial.from_call(railroad.NonTerminal, text=position.name) - if "item" in position.parent.kwargs: - position.parent.kwargs["item"] = ret - elif "items" in position.parent.kwargs: - position.parent.kwargs["items"][position.parent_index] = ret - - # If the element we're extracting is a group, skip to its content but keep the title - if position.converted.func == railroad.Group: - content = position.converted.kwargs["item"] - else: - content = position.converted - - self.diagrams[el_id] = EditablePartial.from_call( - NamedDiagram, - name=position.name, - diagram=EditablePartial.from_call( - railroad.Diagram, content, **self.diagram_kwargs - ), - index=position.number, - ) - - del self[el_id] - - -def _worth_extracting(element: pyparsing.ParserElement) -> bool: - """ - Returns true if this element is worth having its own sub-diagram. Simply, if any of its children - themselves have children, then its complex enough to extract - """ - children = element.recurse() - return any(child.recurse() for child in children) - - -def _apply_diagram_item_enhancements(fn): - """ - decorator to ensure enhancements to a diagram item (such as results name annotations) - get applied on return from _to_diagram_element (we do this since there are several - returns in _to_diagram_element) - """ - - def _inner( - element: pyparsing.ParserElement, - parent: typing.Optional[EditablePartial], - lookup: ConverterState = None, - vertical: int = None, - index: int = 0, - name_hint: str = None, - show_results_names: bool = False, - show_groups: bool = False, - ) -> typing.Optional[EditablePartial]: - ret = fn( - element, - parent, - lookup, - vertical, - index, - name_hint, - show_results_names, - show_groups, - ) - - # apply annotation for results name, if present - if show_results_names and ret is not None: - element_results_name = element.resultsName - if element_results_name: - # add "*" to indicate if this is a "list all results" name - element_results_name += "" if element.modalResults else "*" - ret = EditablePartial.from_call( - railroad.Group, item=ret, label=element_results_name - ) - - return ret - - return _inner - - -def _visible_exprs(exprs: Iterable[pyparsing.ParserElement]): - non_diagramming_exprs = ( - pyparsing.ParseElementEnhance, - pyparsing.PositionToken, - pyparsing.And._ErrorStop, - ) - return [ - e - for e in exprs - if not (e.customName or e.resultsName or isinstance(e, non_diagramming_exprs)) - ] - - -@_apply_diagram_item_enhancements -def _to_diagram_element( - element: pyparsing.ParserElement, - parent: typing.Optional[EditablePartial], - lookup: ConverterState = None, - vertical: int = None, - index: int = 0, - name_hint: str = None, - show_results_names: bool = False, - show_groups: bool = False, -) -> typing.Optional[EditablePartial]: - """ - Recursively converts a PyParsing Element to a railroad Element - :param lookup: The shared converter state that keeps track of useful things - :param index: The index of this element within the parent - :param parent: The parent of this element in the output tree - :param vertical: Controls at what point we make a list of elements vertical. If this is an integer (the default), - it sets the threshold of the number of items before we go vertical. If True, always go vertical, if False, never - do so - :param name_hint: If provided, this will override the generated name - :param show_results_names: bool flag indicating whether to add annotations for results names - :returns: The converted version of the input element, but as a Partial that hasn't yet been constructed - :param show_groups: bool flag indicating whether to show groups using bounding box - """ - exprs = element.recurse() - name = name_hint or element.customName or element.__class__.__name__ - - # Python's id() is used to provide a unique identifier for elements - el_id = id(element) - - element_results_name = element.resultsName - - # Here we basically bypass processing certain wrapper elements if they contribute nothing to the diagram - if not element.customName: - if isinstance( - element, - ( - # pyparsing.TokenConverter, - # pyparsing.Forward, - pyparsing.Located, - ), - ): - # However, if this element has a useful custom name, and its child does not, we can pass it on to the child - if exprs: - if not exprs[0].customName: - propagated_name = name - else: - propagated_name = None - - return _to_diagram_element( - element.expr, - parent=parent, - lookup=lookup, - vertical=vertical, - index=index, - name_hint=propagated_name, - show_results_names=show_results_names, - show_groups=show_groups, - ) - - # If the element isn't worth extracting, we always treat it as the first time we say it - if _worth_extracting(element): - if el_id in lookup: - # If we've seen this element exactly once before, we are only just now finding out that it's a duplicate, - # so we have to extract it into a new diagram. - looked_up = lookup[el_id] - looked_up.mark_for_extraction(el_id, lookup, name=name_hint) - ret = EditablePartial.from_call(railroad.NonTerminal, text=looked_up.name) - return ret - - elif el_id in lookup.diagrams: - # If we have seen the element at least twice before, and have already extracted it into a subdiagram, we - # just put in a marker element that refers to the sub-diagram - ret = EditablePartial.from_call( - railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] - ) - return ret - - # Recursively convert child elements - # Here we find the most relevant Railroad element for matching pyparsing Element - # We use ``items=[]`` here to hold the place for where the child elements will go once created - if isinstance(element, pyparsing.And): - # detect And's created with ``expr*N`` notation - for these use a OneOrMore with a repeat - # (all will have the same name, and resultsName) - if not exprs: - return None - if len(set((e.name, e.resultsName) for e in exprs)) == 1: - ret = EditablePartial.from_call( - railroad.OneOrMore, item="", repeat=str(len(exprs)) - ) - elif _should_vertical(vertical, exprs): - ret = EditablePartial.from_call(railroad.Stack, items=[]) - else: - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - elif isinstance(element, (pyparsing.Or, pyparsing.MatchFirst)): - if not exprs: - return None - if _should_vertical(vertical, exprs): - ret = EditablePartial.from_call(railroad.Choice, 0, items=[]) - else: - ret = EditablePartial.from_call(railroad.HorizontalChoice, items=[]) - elif isinstance(element, pyparsing.Each): - if not exprs: - return None - ret = EditablePartial.from_call(EachItem, items=[]) - elif isinstance(element, pyparsing.NotAny): - ret = EditablePartial.from_call(AnnotatedItem, label="NOT", item="") - elif isinstance(element, pyparsing.FollowedBy): - ret = EditablePartial.from_call(AnnotatedItem, label="LOOKAHEAD", item="") - elif isinstance(element, pyparsing.PrecededBy): - ret = EditablePartial.from_call(AnnotatedItem, label="LOOKBEHIND", item="") - elif isinstance(element, pyparsing.Group): - if show_groups: - ret = EditablePartial.from_call(AnnotatedItem, label="", item="") - else: - ret = EditablePartial.from_call(railroad.Group, label="", item="") - elif isinstance(element, pyparsing.TokenConverter): - label = type(element).__name__.lower() - if label == "tokenconverter": - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - else: - ret = EditablePartial.from_call(AnnotatedItem, label=label, item="") - elif isinstance(element, pyparsing.Opt): - ret = EditablePartial.from_call(railroad.Optional, item="") - elif isinstance(element, pyparsing.OneOrMore): - ret = EditablePartial.from_call(railroad.OneOrMore, item="") - elif isinstance(element, pyparsing.ZeroOrMore): - ret = EditablePartial.from_call(railroad.ZeroOrMore, item="") - elif isinstance(element, pyparsing.Group): - ret = EditablePartial.from_call( - railroad.Group, item=None, label=element_results_name - ) - elif isinstance(element, pyparsing.Empty) and not element.customName: - # Skip unnamed "Empty" elements - ret = None - elif isinstance(element, pyparsing.ParseElementEnhance): - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - elif len(exprs) > 0 and not element_results_name: - ret = EditablePartial.from_call(railroad.Group, item="", label=name) - elif len(exprs) > 0: - ret = EditablePartial.from_call(railroad.Sequence, items=[]) - else: - terminal = EditablePartial.from_call(railroad.Terminal, element.defaultName) - ret = terminal - - if ret is None: - return - - # Indicate this element's position in the tree so we can extract it if necessary - lookup[el_id] = ElementState( - element=element, - converted=ret, - parent=parent, - parent_index=index, - number=lookup.generate_index(), - ) - if element.customName: - lookup[el_id].mark_for_extraction(el_id, lookup, element.customName) - - i = 0 - for expr in exprs: - # Add a placeholder index in case we have to extract the child before we even add it to the parent - if "items" in ret.kwargs: - ret.kwargs["items"].insert(i, None) - - item = _to_diagram_element( - expr, - parent=ret, - lookup=lookup, - vertical=vertical, - index=i, - show_results_names=show_results_names, - show_groups=show_groups, - ) - - # Some elements don't need to be shown in the diagram - if item is not None: - if "item" in ret.kwargs: - ret.kwargs["item"] = item - elif "items" in ret.kwargs: - # If we've already extracted the child, don't touch this index, since it's occupied by a nonterminal - ret.kwargs["items"][i] = item - i += 1 - elif "items" in ret.kwargs: - # If we're supposed to skip this element, remove it from the parent - del ret.kwargs["items"][i] - - # If all this items children are none, skip this item - if ret and ( - ("items" in ret.kwargs and len(ret.kwargs["items"]) == 0) - or ("item" in ret.kwargs and ret.kwargs["item"] is None) - ): - ret = EditablePartial.from_call(railroad.Terminal, name) - - # Mark this element as "complete", ie it has all of its children - if el_id in lookup: - lookup[el_id].complete = True - - if el_id in lookup and lookup[el_id].extract and lookup[el_id].complete: - lookup.extract_into_diagram(el_id) - if ret is not None: - ret = EditablePartial.from_call( - railroad.NonTerminal, text=lookup.diagrams[el_id].kwargs["name"] - ) - - return ret diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 795bf962a3836f5fd83856fe8f8f1ac82d28e6fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26810 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 EFA+=eX8-^I diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py deleted file mode 100644 index 12219f1..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py +++ /dev/null @@ -1,299 +0,0 @@ -# exceptions.py - -import re -import sys -import typing - -from .util import ( - col, - line, - lineno, - _collapse_string_to_ranges, - replaced_by_pep8, -) -from .unicode import pyparsing_unicode as ppu - - -class ExceptionWordUnicode(ppu.Latin1, ppu.LatinA, ppu.LatinB, ppu.Greek, ppu.Cyrillic): - pass - - -_extract_alphanums = _collapse_string_to_ranges(ExceptionWordUnicode.alphanums) -_exception_word_extractor = re.compile("([" + _extract_alphanums + "]{1,16})|.") - - -class ParseBaseException(Exception): - """base exception class for all parsing runtime exceptions""" - - loc: int - msg: str - pstr: str - parser_element: typing.Any # "ParserElement" - args: typing.Tuple[str, int, typing.Optional[str]] - - __slots__ = ( - "loc", - "msg", - "pstr", - "parser_element", - "args", - ) - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( - self, - pstr: str, - loc: int = 0, - msg: typing.Optional[str] = None, - elem=None, - ): - self.loc = loc - if msg is None: - self.msg = pstr - self.pstr = "" - else: - self.msg = msg - self.pstr = pstr - self.parser_element = elem - self.args = (pstr, loc, msg) - - @staticmethod - def explain_exception(exc, depth=16): - """ - Method to take an exception and translate the Python internal traceback into a list - of the pyparsing expressions that caused the exception to be raised. - - Parameters: - - - exc - exception raised during parsing (need not be a ParseException, in support - of Python exceptions that might be raised in a parse action) - - depth (default=16) - number of levels back in the stack trace to list expression - and function names; if None, the full stack trace names will be listed; if 0, only - the failing input line, marker, and exception string will be shown - - Returns a multi-line string listing the ParserElements and/or function names in the - exception's stack trace. - """ - import inspect - from .core import ParserElement - - if depth is None: - depth = sys.getrecursionlimit() - ret = [] - if isinstance(exc, ParseBaseException): - ret.append(exc.line) - ret.append(" " * (exc.column - 1) + "^") - ret.append(f"{type(exc).__name__}: {exc}") - - if depth > 0: - callers = inspect.getinnerframes(exc.__traceback__, context=depth) - seen = set() - for i, ff in enumerate(callers[-depth:]): - frm = ff[0] - - f_self = frm.f_locals.get("self", None) - if isinstance(f_self, ParserElement): - if not frm.f_code.co_name.startswith( - ("parseImpl", "_parseNoCache") - ): - continue - if id(f_self) in seen: - continue - seen.add(id(f_self)) - - self_type = type(f_self) - ret.append( - f"{self_type.__module__}.{self_type.__name__} - {f_self}" - ) - - elif f_self is not None: - self_type = type(f_self) - ret.append(f"{self_type.__module__}.{self_type.__name__}") - - else: - code = frm.f_code - if code.co_name in ("wrapper", ""): - continue - - ret.append(code.co_name) - - depth -= 1 - if not depth: - break - - return "\n".join(ret) - - @classmethod - def _from_exception(cls, pe): - """ - internal factory method to simplify creating one type of ParseException - from another - avoids having __init__ signature conflicts among subclasses - """ - return cls(pe.pstr, pe.loc, pe.msg, pe.parser_element) - - @property - def line(self) -> str: - """ - Return the line of text where the exception occurred. - """ - return line(self.loc, self.pstr) - - @property - def lineno(self) -> int: - """ - Return the 1-based line number of text where the exception occurred. - """ - return lineno(self.loc, self.pstr) - - @property - def col(self) -> int: - """ - Return the 1-based column on the line of text where the exception occurred. - """ - return col(self.loc, self.pstr) - - @property - def column(self) -> int: - """ - Return the 1-based column on the line of text where the exception occurred. - """ - return col(self.loc, self.pstr) - - # pre-PEP8 compatibility - @property - def parserElement(self): - return self.parser_element - - @parserElement.setter - def parserElement(self, elem): - self.parser_element = elem - - def __str__(self) -> str: - if self.pstr: - if self.loc >= len(self.pstr): - foundstr = ", found end of text" - else: - # pull out next word at error location - found_match = _exception_word_extractor.match(self.pstr, self.loc) - if found_match is not None: - found = found_match.group(0) - else: - found = self.pstr[self.loc : self.loc + 1] - foundstr = (", found %r" % found).replace(r"\\", "\\") - else: - foundstr = "" - return f"{self.msg}{foundstr} (at char {self.loc}), (line:{self.lineno}, col:{self.column})" - - def __repr__(self): - return str(self) - - def mark_input_line( - self, marker_string: typing.Optional[str] = None, *, markerString: str = ">!<" - ) -> str: - """ - Extracts the exception line from the input string, and marks - the location of the exception with a special symbol. - """ - markerString = marker_string if marker_string is not None else markerString - line_str = self.line - line_column = self.column - 1 - if markerString: - line_str = "".join( - (line_str[:line_column], markerString, line_str[line_column:]) - ) - return line_str.strip() - - def explain(self, depth=16) -> str: - """ - Method to translate the Python internal traceback into a list - of the pyparsing expressions that caused the exception to be raised. - - Parameters: - - - depth (default=16) - number of levels back in the stack trace to list expression - and function names; if None, the full stack trace names will be listed; if 0, only - the failing input line, marker, and exception string will be shown - - Returns a multi-line string listing the ParserElements and/or function names in the - exception's stack trace. - - Example:: - - expr = pp.Word(pp.nums) * 3 - try: - expr.parse_string("123 456 A789") - except pp.ParseException as pe: - print(pe.explain(depth=0)) - - prints:: - - 123 456 A789 - ^ - ParseException: Expected W:(0-9), found 'A' (at char 8), (line:1, col:9) - - Note: the diagnostic output will include string representations of the expressions - that failed to parse. These representations will be more helpful if you use `set_name` to - give identifiable names to your expressions. Otherwise they will use the default string - forms, which may be cryptic to read. - - Note: pyparsing's default truncation of exception tracebacks may also truncate the - stack of expressions that are displayed in the ``explain`` output. To get the full listing - of parser expressions, you may have to set ``ParserElement.verbose_stacktrace = True`` - """ - return self.explain_exception(self, depth) - - # fmt: off - @replaced_by_pep8(mark_input_line) - def markInputline(self): ... - # fmt: on - - -class ParseException(ParseBaseException): - """ - Exception thrown when a parse expression doesn't match the input string - - Example:: - - try: - Word(nums).set_name("integer").parse_string("ABC") - except ParseException as pe: - print(pe) - print("column: {}".format(pe.column)) - - prints:: - - Expected integer (at char 0), (line:1, col:1) - column: 1 - - """ - - -class ParseFatalException(ParseBaseException): - """ - User-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately - """ - - -class ParseSyntaxException(ParseFatalException): - """ - Just like :class:`ParseFatalException`, but thrown internally - when an :class:`ErrorStop` ('-' operator) indicates - that parsing is to stop immediately because an unbacktrackable - syntax error has been found. - """ - - -class RecursiveGrammarException(Exception): - """ - Exception thrown by :class:`ParserElement.validate` if the - grammar could be left-recursive; parser may need to enable - left recursion using :class:`ParserElement.enable_left_recursion` - """ - - def __init__(self, parseElementList): - self.parseElementTrace = parseElementList - - def __str__(self) -> str: - return f"RecursiveGrammarException: {self.parseElementTrace}" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py deleted file mode 100644 index 018f0d6..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py +++ /dev/null @@ -1,1100 +0,0 @@ -# helpers.py -import html.entities -import re -import sys -import typing - -from . import __diag__ -from .core import * -from .util import ( - _bslash, - _flatten, - _escape_regex_range_chars, - replaced_by_pep8, -) - - -# -# global helpers -# -def counted_array( - expr: ParserElement, - int_expr: typing.Optional[ParserElement] = None, - *, - intExpr: typing.Optional[ParserElement] = None, -) -> ParserElement: - """Helper to define a counted list of expressions. - - This helper defines a pattern of the form:: - - integer expr expr expr... - - where the leading integer tells how many expr expressions follow. - The matched tokens returns the array of expr tokens as a list - the - leading count token is suppressed. - - If ``int_expr`` is specified, it should be a pyparsing expression - that produces an integer value. - - Example:: - - counted_array(Word(alphas)).parse_string('2 ab cd ef') # -> ['ab', 'cd'] - - # in this parser, the leading integer value is given in binary, - # '10' indicating that 2 values are in the array - binary_constant = Word('01').set_parse_action(lambda t: int(t[0], 2)) - counted_array(Word(alphas), int_expr=binary_constant).parse_string('10 ab cd ef') # -> ['ab', 'cd'] - - # if other fields must be parsed after the count but before the - # list items, give the fields results names and they will - # be preserved in the returned ParseResults: - count_with_metadata = integer + Word(alphas)("type") - typed_array = counted_array(Word(alphanums), int_expr=count_with_metadata)("items") - result = typed_array.parse_string("3 bool True True False") - print(result.dump()) - - # prints - # ['True', 'True', 'False'] - # - items: ['True', 'True', 'False'] - # - type: 'bool' - """ - intExpr = intExpr or int_expr - array_expr = Forward() - - def count_field_parse_action(s, l, t): - nonlocal array_expr - n = t[0] - array_expr <<= (expr * n) if n else Empty() - # clear list contents, but keep any named results - del t[:] - - if intExpr is None: - intExpr = Word(nums).set_parse_action(lambda t: int(t[0])) - else: - intExpr = intExpr.copy() - intExpr.set_name("arrayLen") - intExpr.add_parse_action(count_field_parse_action, call_during_try=True) - return (intExpr + array_expr).set_name("(len) " + str(expr) + "...") - - -def match_previous_literal(expr: ParserElement) -> ParserElement: - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = match_previous_literal(first) - match_expr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches a previous literal, will also match the leading - ``"1:1"`` in ``"1:10"``. If this is not desired, use - :class:`match_previous_expr`. Do *not* use with packrat parsing - enabled. - """ - rep = Forward() - - def copy_token_to_repeater(s, l, t): - if t: - if len(t) == 1: - rep << t[0] - else: - # flatten t tokens - tflat = _flatten(t.as_list()) - rep << And(Literal(tt) for tt in tflat) - else: - rep << Empty() - - expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) - rep.set_name("(prev) " + str(expr)) - return rep - - -def match_previous_expr(expr: ParserElement) -> ParserElement: - """Helper to define an expression that is indirectly defined from - the tokens matched in a previous expression, that is, it looks for - a 'repeat' of a previous expression. For example:: - - first = Word(nums) - second = match_previous_expr(first) - match_expr = first + ":" + second - - will match ``"1:1"``, but not ``"1:2"``. Because this - matches by expressions, will *not* match the leading ``"1:1"`` - in ``"1:10"``; the expressions are evaluated first, and then - compared, so ``"1"`` is compared with ``"10"``. Do *not* use - with packrat parsing enabled. - """ - rep = Forward() - e2 = expr.copy() - rep <<= e2 - - def copy_token_to_repeater(s, l, t): - matchTokens = _flatten(t.as_list()) - - def must_match_these_tokens(s, l, t): - theseTokens = _flatten(t.as_list()) - if theseTokens != matchTokens: - raise ParseException( - s, l, f"Expected {matchTokens}, found{theseTokens}" - ) - - rep.set_parse_action(must_match_these_tokens, callDuringTry=True) - - expr.add_parse_action(copy_token_to_repeater, callDuringTry=True) - rep.set_name("(prev) " + str(expr)) - return rep - - -def one_of( - strs: Union[typing.Iterable[str], str], - caseless: bool = False, - use_regex: bool = True, - as_keyword: bool = False, - *, - useRegex: bool = True, - asKeyword: bool = False, -) -> ParserElement: - """Helper to quickly define a set of alternative :class:`Literal` s, - and makes sure to do longest-first testing when there is a conflict, - regardless of the input order, but returns - a :class:`MatchFirst` for best performance. - - Parameters: - - - ``strs`` - a string of space-delimited literals, or a collection of - string literals - - ``caseless`` - treat all literals as caseless - (default= ``False``) - - ``use_regex`` - as an optimization, will - generate a :class:`Regex` object; otherwise, will generate - a :class:`MatchFirst` object (if ``caseless=True`` or ``as_keyword=True``, or if - creating a :class:`Regex` raises an exception) - (default= ``True``) - - ``as_keyword`` - enforce :class:`Keyword`-style matching on the - generated expressions - (default= ``False``) - - ``asKeyword`` and ``useRegex`` are retained for pre-PEP8 compatibility, - but will be removed in a future release - - Example:: - - comp_oper = one_of("< = > <= >= !=") - var = Word(alphas) - number = Word(nums) - term = var | number - comparison_expr = term + comp_oper + term - print(comparison_expr.search_string("B = 12 AA=23 B<=AA AA>12")) - - prints:: - - [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] - """ - asKeyword = asKeyword or as_keyword - useRegex = useRegex and use_regex - - if ( - isinstance(caseless, str_type) - and __diag__.warn_on_multiple_string_args_to_oneof - ): - warnings.warn( - "More than one string argument passed to one_of, pass" - " choices as a list or space-delimited string", - stacklevel=2, - ) - - if caseless: - isequal = lambda a, b: a.upper() == b.upper() - masks = lambda a, b: b.upper().startswith(a.upper()) - parseElementClass = CaselessKeyword if asKeyword else CaselessLiteral - else: - isequal = lambda a, b: a == b - masks = lambda a, b: b.startswith(a) - parseElementClass = Keyword if asKeyword else Literal - - symbols: List[str] = [] - if isinstance(strs, str_type): - strs = typing.cast(str, strs) - symbols = strs.split() - elif isinstance(strs, Iterable): - symbols = list(strs) - else: - raise TypeError("Invalid argument to one_of, expected string or iterable") - if not symbols: - return NoMatch() - - # reorder given symbols to take care to avoid masking longer choices with shorter ones - # (but only if the given symbols are not just single characters) - if any(len(sym) > 1 for sym in symbols): - i = 0 - while i < len(symbols) - 1: - cur = symbols[i] - for j, other in enumerate(symbols[i + 1 :]): - if isequal(other, cur): - del symbols[i + j + 1] - break - elif masks(cur, other): - del symbols[i + j + 1] - symbols.insert(i, other) - break - else: - i += 1 - - if useRegex: - re_flags: int = re.IGNORECASE if caseless else 0 - - try: - if all(len(sym) == 1 for sym in symbols): - # symbols are just single characters, create range regex pattern - patt = f"[{''.join(_escape_regex_range_chars(sym) for sym in symbols)}]" - else: - patt = "|".join(re.escape(sym) for sym in symbols) - - # wrap with \b word break markers if defining as keywords - if asKeyword: - patt = rf"\b(?:{patt})\b" - - ret = Regex(patt, flags=re_flags).set_name(" | ".join(symbols)) - - if caseless: - # add parse action to return symbols as specified, not in random - # casing as found in input string - symbol_map = {sym.lower(): sym for sym in symbols} - ret.add_parse_action(lambda s, l, t: symbol_map[t[0].lower()]) - - return ret - - except re.error: - warnings.warn( - "Exception creating Regex for one_of, building MatchFirst", stacklevel=2 - ) - - # last resort, just use MatchFirst - return MatchFirst(parseElementClass(sym) for sym in symbols).set_name( - " | ".join(symbols) - ) - - -def dict_of(key: ParserElement, value: ParserElement) -> ParserElement: - """Helper to easily and clearly define a dictionary by specifying - the respective patterns for the key and value. Takes care of - defining the :class:`Dict`, :class:`ZeroOrMore`, and - :class:`Group` tokens in the proper order. The key pattern - can include delimiting markers or punctuation, as long as they are - suppressed, thereby leaving the significant key text. The value - pattern can include named results, so that the :class:`Dict` results - can include named token fields. - - Example:: - - text = "shape: SQUARE posn: upper left color: light blue texture: burlap" - attr_expr = (label + Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join)) - print(attr_expr[1, ...].parse_string(text).dump()) - - attr_label = label - attr_value = Suppress(':') + OneOrMore(data_word, stop_on=label).set_parse_action(' '.join) - - # similar to Dict, but simpler call format - result = dict_of(attr_label, attr_value).parse_string(text) - print(result.dump()) - print(result['shape']) - print(result.shape) # object attribute access works too - print(result.as_dict()) - - prints:: - - [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] - - color: 'light blue' - - posn: 'upper left' - - shape: 'SQUARE' - - texture: 'burlap' - SQUARE - SQUARE - {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} - """ - return Dict(OneOrMore(Group(key + value))) - - -def original_text_for( - expr: ParserElement, as_string: bool = True, *, asString: bool = True -) -> ParserElement: - """Helper to return the original, untokenized text for a given - expression. Useful to restore the parsed fields of an HTML start - tag into the raw tag text itself, or to revert separate tokens with - intervening whitespace back to the original matching input text. By - default, returns a string containing the original parsed text. - - If the optional ``as_string`` argument is passed as - ``False``, then the return value is - a :class:`ParseResults` containing any results names that - were originally matched, and a single token containing the original - matched text from the input string. So if the expression passed to - :class:`original_text_for` contains expressions with defined - results names, you must set ``as_string`` to ``False`` if you - want to preserve those results name values. - - The ``asString`` pre-PEP8 argument is retained for compatibility, - but will be removed in a future release. - - Example:: - - src = "this is test bold text normal text " - for tag in ("b", "i"): - opener, closer = make_html_tags(tag) - patt = original_text_for(opener + ... + closer) - print(patt.search_string(src)[0]) - - prints:: - - [' bold text '] - ['text'] - """ - asString = asString and as_string - - locMarker = Empty().set_parse_action(lambda s, loc, t: loc) - endlocMarker = locMarker.copy() - endlocMarker.callPreparse = False - matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") - if asString: - extractText = lambda s, l, t: s[t._original_start : t._original_end] - else: - - def extractText(s, l, t): - t[:] = [s[t.pop("_original_start") : t.pop("_original_end")]] - - matchExpr.set_parse_action(extractText) - matchExpr.ignoreExprs = expr.ignoreExprs - matchExpr.suppress_warning(Diagnostics.warn_ungrouped_named_tokens_in_collection) - return matchExpr - - -def ungroup(expr: ParserElement) -> ParserElement: - """Helper to undo pyparsing's default grouping of And expressions, - even if all but one are non-empty. - """ - return TokenConverter(expr).add_parse_action(lambda t: t[0]) - - -def locatedExpr(expr: ParserElement) -> ParserElement: - """ - (DEPRECATED - future code should use the :class:`Located` class) - Helper to decorate a returned token with its starting and ending - locations in the input string. - - This helper adds the following results names: - - - ``locn_start`` - location where matched expression begins - - ``locn_end`` - location where matched expression ends - - ``value`` - the actual parsed results - - Be careful if the input text contains ```` characters, you - may want to call :class:`ParserElement.parse_with_tabs` - - Example:: - - wd = Word(alphas) - for match in locatedExpr(wd).search_string("ljsdf123lksdjjf123lkkjj1222"): - print(match) - - prints:: - - [[0, 'ljsdf', 5]] - [[8, 'lksdjjf', 15]] - [[18, 'lkkjj', 23]] - """ - locator = Empty().set_parse_action(lambda ss, ll, tt: ll) - return Group( - locator("locn_start") - + expr("value") - + locator.copy().leaveWhitespace()("locn_end") - ) - - -def nested_expr( - opener: Union[str, ParserElement] = "(", - closer: Union[str, ParserElement] = ")", - content: typing.Optional[ParserElement] = None, - ignore_expr: ParserElement = quoted_string(), - *, - ignoreExpr: ParserElement = quoted_string(), -) -> ParserElement: - """Helper method for defining nested lists enclosed in opening and - closing delimiters (``"("`` and ``")"`` are the default). - - Parameters: - - - ``opener`` - opening character for a nested list - (default= ``"("``); can also be a pyparsing expression - - ``closer`` - closing character for a nested list - (default= ``")"``); can also be a pyparsing expression - - ``content`` - expression for items within the nested lists - (default= ``None``) - - ``ignore_expr`` - expression for ignoring opening and closing delimiters - (default= :class:`quoted_string`) - - ``ignoreExpr`` - this pre-PEP8 argument is retained for compatibility - but will be removed in a future release - - If an expression is not provided for the content argument, the - nested expression will capture all whitespace-delimited content - between delimiters as a list of separate values. - - Use the ``ignore_expr`` argument to define expressions that may - contain opening or closing characters that should not be treated as - opening or closing characters for nesting, such as quoted_string or - a comment expression. Specify multiple expressions using an - :class:`Or` or :class:`MatchFirst`. The default is - :class:`quoted_string`, but if no expressions are to be ignored, then - pass ``None`` for this argument. - - Example:: - - data_type = one_of("void int short long char float double") - decl_data_type = Combine(data_type + Opt(Word('*'))) - ident = Word(alphas+'_', alphanums+'_') - number = pyparsing_common.number - arg = Group(decl_data_type + ident) - LPAR, RPAR = map(Suppress, "()") - - code_body = nested_expr('{', '}', ignore_expr=(quoted_string | c_style_comment)) - - c_function = (decl_data_type("type") - + ident("name") - + LPAR + Opt(DelimitedList(arg), [])("args") + RPAR - + code_body("body")) - c_function.ignore(c_style_comment) - - source_code = ''' - int is_odd(int x) { - return (x%2); - } - - int dec_to_hex(char hchar) { - if (hchar >= '0' && hchar <= '9') { - return (ord(hchar)-ord('0')); - } else { - return (10+ord(hchar)-ord('A')); - } - } - ''' - for func in c_function.search_string(source_code): - print("%(name)s (%(type)s) args: %(args)s" % func) - - - prints:: - - is_odd (int) args: [['int', 'x']] - dec_to_hex (int) args: [['char', 'hchar']] - """ - if ignoreExpr != ignore_expr: - ignoreExpr = ignore_expr if ignoreExpr == quoted_string() else ignoreExpr - if opener == closer: - raise ValueError("opening and closing strings cannot be the same") - if content is None: - if isinstance(opener, str_type) and isinstance(closer, str_type): - opener = typing.cast(str, opener) - closer = typing.cast(str, closer) - if len(opener) == 1 and len(closer) == 1: - if ignoreExpr is not None: - content = Combine( - OneOrMore( - ~ignoreExpr - + CharsNotIn( - opener + closer + ParserElement.DEFAULT_WHITE_CHARS, - exact=1, - ) - ) - ).set_parse_action(lambda t: t[0].strip()) - else: - content = empty.copy() + CharsNotIn( - opener + closer + ParserElement.DEFAULT_WHITE_CHARS - ).set_parse_action(lambda t: t[0].strip()) - else: - if ignoreExpr is not None: - content = Combine( - OneOrMore( - ~ignoreExpr - + ~Literal(opener) - + ~Literal(closer) - + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) - ) - ).set_parse_action(lambda t: t[0].strip()) - else: - content = Combine( - OneOrMore( - ~Literal(opener) - + ~Literal(closer) - + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS, exact=1) - ) - ).set_parse_action(lambda t: t[0].strip()) - else: - raise ValueError( - "opening and closing arguments must be strings if no content expression is given" - ) - ret = Forward() - if ignoreExpr is not None: - ret <<= Group( - Suppress(opener) + ZeroOrMore(ignoreExpr | ret | content) + Suppress(closer) - ) - else: - ret <<= Group(Suppress(opener) + ZeroOrMore(ret | content) + Suppress(closer)) - ret.set_name("nested %s%s expression" % (opener, closer)) - return ret - - -def _makeTags(tagStr, xml, suppress_LT=Suppress("<"), suppress_GT=Suppress(">")): - """Internal helper to construct opening and closing tag expressions, given a tag name""" - if isinstance(tagStr, str_type): - resname = tagStr - tagStr = Keyword(tagStr, caseless=not xml) - else: - resname = tagStr.name - - tagAttrName = Word(alphas, alphanums + "_-:") - if xml: - tagAttrValue = dbl_quoted_string.copy().set_parse_action(remove_quotes) - openTag = ( - suppress_LT - + tagStr("tag") - + Dict(ZeroOrMore(Group(tagAttrName + Suppress("=") + tagAttrValue))) - + Opt("/", default=[False])("empty").set_parse_action( - lambda s, l, t: t[0] == "/" - ) - + suppress_GT - ) - else: - tagAttrValue = quoted_string.copy().set_parse_action(remove_quotes) | Word( - printables, exclude_chars=">" - ) - openTag = ( - suppress_LT - + tagStr("tag") - + Dict( - ZeroOrMore( - Group( - tagAttrName.set_parse_action(lambda t: t[0].lower()) - + Opt(Suppress("=") + tagAttrValue) - ) - ) - ) - + Opt("/", default=[False])("empty").set_parse_action( - lambda s, l, t: t[0] == "/" - ) - + suppress_GT - ) - closeTag = Combine(Literal("", adjacent=False) - - openTag.set_name("<%s>" % resname) - # add start results name in parse action now that ungrouped names are not reported at two levels - openTag.add_parse_action( - lambda t: t.__setitem__( - "start" + "".join(resname.replace(":", " ").title().split()), t.copy() - ) - ) - closeTag = closeTag( - "end" + "".join(resname.replace(":", " ").title().split()) - ).set_name("" % resname) - openTag.tag = resname - closeTag.tag = resname - openTag.tag_body = SkipTo(closeTag()) - return openTag, closeTag - - -def make_html_tags( - tag_str: Union[str, ParserElement] -) -> Tuple[ParserElement, ParserElement]: - """Helper to construct opening and closing tag expressions for HTML, - given a tag name. Matches tags in either upper or lower case, - attributes with namespaces and with quoted or unquoted values. - - Example:: - - text = 'More info at the pyparsing wiki page' - # make_html_tags returns pyparsing expressions for the opening and - # closing tags as a 2-tuple - a, a_end = make_html_tags("A") - link_expr = a + SkipTo(a_end)("link_text") + a_end - - for link in link_expr.search_string(text): - # attributes in the tag (like "href" shown here) are - # also accessible as named results - print(link.link_text, '->', link.href) - - prints:: - - pyparsing -> https://github.com/pyparsing/pyparsing/wiki - """ - return _makeTags(tag_str, False) - - -def make_xml_tags( - tag_str: Union[str, ParserElement] -) -> Tuple[ParserElement, ParserElement]: - """Helper to construct opening and closing tag expressions for XML, - given a tag name. Matches tags only in the given upper/lower case. - - Example: similar to :class:`make_html_tags` - """ - return _makeTags(tag_str, True) - - -any_open_tag: ParserElement -any_close_tag: ParserElement -any_open_tag, any_close_tag = make_html_tags( - Word(alphas, alphanums + "_:").set_name("any tag") -) - -_htmlEntityMap = {k.rstrip(";"): v for k, v in html.entities.html5.items()} -common_html_entity = Regex("&(?P" + "|".join(_htmlEntityMap) + ");").set_name( - "common HTML entity" -) - - -def replace_html_entity(s, l, t): - """Helper parser action to replace common HTML entities with their special characters""" - return _htmlEntityMap.get(t.entity) - - -class OpAssoc(Enum): - """Enumeration of operator associativity - - used in constructing InfixNotationOperatorSpec for :class:`infix_notation`""" - - LEFT = 1 - RIGHT = 2 - - -InfixNotationOperatorArgType = Union[ - ParserElement, str, Tuple[Union[ParserElement, str], Union[ParserElement, str]] -] -InfixNotationOperatorSpec = Union[ - Tuple[ - InfixNotationOperatorArgType, - int, - OpAssoc, - typing.Optional[ParseAction], - ], - Tuple[ - InfixNotationOperatorArgType, - int, - OpAssoc, - ], -] - - -def infix_notation( - base_expr: ParserElement, - op_list: List[InfixNotationOperatorSpec], - lpar: Union[str, ParserElement] = Suppress("("), - rpar: Union[str, ParserElement] = Suppress(")"), -) -> ParserElement: - """Helper method for constructing grammars of expressions made up of - operators working in a precedence hierarchy. Operators may be unary - or binary, left- or right-associative. Parse actions can also be - attached to operator expressions. The generated parser will also - recognize the use of parentheses to override operator precedences - (see example below). - - Note: if you define a deep operator list, you may see performance - issues when using infix_notation. See - :class:`ParserElement.enable_packrat` for a mechanism to potentially - improve your parser performance. - - Parameters: - - - ``base_expr`` - expression representing the most basic operand to - be used in the expression - - ``op_list`` - list of tuples, one for each operator precedence level - in the expression grammar; each tuple is of the form ``(op_expr, - num_operands, right_left_assoc, (optional)parse_action)``, where: - - - ``op_expr`` is the pyparsing expression for the operator; may also - be a string, which will be converted to a Literal; if ``num_operands`` - is 3, ``op_expr`` is a tuple of two expressions, for the two - operators separating the 3 terms - - ``num_operands`` is the number of terms for this operator (must be 1, - 2, or 3) - - ``right_left_assoc`` is the indicator whether the operator is right - or left associative, using the pyparsing-defined constants - ``OpAssoc.RIGHT`` and ``OpAssoc.LEFT``. - - ``parse_action`` is the parse action to be associated with - expressions matching this operator expression (the parse action - tuple member may be omitted); if the parse action is passed - a tuple or list of functions, this is equivalent to calling - ``set_parse_action(*fn)`` - (:class:`ParserElement.set_parse_action`) - - ``lpar`` - expression for matching left-parentheses; if passed as a - str, then will be parsed as ``Suppress(lpar)``. If lpar is passed as - an expression (such as ``Literal('(')``), then it will be kept in - the parsed results, and grouped with them. (default= ``Suppress('(')``) - - ``rpar`` - expression for matching right-parentheses; if passed as a - str, then will be parsed as ``Suppress(rpar)``. If rpar is passed as - an expression (such as ``Literal(')')``), then it will be kept in - the parsed results, and grouped with them. (default= ``Suppress(')')``) - - Example:: - - # simple example of four-function arithmetic with ints and - # variable names - integer = pyparsing_common.signed_integer - varname = pyparsing_common.identifier - - arith_expr = infix_notation(integer | varname, - [ - ('-', 1, OpAssoc.RIGHT), - (one_of('* /'), 2, OpAssoc.LEFT), - (one_of('+ -'), 2, OpAssoc.LEFT), - ]) - - arith_expr.run_tests(''' - 5+3*6 - (5+3)*6 - -2--11 - ''', full_dump=False) - - prints:: - - 5+3*6 - [[5, '+', [3, '*', 6]]] - - (5+3)*6 - [[[5, '+', 3], '*', 6]] - - (5+x)*y - [[[5, '+', 'x'], '*', 'y']] - - -2--11 - [[['-', 2], '-', ['-', 11]]] - """ - - # captive version of FollowedBy that does not do parse actions or capture results names - class _FB(FollowedBy): - def parseImpl(self, instring, loc, doActions=True): - self.expr.try_parse(instring, loc) - return loc, [] - - _FB.__name__ = "FollowedBy>" - - ret = Forward() - if isinstance(lpar, str): - lpar = Suppress(lpar) - if isinstance(rpar, str): - rpar = Suppress(rpar) - - # if lpar and rpar are not suppressed, wrap in group - if not (isinstance(rpar, Suppress) and isinstance(rpar, Suppress)): - lastExpr = base_expr | Group(lpar + ret + rpar) - else: - lastExpr = base_expr | (lpar + ret + rpar) - - arity: int - rightLeftAssoc: opAssoc - pa: typing.Optional[ParseAction] - opExpr1: ParserElement - opExpr2: ParserElement - for i, operDef in enumerate(op_list): - opExpr, arity, rightLeftAssoc, pa = (operDef + (None,))[:4] # type: ignore[assignment] - if isinstance(opExpr, str_type): - opExpr = ParserElement._literalStringClass(opExpr) - opExpr = typing.cast(ParserElement, opExpr) - if arity == 3: - if not isinstance(opExpr, (tuple, list)) or len(opExpr) != 2: - raise ValueError( - "if numterms=3, opExpr must be a tuple or list of two expressions" - ) - opExpr1, opExpr2 = opExpr - term_name = f"{opExpr1}{opExpr2} term" - else: - term_name = f"{opExpr} term" - - if not 1 <= arity <= 3: - raise ValueError("operator must be unary (1), binary (2), or ternary (3)") - - if rightLeftAssoc not in (OpAssoc.LEFT, OpAssoc.RIGHT): - raise ValueError("operator must indicate right or left associativity") - - thisExpr: ParserElement = Forward().set_name(term_name) - thisExpr = typing.cast(Forward, thisExpr) - if rightLeftAssoc is OpAssoc.LEFT: - if arity == 1: - matchExpr = _FB(lastExpr + opExpr) + Group(lastExpr + opExpr[1, ...]) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( - lastExpr + (opExpr + lastExpr)[1, ...] - ) - else: - matchExpr = _FB(lastExpr + lastExpr) + Group(lastExpr[2, ...]) - elif arity == 3: - matchExpr = _FB( - lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr - ) + Group(lastExpr + OneOrMore(opExpr1 + lastExpr + opExpr2 + lastExpr)) - elif rightLeftAssoc is OpAssoc.RIGHT: - if arity == 1: - # try to avoid LR with this extra test - if not isinstance(opExpr, Opt): - opExpr = Opt(opExpr) - matchExpr = _FB(opExpr.expr + thisExpr) + Group(opExpr + thisExpr) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( - lastExpr + (opExpr + thisExpr)[1, ...] - ) - else: - matchExpr = _FB(lastExpr + thisExpr) + Group( - lastExpr + thisExpr[1, ...] - ) - elif arity == 3: - matchExpr = _FB( - lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr - ) + Group(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) - if pa: - if isinstance(pa, (tuple, list)): - matchExpr.set_parse_action(*pa) - else: - matchExpr.set_parse_action(pa) - thisExpr <<= (matchExpr | lastExpr).setName(term_name) - lastExpr = thisExpr - ret <<= lastExpr - return ret - - -def indentedBlock(blockStatementExpr, indentStack, indent=True, backup_stacks=[]): - """ - (DEPRECATED - use :class:`IndentedBlock` class instead) - Helper method for defining space-delimited indentation blocks, - such as those used to define block statements in Python source code. - - Parameters: - - - ``blockStatementExpr`` - expression defining syntax of statement that - is repeated within the indented block - - ``indentStack`` - list created by caller to manage indentation stack - (multiple ``statementWithIndentedBlock`` expressions within a single - grammar should share a common ``indentStack``) - - ``indent`` - boolean indicating whether block must be indented beyond - the current level; set to ``False`` for block of left-most statements - (default= ``True``) - - A valid block must contain at least one ``blockStatement``. - - (Note that indentedBlock uses internal parse actions which make it - incompatible with packrat parsing.) - - Example:: - - data = ''' - def A(z): - A1 - B = 100 - G = A2 - A2 - A3 - B - def BB(a,b,c): - BB1 - def BBA(): - bba1 - bba2 - bba3 - C - D - def spam(x,y): - def eggs(z): - pass - ''' - - - indentStack = [1] - stmt = Forward() - - identifier = Word(alphas, alphanums) - funcDecl = ("def" + identifier + Group("(" + Opt(delimitedList(identifier)) + ")") + ":") - func_body = indentedBlock(stmt, indentStack) - funcDef = Group(funcDecl + func_body) - - rvalue = Forward() - funcCall = Group(identifier + "(" + Opt(delimitedList(rvalue)) + ")") - rvalue << (funcCall | identifier | Word(nums)) - assignment = Group(identifier + "=" + rvalue) - stmt << (funcDef | assignment | identifier) - - module_body = stmt[1, ...] - - parseTree = module_body.parseString(data) - parseTree.pprint() - - prints:: - - [['def', - 'A', - ['(', 'z', ')'], - ':', - [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], - 'B', - ['def', - 'BB', - ['(', 'a', 'b', 'c', ')'], - ':', - [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], - 'C', - 'D', - ['def', - 'spam', - ['(', 'x', 'y', ')'], - ':', - [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] - """ - backup_stacks.append(indentStack[:]) - - def reset_stack(): - indentStack[:] = backup_stacks[-1] - - def checkPeerIndent(s, l, t): - if l >= len(s): - return - curCol = col(l, s) - if curCol != indentStack[-1]: - if curCol > indentStack[-1]: - raise ParseException(s, l, "illegal nesting") - raise ParseException(s, l, "not a peer entry") - - def checkSubIndent(s, l, t): - curCol = col(l, s) - if curCol > indentStack[-1]: - indentStack.append(curCol) - else: - raise ParseException(s, l, "not a subentry") - - def checkUnindent(s, l, t): - if l >= len(s): - return - curCol = col(l, s) - if not (indentStack and curCol in indentStack): - raise ParseException(s, l, "not an unindent") - if curCol < indentStack[-1]: - indentStack.pop() - - NL = OneOrMore(LineEnd().set_whitespace_chars("\t ").suppress()) - INDENT = (Empty() + Empty().set_parse_action(checkSubIndent)).set_name("INDENT") - PEER = Empty().set_parse_action(checkPeerIndent).set_name("") - UNDENT = Empty().set_parse_action(checkUnindent).set_name("UNINDENT") - if indent: - smExpr = Group( - Opt(NL) - + INDENT - + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) - + UNDENT - ) - else: - smExpr = Group( - Opt(NL) - + OneOrMore(PEER + Group(blockStatementExpr) + Opt(NL)) - + Opt(UNDENT) - ) - - # add a parse action to remove backup_stack from list of backups - smExpr.add_parse_action( - lambda: backup_stacks.pop(-1) and None if backup_stacks else None - ) - smExpr.set_fail_action(lambda a, b, c, d: reset_stack()) - blockStatementExpr.ignore(_bslash + LineEnd()) - return smExpr.set_name("indented block") - - -# it's easy to get these comment structures wrong - they're very common, so may as well make them available -c_style_comment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/").set_name( - "C style comment" -) -"Comment of the form ``/* ... */``" - -html_comment = Regex(r"").set_name("HTML comment") -"Comment of the form ````" - -rest_of_line = Regex(r".*").leave_whitespace().set_name("rest of line") -dbl_slash_comment = Regex(r"//(?:\\\n|[^\n])*").set_name("// comment") -"Comment of the form ``// ... (to end of line)``" - -cpp_style_comment = Combine( - Regex(r"/\*(?:[^*]|\*(?!/))*") + "*/" | dbl_slash_comment -).set_name("C++ style comment") -"Comment of either form :class:`c_style_comment` or :class:`dbl_slash_comment`" - -java_style_comment = cpp_style_comment -"Same as :class:`cpp_style_comment`" - -python_style_comment = Regex(r"#.*").set_name("Python style comment") -"Comment of the form ``# ... (to end of line)``" - - -# build list of built-in expressions, for future reference if a global default value -# gets updated -_builtin_exprs: List[ParserElement] = [ - v for v in vars().values() if isinstance(v, ParserElement) -] - - -# compatibility function, superseded by DelimitedList class -def delimited_list( - expr: Union[str, ParserElement], - delim: Union[str, ParserElement] = ",", - combine: bool = False, - min: typing.Optional[int] = None, - max: typing.Optional[int] = None, - *, - allow_trailing_delim: bool = False, -) -> ParserElement: - """(DEPRECATED - use :class:`DelimitedList` class)""" - return DelimitedList( - expr, delim, combine, min, max, allow_trailing_delim=allow_trailing_delim - ) - - -# pre-PEP8 compatible names -# fmt: off -opAssoc = OpAssoc -anyOpenTag = any_open_tag -anyCloseTag = any_close_tag -commonHTMLEntity = common_html_entity -cStyleComment = c_style_comment -htmlComment = html_comment -restOfLine = rest_of_line -dblSlashComment = dbl_slash_comment -cppStyleComment = cpp_style_comment -javaStyleComment = java_style_comment -pythonStyleComment = python_style_comment - -@replaced_by_pep8(DelimitedList) -def delimitedList(): ... - -@replaced_by_pep8(DelimitedList) -def delimited_list(): ... - -@replaced_by_pep8(counted_array) -def countedArray(): ... - -@replaced_by_pep8(match_previous_literal) -def matchPreviousLiteral(): ... - -@replaced_by_pep8(match_previous_expr) -def matchPreviousExpr(): ... - -@replaced_by_pep8(one_of) -def oneOf(): ... - -@replaced_by_pep8(dict_of) -def dictOf(): ... - -@replaced_by_pep8(original_text_for) -def originalTextFor(): ... - -@replaced_by_pep8(nested_expr) -def nestedExpr(): ... - -@replaced_by_pep8(make_html_tags) -def makeHTMLTags(): ... - -@replaced_by_pep8(make_xml_tags) -def makeXMLTags(): ... - -@replaced_by_pep8(replace_html_entity) -def replaceHTMLEntity(): ... - -@replaced_by_pep8(infix_notation) -def infixNotation(): ... -# fmt: on diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py deleted file mode 100644 index 0313049..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py +++ /dev/null @@ -1,796 +0,0 @@ -# results.py -from collections.abc import ( - MutableMapping, - Mapping, - MutableSequence, - Iterator, - Sequence, - Container, -) -import pprint -from typing import Tuple, Any, Dict, Set, List - -str_type: Tuple[type, ...] = (str, bytes) -_generator_type = type((_ for _ in ())) - - -class _ParseResultsWithOffset: - tup: Tuple["ParseResults", int] - __slots__ = ["tup"] - - def __init__(self, p1: "ParseResults", p2: int): - self.tup: Tuple[ParseResults, int] = (p1, p2) - - def __getitem__(self, i): - return self.tup[i] - - def __getstate__(self): - return self.tup - - def __setstate__(self, *args): - self.tup = args[0] - - -class ParseResults: - """Structured parse results, to provide multiple means of access to - the parsed data: - - - as a list (``len(results)``) - - by list index (``results[0], results[1]``, etc.) - - by attribute (``results.`` - see :class:`ParserElement.set_results_name`) - - Example:: - - integer = Word(nums) - date_str = (integer.set_results_name("year") + '/' - + integer.set_results_name("month") + '/' - + integer.set_results_name("day")) - # equivalent form: - # date_str = (integer("year") + '/' - # + integer("month") + '/' - # + integer("day")) - - # parse_string returns a ParseResults object - result = date_str.parse_string("1999/12/31") - - def test(s, fn=repr): - print(f"{s} -> {fn(eval(s))}") - test("list(result)") - test("result[0]") - test("result['month']") - test("result.day") - test("'month' in result") - test("'minutes' in result") - test("result.dump()", str) - - prints:: - - list(result) -> ['1999', '/', '12', '/', '31'] - result[0] -> '1999' - result['month'] -> '12' - result.day -> '31' - 'month' in result -> True - 'minutes' in result -> False - result.dump() -> ['1999', '/', '12', '/', '31'] - - day: '31' - - month: '12' - - year: '1999' - """ - - _null_values: Tuple[Any, ...] = (None, [], ()) - - _name: str - _parent: "ParseResults" - _all_names: Set[str] - _modal: bool - _toklist: List[Any] - _tokdict: Dict[str, Any] - - __slots__ = ( - "_name", - "_parent", - "_all_names", - "_modal", - "_toklist", - "_tokdict", - ) - - class List(list): - """ - Simple wrapper class to distinguish parsed list results that should be preserved - as actual Python lists, instead of being converted to :class:`ParseResults`:: - - LBRACK, RBRACK = map(pp.Suppress, "[]") - element = pp.Forward() - item = ppc.integer - element_list = LBRACK + pp.DelimitedList(element) + RBRACK - - # add parse actions to convert from ParseResults to actual Python collection types - def as_python_list(t): - return pp.ParseResults.List(t.as_list()) - element_list.add_parse_action(as_python_list) - - element <<= item | element_list - - element.run_tests(''' - 100 - [2,3,4] - [[2, 1],3,4] - [(2, 1),3,4] - (2,3,4) - ''', post_parse=lambda s, r: (r[0], type(r[0]))) - - prints:: - - 100 - (100, ) - - [2,3,4] - ([2, 3, 4], ) - - [[2, 1],3,4] - ([[2, 1], 3, 4], ) - - (Used internally by :class:`Group` when `aslist=True`.) - """ - - def __new__(cls, contained=None): - if contained is None: - contained = [] - - if not isinstance(contained, list): - raise TypeError( - f"{cls.__name__} may only be constructed with a list, not {type(contained).__name__}" - ) - - return list.__new__(cls) - - def __new__(cls, toklist=None, name=None, **kwargs): - if isinstance(toklist, ParseResults): - return toklist - self = object.__new__(cls) - self._name = None - self._parent = None - self._all_names = set() - - if toklist is None: - self._toklist = [] - elif isinstance(toklist, (list, _generator_type)): - self._toklist = ( - [toklist[:]] - if isinstance(toklist, ParseResults.List) - else list(toklist) - ) - else: - self._toklist = [toklist] - self._tokdict = dict() - return self - - # Performance tuning: we construct a *lot* of these, so keep this - # constructor as small and fast as possible - def __init__( - self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance - ): - self._tokdict: Dict[str, _ParseResultsWithOffset] - self._modal = modal - if name is not None and name != "": - if isinstance(name, int): - name = str(name) - if not modal: - self._all_names = {name} - self._name = name - if toklist not in self._null_values: - if isinstance(toklist, (str_type, type)): - toklist = [toklist] - if asList: - if isinstance(toklist, ParseResults): - self[name] = _ParseResultsWithOffset( - ParseResults(toklist._toklist), 0 - ) - else: - self[name] = _ParseResultsWithOffset( - ParseResults(toklist[0]), 0 - ) - self[name]._name = name - else: - try: - self[name] = toklist[0] - except (KeyError, TypeError, IndexError): - if toklist is not self: - self[name] = toklist - else: - self._name = name - - def __getitem__(self, i): - if isinstance(i, (int, slice)): - return self._toklist[i] - else: - if i not in self._all_names: - return self._tokdict[i][-1][0] - else: - return ParseResults([v[0] for v in self._tokdict[i]]) - - def __setitem__(self, k, v, isinstance=isinstance): - if isinstance(v, _ParseResultsWithOffset): - self._tokdict[k] = self._tokdict.get(k, list()) + [v] - sub = v[0] - elif isinstance(k, (int, slice)): - self._toklist[k] = v - sub = v - else: - self._tokdict[k] = self._tokdict.get(k, list()) + [ - _ParseResultsWithOffset(v, 0) - ] - sub = v - if isinstance(sub, ParseResults): - sub._parent = self - - def __delitem__(self, i): - if isinstance(i, (int, slice)): - mylen = len(self._toklist) - del self._toklist[i] - - # convert int to slice - if isinstance(i, int): - if i < 0: - i += mylen - i = slice(i, i + 1) - # get removed indices - removed = list(range(*i.indices(mylen))) - removed.reverse() - # fixup indices in token dictionary - for name, occurrences in self._tokdict.items(): - for j in removed: - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset( - value, position - (position > j) - ) - else: - del self._tokdict[i] - - def __contains__(self, k) -> bool: - return k in self._tokdict - - def __len__(self) -> int: - return len(self._toklist) - - def __bool__(self) -> bool: - return not not (self._toklist or self._tokdict) - - def __iter__(self) -> Iterator: - return iter(self._toklist) - - def __reversed__(self) -> Iterator: - return iter(self._toklist[::-1]) - - def keys(self): - return iter(self._tokdict) - - def values(self): - return (self[k] for k in self.keys()) - - def items(self): - return ((k, self[k]) for k in self.keys()) - - def haskeys(self) -> bool: - """ - Since ``keys()`` returns an iterator, this method is helpful in bypassing - code that looks for the existence of any defined results names.""" - return not not self._tokdict - - def pop(self, *args, **kwargs): - """ - Removes and returns item at specified index (default= ``last``). - Supports both ``list`` and ``dict`` semantics for ``pop()``. If - passed no argument or an integer argument, it will use ``list`` - semantics and pop tokens from the list of parsed tokens. If passed - a non-integer argument (most likely a string), it will use ``dict`` - semantics and pop the corresponding value from any defined results - names. A second default return value argument is supported, just as in - ``dict.pop()``. - - Example:: - - numlist = Word(nums)[...] - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] - - def remove_first(tokens): - tokens.pop(0) - numlist.add_parse_action(remove_first) - print(numlist.parse_string("0 123 321")) # -> ['123', '321'] - - label = Word(alphas) - patt = label("LABEL") + Word(nums)[1, ...] - print(patt.parse_string("AAB 123 321").dump()) - - # Use pop() in a parse action to remove named result (note that corresponding value is not - # removed from list form of results) - def remove_LABEL(tokens): - tokens.pop("LABEL") - return tokens - patt.add_parse_action(remove_LABEL) - print(patt.parse_string("AAB 123 321").dump()) - - prints:: - - ['AAB', '123', '321'] - - LABEL: 'AAB' - - ['AAB', '123', '321'] - """ - if not args: - args = [-1] - for k, v in kwargs.items(): - if k == "default": - args = (args[0], v) - else: - raise TypeError(f"pop() got an unexpected keyword argument {k!r}") - if isinstance(args[0], int) or len(args) == 1 or args[0] in self: - index = args[0] - ret = self[index] - del self[index] - return ret - else: - defaultvalue = args[1] - return defaultvalue - - def get(self, key, default_value=None): - """ - Returns named result matching the given key, or if there is no - such name, then returns the given ``default_value`` or ``None`` if no - ``default_value`` is specified. - - Similar to ``dict.get()``. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parse_string("1999/12/31") - print(result.get("year")) # -> '1999' - print(result.get("hour", "not specified")) # -> 'not specified' - print(result.get("hour")) # -> None - """ - if key in self: - return self[key] - else: - return default_value - - def insert(self, index, ins_string): - """ - Inserts new element at location index in the list of parsed tokens. - - Similar to ``list.insert()``. - - Example:: - - numlist = Word(nums)[...] - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to insert the parse location in the front of the parsed results - def insert_locn(locn, tokens): - tokens.insert(0, locn) - numlist.add_parse_action(insert_locn) - print(numlist.parse_string("0 123 321")) # -> [0, '0', '123', '321'] - """ - self._toklist.insert(index, ins_string) - # fixup indices in token dictionary - for name, occurrences in self._tokdict.items(): - for k, (value, position) in enumerate(occurrences): - occurrences[k] = _ParseResultsWithOffset( - value, position + (position > index) - ) - - def append(self, item): - """ - Add single element to end of ``ParseResults`` list of elements. - - Example:: - - numlist = Word(nums)[...] - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321'] - - # use a parse action to compute the sum of the parsed integers, and add it to the end - def append_sum(tokens): - tokens.append(sum(map(int, tokens))) - numlist.add_parse_action(append_sum) - print(numlist.parse_string("0 123 321")) # -> ['0', '123', '321', 444] - """ - self._toklist.append(item) - - def extend(self, itemseq): - """ - Add sequence of elements to end of ``ParseResults`` list of elements. - - Example:: - - patt = Word(alphas)[1, ...] - - # use a parse action to append the reverse of the matched strings, to make a palindrome - def make_palindrome(tokens): - tokens.extend(reversed([t[::-1] for t in tokens])) - return ''.join(tokens) - patt.add_parse_action(make_palindrome) - print(patt.parse_string("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' - """ - if isinstance(itemseq, ParseResults): - self.__iadd__(itemseq) - else: - self._toklist.extend(itemseq) - - def clear(self): - """ - Clear all elements and results names. - """ - del self._toklist[:] - self._tokdict.clear() - - def __getattr__(self, name): - try: - return self[name] - except KeyError: - if name.startswith("__"): - raise AttributeError(name) - return "" - - def __add__(self, other: "ParseResults") -> "ParseResults": - ret = self.copy() - ret += other - return ret - - def __iadd__(self, other: "ParseResults") -> "ParseResults": - if not other: - return self - - if other._tokdict: - offset = len(self._toklist) - addoffset = lambda a: offset if a < 0 else a + offset - otheritems = other._tokdict.items() - otherdictitems = [ - (k, _ParseResultsWithOffset(v[0], addoffset(v[1]))) - for k, vlist in otheritems - for v in vlist - ] - for k, v in otherdictitems: - self[k] = v - if isinstance(v[0], ParseResults): - v[0]._parent = self - - self._toklist += other._toklist - self._all_names |= other._all_names - return self - - def __radd__(self, other) -> "ParseResults": - if isinstance(other, int) and other == 0: - # useful for merging many ParseResults using sum() builtin - return self.copy() - else: - # this may raise a TypeError - so be it - return other + self - - def __repr__(self) -> str: - return f"{type(self).__name__}({self._toklist!r}, {self.as_dict()})" - - def __str__(self) -> str: - return ( - "[" - + ", ".join( - [ - str(i) if isinstance(i, ParseResults) else repr(i) - for i in self._toklist - ] - ) - + "]" - ) - - def _asStringList(self, sep=""): - out = [] - for item in self._toklist: - if out and sep: - out.append(sep) - if isinstance(item, ParseResults): - out += item._asStringList() - else: - out.append(str(item)) - return out - - def as_list(self) -> list: - """ - Returns the parse results as a nested list of matching tokens, all converted to strings. - - Example:: - - patt = Word(alphas)[1, ...] - result = patt.parse_string("sldkj lsdkj sldkj") - # even though the result prints in string-like form, it is actually a pyparsing ParseResults - print(type(result), result) # -> ['sldkj', 'lsdkj', 'sldkj'] - - # Use as_list() to create an actual list - result_list = result.as_list() - print(type(result_list), result_list) # -> ['sldkj', 'lsdkj', 'sldkj'] - """ - return [ - res.as_list() if isinstance(res, ParseResults) else res - for res in self._toklist - ] - - def as_dict(self) -> dict: - """ - Returns the named parse results as a nested dictionary. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parse_string('12/31/1999') - print(type(result), repr(result)) # -> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) - - result_dict = result.as_dict() - print(type(result_dict), repr(result_dict)) # -> {'day': '1999', 'year': '12', 'month': '31'} - - # even though a ParseResults supports dict-like access, sometime you just need to have a dict - import json - print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable - print(json.dumps(result.as_dict())) # -> {"month": "31", "day": "1999", "year": "12"} - """ - - def to_item(obj): - if isinstance(obj, ParseResults): - return obj.as_dict() if obj.haskeys() else [to_item(v) for v in obj] - else: - return obj - - return dict((k, to_item(v)) for k, v in self.items()) - - def copy(self) -> "ParseResults": - """ - Returns a new shallow copy of a :class:`ParseResults` object. `ParseResults` - items contained within the source are shared with the copy. Use - :class:`ParseResults.deepcopy()` to create a copy with its own separate - content values. - """ - ret = ParseResults(self._toklist) - ret._tokdict = self._tokdict.copy() - ret._parent = self._parent - ret._all_names |= self._all_names - ret._name = self._name - return ret - - def deepcopy(self) -> "ParseResults": - """ - Returns a new deep copy of a :class:`ParseResults` object. - """ - ret = self.copy() - # replace values with copies if they are of known mutable types - for i, obj in enumerate(self._toklist): - if isinstance(obj, ParseResults): - self._toklist[i] = obj.deepcopy() - elif isinstance(obj, (str, bytes)): - pass - elif isinstance(obj, MutableMapping): - self._toklist[i] = dest = type(obj)() - for k, v in obj.items(): - dest[k] = v.deepcopy() if isinstance(v, ParseResults) else v - elif isinstance(obj, Container): - self._toklist[i] = type(obj)( - v.deepcopy() if isinstance(v, ParseResults) else v for v in obj - ) - return ret - - def get_name(self): - r""" - Returns the results name for this token expression. Useful when several - different expressions might match at a particular location. - - Example:: - - integer = Word(nums) - ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") - house_number_expr = Suppress('#') + Word(nums, alphanums) - user_data = (Group(house_number_expr)("house_number") - | Group(ssn_expr)("ssn") - | Group(integer)("age")) - user_info = user_data[1, ...] - - result = user_info.parse_string("22 111-22-3333 #221B") - for item in result: - print(item.get_name(), ':', item[0]) - - prints:: - - age : 22 - ssn : 111-22-3333 - house_number : 221B - """ - if self._name: - return self._name - elif self._parent: - par: "ParseResults" = self._parent - parent_tokdict_items = par._tokdict.items() - return next( - ( - k - for k, vlist in parent_tokdict_items - for v, loc in vlist - if v is self - ), - None, - ) - elif ( - len(self) == 1 - and len(self._tokdict) == 1 - and next(iter(self._tokdict.values()))[0][1] in (0, -1) - ): - return next(iter(self._tokdict.keys())) - else: - return None - - def dump(self, indent="", full=True, include_list=True, _depth=0) -> str: - """ - Diagnostic method for listing out the contents of - a :class:`ParseResults`. Accepts an optional ``indent`` argument so - that this string can be embedded in a nested display of other data. - - Example:: - - integer = Word(nums) - date_str = integer("year") + '/' + integer("month") + '/' + integer("day") - - result = date_str.parse_string('1999/12/31') - print(result.dump()) - - prints:: - - ['1999', '/', '12', '/', '31'] - - day: '31' - - month: '12' - - year: '1999' - """ - out = [] - NL = "\n" - out.append(indent + str(self.as_list()) if include_list else "") - - if full: - if self.haskeys(): - items = sorted((str(k), v) for k, v in self.items()) - for k, v in items: - if out: - out.append(NL) - out.append(f"{indent}{(' ' * _depth)}- {k}: ") - if isinstance(v, ParseResults): - if v: - out.append( - v.dump( - indent=indent, - full=full, - include_list=include_list, - _depth=_depth + 1, - ) - ) - else: - out.append(str(v)) - else: - out.append(repr(v)) - if any(isinstance(vv, ParseResults) for vv in self): - v = self - for i, vv in enumerate(v): - if isinstance(vv, ParseResults): - out.append( - "\n{}{}[{}]:\n{}{}{}".format( - indent, - (" " * (_depth)), - i, - indent, - (" " * (_depth + 1)), - vv.dump( - indent=indent, - full=full, - include_list=include_list, - _depth=_depth + 1, - ), - ) - ) - else: - out.append( - "\n%s%s[%d]:\n%s%s%s" - % ( - indent, - (" " * (_depth)), - i, - indent, - (" " * (_depth + 1)), - str(vv), - ) - ) - - return "".join(out) - - def pprint(self, *args, **kwargs): - """ - Pretty-printer for parsed results as a list, using the - `pprint `_ module. - Accepts additional positional or keyword args as defined for - `pprint.pprint `_ . - - Example:: - - ident = Word(alphas, alphanums) - num = Word(nums) - func = Forward() - term = ident | num | Group('(' + func + ')') - func <<= ident + Group(Optional(DelimitedList(term))) - result = func.parse_string("fna a,b,(fnb c,d,200),100") - result.pprint(width=40) - - prints:: - - ['fna', - ['a', - 'b', - ['(', 'fnb', ['c', 'd', '200'], ')'], - '100']] - """ - pprint.pprint(self.as_list(), *args, **kwargs) - - # add support for pickle protocol - def __getstate__(self): - return ( - self._toklist, - ( - self._tokdict.copy(), - None, - self._all_names, - self._name, - ), - ) - - def __setstate__(self, state): - self._toklist, (self._tokdict, par, inAccumNames, self._name) = state - self._all_names = set(inAccumNames) - self._parent = None - - def __getnewargs__(self): - return self._toklist, self._name - - def __dir__(self): - return dir(type(self)) + list(self.keys()) - - @classmethod - def from_dict(cls, other, name=None) -> "ParseResults": - """ - Helper classmethod to construct a ``ParseResults`` from a ``dict``, preserving the - name-value relations as results names. If an optional ``name`` argument is - given, a nested ``ParseResults`` will be returned. - """ - - def is_iterable(obj): - try: - iter(obj) - except Exception: - return False - # str's are iterable, but in pyparsing, we don't want to iterate over them - else: - return not isinstance(obj, str_type) - - ret = cls([]) - for k, v in other.items(): - if isinstance(v, Mapping): - ret += cls.from_dict(v, name=k) - else: - ret += cls([v], name=k, asList=is_iterable(v)) - if name is not None: - ret = cls([ret], name=name) - return ret - - asList = as_list - """Deprecated - use :class:`as_list`""" - asDict = as_dict - """Deprecated - use :class:`as_dict`""" - getName = get_name - """Deprecated - use :class:`get_name`""" - - -MutableMapping.register(ParseResults) -MutableSequence.register(ParseResults) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py deleted file mode 100644 index 6a254c1..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py +++ /dev/null @@ -1,331 +0,0 @@ -# testing.py - -from contextlib import contextmanager -import typing - -from .core import ( - ParserElement, - ParseException, - Keyword, - __diag__, - __compat__, -) - - -class pyparsing_test: - """ - namespace class for classes useful in writing unit tests - """ - - class reset_pyparsing_context: - """ - Context manager to be used when writing unit tests that modify pyparsing config values: - - packrat parsing - - bounded recursion parsing - - default whitespace characters. - - default keyword characters - - literal string auto-conversion class - - __diag__ settings - - Example:: - - with reset_pyparsing_context(): - # test that literals used to construct a grammar are automatically suppressed - ParserElement.inlineLiteralsUsing(Suppress) - - term = Word(alphas) | Word(nums) - group = Group('(' + term[...] + ')') - - # assert that the '()' characters are not included in the parsed tokens - self.assertParseAndCheckList(group, "(abc 123 def)", ['abc', '123', 'def']) - - # after exiting context manager, literals are converted to Literal expressions again - """ - - def __init__(self): - self._save_context = {} - - def save(self): - self._save_context["default_whitespace"] = ParserElement.DEFAULT_WHITE_CHARS - self._save_context["default_keyword_chars"] = Keyword.DEFAULT_KEYWORD_CHARS - - self._save_context[ - "literal_string_class" - ] = ParserElement._literalStringClass - - self._save_context["verbose_stacktrace"] = ParserElement.verbose_stacktrace - - self._save_context["packrat_enabled"] = ParserElement._packratEnabled - if ParserElement._packratEnabled: - self._save_context[ - "packrat_cache_size" - ] = ParserElement.packrat_cache.size - else: - self._save_context["packrat_cache_size"] = None - self._save_context["packrat_parse"] = ParserElement._parse - self._save_context[ - "recursion_enabled" - ] = ParserElement._left_recursion_enabled - - self._save_context["__diag__"] = { - name: getattr(__diag__, name) for name in __diag__._all_names - } - - self._save_context["__compat__"] = { - "collect_all_And_tokens": __compat__.collect_all_And_tokens - } - - return self - - def restore(self): - # reset pyparsing global state - if ( - ParserElement.DEFAULT_WHITE_CHARS - != self._save_context["default_whitespace"] - ): - ParserElement.set_default_whitespace_chars( - self._save_context["default_whitespace"] - ) - - ParserElement.verbose_stacktrace = self._save_context["verbose_stacktrace"] - - Keyword.DEFAULT_KEYWORD_CHARS = self._save_context["default_keyword_chars"] - ParserElement.inlineLiteralsUsing( - self._save_context["literal_string_class"] - ) - - for name, value in self._save_context["__diag__"].items(): - (__diag__.enable if value else __diag__.disable)(name) - - ParserElement._packratEnabled = False - if self._save_context["packrat_enabled"]: - ParserElement.enable_packrat(self._save_context["packrat_cache_size"]) - else: - ParserElement._parse = self._save_context["packrat_parse"] - ParserElement._left_recursion_enabled = self._save_context[ - "recursion_enabled" - ] - - __compat__.collect_all_And_tokens = self._save_context["__compat__"] - - return self - - def copy(self): - ret = type(self)() - ret._save_context.update(self._save_context) - return ret - - def __enter__(self): - return self.save() - - def __exit__(self, *args): - self.restore() - - class TestParseResultsAsserts: - """ - A mixin class to add parse results assertion methods to normal unittest.TestCase classes. - """ - - def assertParseResultsEquals( - self, result, expected_list=None, expected_dict=None, msg=None - ): - """ - Unit test assertion to compare a :class:`ParseResults` object with an optional ``expected_list``, - and compare any defined results names with an optional ``expected_dict``. - """ - if expected_list is not None: - self.assertEqual(expected_list, result.as_list(), msg=msg) - if expected_dict is not None: - self.assertEqual(expected_dict, result.as_dict(), msg=msg) - - def assertParseAndCheckList( - self, expr, test_string, expected_list, msg=None, verbose=True - ): - """ - Convenience wrapper assert to test a parser element and input string, and assert that - the resulting ``ParseResults.asList()`` is equal to the ``expected_list``. - """ - result = expr.parse_string(test_string, parse_all=True) - if verbose: - print(result.dump()) - else: - print(result.as_list()) - self.assertParseResultsEquals(result, expected_list=expected_list, msg=msg) - - def assertParseAndCheckDict( - self, expr, test_string, expected_dict, msg=None, verbose=True - ): - """ - Convenience wrapper assert to test a parser element and input string, and assert that - the resulting ``ParseResults.asDict()`` is equal to the ``expected_dict``. - """ - result = expr.parse_string(test_string, parseAll=True) - if verbose: - print(result.dump()) - else: - print(result.as_list()) - self.assertParseResultsEquals(result, expected_dict=expected_dict, msg=msg) - - def assertRunTestResults( - self, run_tests_report, expected_parse_results=None, msg=None - ): - """ - Unit test assertion to evaluate output of ``ParserElement.runTests()``. If a list of - list-dict tuples is given as the ``expected_parse_results`` argument, then these are zipped - with the report tuples returned by ``runTests`` and evaluated using ``assertParseResultsEquals``. - Finally, asserts that the overall ``runTests()`` success value is ``True``. - - :param run_tests_report: tuple(bool, [tuple(str, ParseResults or Exception)]) returned from runTests - :param expected_parse_results (optional): [tuple(str, list, dict, Exception)] - """ - run_test_success, run_test_results = run_tests_report - - if expected_parse_results is not None: - merged = [ - (*rpt, expected) - for rpt, expected in zip(run_test_results, expected_parse_results) - ] - for test_string, result, expected in merged: - # expected should be a tuple containing a list and/or a dict or an exception, - # and optional failure message string - # an empty tuple will skip any result validation - fail_msg = next( - (exp for exp in expected if isinstance(exp, str)), None - ) - expected_exception = next( - ( - exp - for exp in expected - if isinstance(exp, type) and issubclass(exp, Exception) - ), - None, - ) - if expected_exception is not None: - with self.assertRaises( - expected_exception=expected_exception, msg=fail_msg or msg - ): - if isinstance(result, Exception): - raise result - else: - expected_list = next( - (exp for exp in expected if isinstance(exp, list)), None - ) - expected_dict = next( - (exp for exp in expected if isinstance(exp, dict)), None - ) - if (expected_list, expected_dict) != (None, None): - self.assertParseResultsEquals( - result, - expected_list=expected_list, - expected_dict=expected_dict, - msg=fail_msg or msg, - ) - else: - # warning here maybe? - print(f"no validation for {test_string!r}") - - # do this last, in case some specific test results can be reported instead - self.assertTrue( - run_test_success, msg=msg if msg is not None else "failed runTests" - ) - - @contextmanager - def assertRaisesParseException(self, exc_type=ParseException, msg=None): - with self.assertRaises(exc_type, msg=msg): - yield - - @staticmethod - def with_line_numbers( - s: str, - start_line: typing.Optional[int] = None, - end_line: typing.Optional[int] = None, - expand_tabs: bool = True, - eol_mark: str = "|", - mark_spaces: typing.Optional[str] = None, - mark_control: typing.Optional[str] = None, - ) -> str: - """ - Helpful method for debugging a parser - prints a string with line and column numbers. - (Line and column numbers are 1-based.) - - :param s: tuple(bool, str - string to be printed with line and column numbers - :param start_line: int - (optional) starting line number in s to print (default=1) - :param end_line: int - (optional) ending line number in s to print (default=len(s)) - :param expand_tabs: bool - (optional) expand tabs to spaces, to match the pyparsing default - :param eol_mark: str - (optional) string to mark the end of lines, helps visualize trailing spaces (default="|") - :param mark_spaces: str - (optional) special character to display in place of spaces - :param mark_control: str - (optional) convert non-printing control characters to a placeholding - character; valid values: - - "unicode" - replaces control chars with Unicode symbols, such as "â" and "âŠ" - - any single character string - replace control characters with given string - - None (default) - string is displayed as-is - - :return: str - input string with leading line numbers and column number headers - """ - if expand_tabs: - s = s.expandtabs() - if mark_control is not None: - mark_control = typing.cast(str, mark_control) - if mark_control == "unicode": - transtable_map = { - c: u for c, u in zip(range(0, 33), range(0x2400, 0x2433)) - } - transtable_map[127] = 0x2421 - tbl = str.maketrans(transtable_map) - eol_mark = "" - else: - ord_mark_control = ord(mark_control) - tbl = str.maketrans( - {c: ord_mark_control for c in list(range(0, 32)) + [127]} - ) - s = s.translate(tbl) - if mark_spaces is not None and mark_spaces != " ": - if mark_spaces == "unicode": - tbl = str.maketrans({9: 0x2409, 32: 0x2423}) - s = s.translate(tbl) - else: - s = s.replace(" ", mark_spaces) - if start_line is None: - start_line = 1 - if end_line is None: - end_line = len(s) - end_line = min(end_line, len(s)) - start_line = min(max(1, start_line), end_line) - - if mark_control != "unicode": - s_lines = s.splitlines()[start_line - 1 : end_line] - else: - s_lines = [line + "âŠ" for line in s.split("âŠ")[start_line - 1 : end_line]] - if not s_lines: - return "" - - lineno_width = len(str(end_line)) - max_line_len = max(len(line) for line in s_lines) - lead = " " * (lineno_width + 1) - if max_line_len >= 99: - header0 = ( - lead - + "".join( - f"{' ' * 99}{(i + 1) % 100}" - for i in range(max(max_line_len // 100, 1)) - ) - + "\n" - ) - else: - header0 = "" - header1 = ( - header0 - + lead - + "".join(f" {(i + 1) % 10}" for i in range(-(-max_line_len // 10))) - + "\n" - ) - header2 = lead + "1234567890" * (-(-max_line_len // 10)) + "\n" - return ( - header1 - + header2 - + "\n".join( - f"{i:{lineno_width}d}:{line}{eol_mark}" - for i, line in enumerate(s_lines, start=start_line) - ) - + "\n" - ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py deleted file mode 100644 index ec0b3a4..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py +++ /dev/null @@ -1,361 +0,0 @@ -# unicode.py - -import sys -from itertools import filterfalse -from typing import List, Tuple, Union - - -class _lazyclassproperty: - def __init__(self, fn): - self.fn = fn - self.__doc__ = fn.__doc__ - self.__name__ = fn.__name__ - - def __get__(self, obj, cls): - if cls is None: - cls = type(obj) - if not hasattr(cls, "_intern") or any( - cls._intern is getattr(superclass, "_intern", []) - for superclass in cls.__mro__[1:] - ): - cls._intern = {} - attrname = self.fn.__name__ - if attrname not in cls._intern: - cls._intern[attrname] = self.fn(cls) - return cls._intern[attrname] - - -UnicodeRangeList = List[Union[Tuple[int, int], Tuple[int]]] - - -class unicode_set: - """ - A set of Unicode characters, for language-specific strings for - ``alphas``, ``nums``, ``alphanums``, and ``printables``. - A unicode_set is defined by a list of ranges in the Unicode character - set, in a class attribute ``_ranges``. Ranges can be specified using - 2-tuples or a 1-tuple, such as:: - - _ranges = [ - (0x0020, 0x007e), - (0x00a0, 0x00ff), - (0x0100,), - ] - - Ranges are left- and right-inclusive. A 1-tuple of (x,) is treated as (x, x). - - A unicode set can also be defined using multiple inheritance of other unicode sets:: - - class CJK(Chinese, Japanese, Korean): - pass - """ - - _ranges: UnicodeRangeList = [] - - @_lazyclassproperty - def _chars_for_ranges(cls): - ret = [] - for cc in cls.__mro__: - if cc is unicode_set: - break - for rr in getattr(cc, "_ranges", ()): - ret.extend(range(rr[0], rr[-1] + 1)) - return [chr(c) for c in sorted(set(ret))] - - @_lazyclassproperty - def printables(cls): - """all non-whitespace characters in this range""" - return "".join(filterfalse(str.isspace, cls._chars_for_ranges)) - - @_lazyclassproperty - def alphas(cls): - """all alphabetic characters in this range""" - return "".join(filter(str.isalpha, cls._chars_for_ranges)) - - @_lazyclassproperty - def nums(cls): - """all numeric digit characters in this range""" - return "".join(filter(str.isdigit, cls._chars_for_ranges)) - - @_lazyclassproperty - def alphanums(cls): - """all alphanumeric characters in this range""" - return cls.alphas + cls.nums - - @_lazyclassproperty - def identchars(cls): - """all characters in this range that are valid identifier characters, plus underscore '_'""" - return "".join( - sorted( - set( - "".join(filter(str.isidentifier, cls._chars_for_ranges)) - + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzªµº" - + "ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖØÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ" - + "_" - ) - ) - ) - - @_lazyclassproperty - def identbodychars(cls): - """ - all characters in this range that are valid identifier body characters, - plus the digits 0-9, and · (Unicode MIDDLE DOT) - """ - return "".join( - sorted( - set( - cls.identchars - + "0123456789·" - + "".join( - [c for c in cls._chars_for_ranges if ("_" + c).isidentifier()] - ) - ) - ) - ) - - @_lazyclassproperty - def identifier(cls): - """ - a pyparsing Word expression for an identifier using this range's definitions for - identchars and identbodychars - """ - from pip._vendor.pyparsing import Word - - return Word(cls.identchars, cls.identbodychars) - - -class pyparsing_unicode(unicode_set): - """ - A namespace class for defining common language unicode_sets. - """ - - # fmt: off - - # define ranges in language character sets - _ranges: UnicodeRangeList = [ - (0x0020, sys.maxunicode), - ] - - class BasicMultilingualPlane(unicode_set): - """Unicode set for the Basic Multilingual Plane""" - _ranges: UnicodeRangeList = [ - (0x0020, 0xFFFF), - ] - - class Latin1(unicode_set): - """Unicode set for Latin-1 Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0020, 0x007E), - (0x00A0, 0x00FF), - ] - - class LatinA(unicode_set): - """Unicode set for Latin-A Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0100, 0x017F), - ] - - class LatinB(unicode_set): - """Unicode set for Latin-B Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0180, 0x024F), - ] - - class Greek(unicode_set): - """Unicode set for Greek Unicode Character Ranges""" - _ranges: UnicodeRangeList = [ - (0x0342, 0x0345), - (0x0370, 0x0377), - (0x037A, 0x037F), - (0x0384, 0x038A), - (0x038C,), - (0x038E, 0x03A1), - (0x03A3, 0x03E1), - (0x03F0, 0x03FF), - (0x1D26, 0x1D2A), - (0x1D5E,), - (0x1D60,), - (0x1D66, 0x1D6A), - (0x1F00, 0x1F15), - (0x1F18, 0x1F1D), - (0x1F20, 0x1F45), - (0x1F48, 0x1F4D), - (0x1F50, 0x1F57), - (0x1F59,), - (0x1F5B,), - (0x1F5D,), - (0x1F5F, 0x1F7D), - (0x1F80, 0x1FB4), - (0x1FB6, 0x1FC4), - (0x1FC6, 0x1FD3), - (0x1FD6, 0x1FDB), - (0x1FDD, 0x1FEF), - (0x1FF2, 0x1FF4), - (0x1FF6, 0x1FFE), - (0x2129,), - (0x2719, 0x271A), - (0xAB65,), - (0x10140, 0x1018D), - (0x101A0,), - (0x1D200, 0x1D245), - (0x1F7A1, 0x1F7A7), - ] - - class Cyrillic(unicode_set): - """Unicode set for Cyrillic Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0400, 0x052F), - (0x1C80, 0x1C88), - (0x1D2B,), - (0x1D78,), - (0x2DE0, 0x2DFF), - (0xA640, 0xA672), - (0xA674, 0xA69F), - (0xFE2E, 0xFE2F), - ] - - class Chinese(unicode_set): - """Unicode set for Chinese Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x2E80, 0x2E99), - (0x2E9B, 0x2EF3), - (0x31C0, 0x31E3), - (0x3400, 0x4DB5), - (0x4E00, 0x9FEF), - (0xA700, 0xA707), - (0xF900, 0xFA6D), - (0xFA70, 0xFAD9), - (0x16FE2, 0x16FE3), - (0x1F210, 0x1F212), - (0x1F214, 0x1F23B), - (0x1F240, 0x1F248), - (0x20000, 0x2A6D6), - (0x2A700, 0x2B734), - (0x2B740, 0x2B81D), - (0x2B820, 0x2CEA1), - (0x2CEB0, 0x2EBE0), - (0x2F800, 0x2FA1D), - ] - - class Japanese(unicode_set): - """Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges""" - - class Kanji(unicode_set): - "Unicode set for Kanji Unicode Character Range" - _ranges: UnicodeRangeList = [ - (0x4E00, 0x9FBF), - (0x3000, 0x303F), - ] - - class Hiragana(unicode_set): - """Unicode set for Hiragana Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x3041, 0x3096), - (0x3099, 0x30A0), - (0x30FC,), - (0xFF70,), - (0x1B001,), - (0x1B150, 0x1B152), - (0x1F200,), - ] - - class Katakana(unicode_set): - """Unicode set for Katakana Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x3099, 0x309C), - (0x30A0, 0x30FF), - (0x31F0, 0x31FF), - (0x32D0, 0x32FE), - (0xFF65, 0xFF9F), - (0x1B000,), - (0x1B164, 0x1B167), - (0x1F201, 0x1F202), - (0x1F213,), - ] - - 漢字 = Kanji - カタカナ = Katakana - ã²ã‚‰ãŒãª = Hiragana - - _ranges = ( - Kanji._ranges - + Hiragana._ranges - + Katakana._ranges - ) - - class Hangul(unicode_set): - """Unicode set for Hangul (Korean) Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x1100, 0x11FF), - (0x302E, 0x302F), - (0x3131, 0x318E), - (0x3200, 0x321C), - (0x3260, 0x327B), - (0x327E,), - (0xA960, 0xA97C), - (0xAC00, 0xD7A3), - (0xD7B0, 0xD7C6), - (0xD7CB, 0xD7FB), - (0xFFA0, 0xFFBE), - (0xFFC2, 0xFFC7), - (0xFFCA, 0xFFCF), - (0xFFD2, 0xFFD7), - (0xFFDA, 0xFFDC), - ] - - Korean = Hangul - - class CJK(Chinese, Japanese, Hangul): - """Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range""" - - class Thai(unicode_set): - """Unicode set for Thai Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0E01, 0x0E3A), - (0x0E3F, 0x0E5B) - ] - - class Arabic(unicode_set): - """Unicode set for Arabic Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0600, 0x061B), - (0x061E, 0x06FF), - (0x0700, 0x077F), - ] - - class Hebrew(unicode_set): - """Unicode set for Hebrew Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0591, 0x05C7), - (0x05D0, 0x05EA), - (0x05EF, 0x05F4), - (0xFB1D, 0xFB36), - (0xFB38, 0xFB3C), - (0xFB3E,), - (0xFB40, 0xFB41), - (0xFB43, 0xFB44), - (0xFB46, 0xFB4F), - ] - - class Devanagari(unicode_set): - """Unicode set for Devanagari Unicode Character Range""" - _ranges: UnicodeRangeList = [ - (0x0900, 0x097F), - (0xA8E0, 0xA8FF) - ] - - BMP = BasicMultilingualPlane - - # add language identifiers using language Unicode - العربية = Arabic - 中文 = Chinese - кириллица = Cyrillic - Ελληνικά = Greek - עִברִית = Hebrew - 日本語 = Japanese - 한국어 = Korean - ไทย = Thai - देवनागरी = Devanagari - - # fmt: on diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py deleted file mode 100644 index d8d3f41..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py +++ /dev/null @@ -1,284 +0,0 @@ -# util.py -import inspect -import warnings -import types -import collections -import itertools -from functools import lru_cache, wraps -from typing import Callable, List, Union, Iterable, TypeVar, cast - -_bslash = chr(92) -C = TypeVar("C", bound=Callable) - - -class __config_flags: - """Internal class for defining compatibility and debugging flags""" - - _all_names: List[str] = [] - _fixed_names: List[str] = [] - _type_desc = "configuration" - - @classmethod - def _set(cls, dname, value): - if dname in cls._fixed_names: - warnings.warn( - f"{cls.__name__}.{dname} {cls._type_desc} is {str(getattr(cls, dname)).upper()}" - f" and cannot be overridden", - stacklevel=3, - ) - return - if dname in cls._all_names: - setattr(cls, dname, value) - else: - raise ValueError(f"no such {cls._type_desc} {dname!r}") - - enable = classmethod(lambda cls, name: cls._set(name, True)) - disable = classmethod(lambda cls, name: cls._set(name, False)) - - -@lru_cache(maxsize=128) -def col(loc: int, strg: str) -> int: - """ - Returns current column within a string, counting newlines as line separators. - The first column is number 1. - - Note: the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See - :class:`ParserElement.parse_string` for more - information on parsing strings containing ```` s, and suggested - methods to maintain a consistent view of the parsed string, the parse - location, and line and column positions within the parsed string. - """ - s = strg - return 1 if 0 < loc < len(s) and s[loc - 1] == "\n" else loc - s.rfind("\n", 0, loc) - - -@lru_cache(maxsize=128) -def lineno(loc: int, strg: str) -> int: - """Returns current line number within a string, counting newlines as line separators. - The first line is number 1. - - Note - the default parsing behavior is to expand tabs in the input string - before starting the parsing process. See :class:`ParserElement.parse_string` - for more information on parsing strings containing ```` s, and - suggested methods to maintain a consistent view of the parsed string, the - parse location, and line and column positions within the parsed string. - """ - return strg.count("\n", 0, loc) + 1 - - -@lru_cache(maxsize=128) -def line(loc: int, strg: str) -> str: - """ - Returns the line of text containing loc within a string, counting newlines as line separators. - """ - last_cr = strg.rfind("\n", 0, loc) - next_cr = strg.find("\n", loc) - return strg[last_cr + 1 : next_cr] if next_cr >= 0 else strg[last_cr + 1 :] - - -class _UnboundedCache: - def __init__(self): - cache = {} - cache_get = cache.get - self.not_in_cache = not_in_cache = object() - - def get(_, key): - return cache_get(key, not_in_cache) - - def set_(_, key, value): - cache[key] = value - - def clear(_): - cache.clear() - - self.size = None - self.get = types.MethodType(get, self) - self.set = types.MethodType(set_, self) - self.clear = types.MethodType(clear, self) - - -class _FifoCache: - def __init__(self, size): - self.not_in_cache = not_in_cache = object() - cache = {} - keyring = [object()] * size - cache_get = cache.get - cache_pop = cache.pop - keyiter = itertools.cycle(range(size)) - - def get(_, key): - return cache_get(key, not_in_cache) - - def set_(_, key, value): - cache[key] = value - i = next(keyiter) - cache_pop(keyring[i], None) - keyring[i] = key - - def clear(_): - cache.clear() - keyring[:] = [object()] * size - - self.size = size - self.get = types.MethodType(get, self) - self.set = types.MethodType(set_, self) - self.clear = types.MethodType(clear, self) - - -class LRUMemo: - """ - A memoizing mapping that retains `capacity` deleted items - - The memo tracks retained items by their access order; once `capacity` items - are retained, the least recently used item is discarded. - """ - - def __init__(self, capacity): - self._capacity = capacity - self._active = {} - self._memory = collections.OrderedDict() - - def __getitem__(self, key): - try: - return self._active[key] - except KeyError: - self._memory.move_to_end(key) - return self._memory[key] - - def __setitem__(self, key, value): - self._memory.pop(key, None) - self._active[key] = value - - def __delitem__(self, key): - try: - value = self._active.pop(key) - except KeyError: - pass - else: - while len(self._memory) >= self._capacity: - self._memory.popitem(last=False) - self._memory[key] = value - - def clear(self): - self._active.clear() - self._memory.clear() - - -class UnboundedMemo(dict): - """ - A memoizing mapping that retains all deleted items - """ - - def __delitem__(self, key): - pass - - -def _escape_regex_range_chars(s: str) -> str: - # escape these chars: ^-[] - for c in r"\^-[]": - s = s.replace(c, _bslash + c) - s = s.replace("\n", r"\n") - s = s.replace("\t", r"\t") - return str(s) - - -def _collapse_string_to_ranges( - s: Union[str, Iterable[str]], re_escape: bool = True -) -> str: - def is_consecutive(c): - c_int = ord(c) - is_consecutive.prev, prev = c_int, is_consecutive.prev - if c_int - prev > 1: - is_consecutive.value = next(is_consecutive.counter) - return is_consecutive.value - - is_consecutive.prev = 0 # type: ignore [attr-defined] - is_consecutive.counter = itertools.count() # type: ignore [attr-defined] - is_consecutive.value = -1 # type: ignore [attr-defined] - - def escape_re_range_char(c): - return "\\" + c if c in r"\^-][" else c - - def no_escape_re_range_char(c): - return c - - if not re_escape: - escape_re_range_char = no_escape_re_range_char - - ret = [] - s = "".join(sorted(set(s))) - if len(s) > 3: - for _, chars in itertools.groupby(s, key=is_consecutive): - first = last = next(chars) - last = collections.deque( - itertools.chain(iter([last]), chars), maxlen=1 - ).pop() - if first == last: - ret.append(escape_re_range_char(first)) - else: - sep = "" if ord(last) == ord(first) + 1 else "-" - ret.append( - f"{escape_re_range_char(first)}{sep}{escape_re_range_char(last)}" - ) - else: - ret = [escape_re_range_char(c) for c in s] - - return "".join(ret) - - -def _flatten(ll: list) -> list: - ret = [] - for i in ll: - if isinstance(i, list): - ret.extend(_flatten(i)) - else: - ret.append(i) - return ret - - -def _make_synonym_function(compat_name: str, fn: C) -> C: - # In a future version, uncomment the code in the internal _inner() functions - # to begin emitting DeprecationWarnings. - - # Unwrap staticmethod/classmethod - fn = getattr(fn, "__func__", fn) - - # (Presence of 'self' arg in signature is used by explain_exception() methods, so we take - # some extra steps to add it if present in decorated function.) - if "self" == list(inspect.signature(fn).parameters)[0]: - - @wraps(fn) - def _inner(self, *args, **kwargs): - # warnings.warn( - # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 - # ) - return fn(self, *args, **kwargs) - - else: - - @wraps(fn) - def _inner(*args, **kwargs): - # warnings.warn( - # f"Deprecated - use {fn.__name__}", DeprecationWarning, stacklevel=3 - # ) - return fn(*args, **kwargs) - - _inner.__doc__ = f"""Deprecated - use :class:`{fn.__name__}`""" - _inner.__name__ = compat_name - _inner.__annotations__ = fn.__annotations__ - if isinstance(fn, types.FunctionType): - _inner.__kwdefaults__ = fn.__kwdefaults__ - elif isinstance(fn, type) and hasattr(fn, "__init__"): - _inner.__kwdefaults__ = fn.__init__.__kwdefaults__ - else: - _inner.__kwdefaults__ = None - _inner.__qualname__ = fn.__qualname__ - return cast(C, _inner) - - -def replaced_by_pep8(fn: C) -> Callable[[Callable], C]: - """ - Decorator for pre-PEP8 compatibility synonyms, to link them to the new function. - """ - return lambda other: _make_synonym_function(other.__name__, fn) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py deleted file mode 100644 index ddfcf7f..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Wrappers to call pyproject.toml-based build backend hooks. -""" - -from ._impl import ( - BackendInvalid, - BackendUnavailable, - BuildBackendHookCaller, - HookMissing, - UnsupportedOperation, - default_subprocess_runner, - quiet_subprocess_runner, -) - -__version__ = '1.0.0' -__all__ = [ - 'BackendUnavailable', - 'BackendInvalid', - 'HookMissing', - 'UnsupportedOperation', - 'default_subprocess_runner', - 'quiet_subprocess_runner', - 'BuildBackendHookCaller', -] diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index cbbd0190a261079e79c954fbb35beed082f8720b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 zcmZvZzit#U5XSAj+uO~ZLIjF}=&nOoWSu~R1Oh2EPykhgw2kFGn>*+H58J!arGlrR zMRYt1Z?G*DqDe>*DFtGj99>-eH1^Er`8@uyy*);-Ui|&K_>B?znKu7dwh1ntK=1`| zR3nagrm)WHOb_aT9@ayh*SQ|mBVE*mF6$B_KB%`Ah!4Nvdc4kOqtmDFJ#$X@FpYLP zXG%@o+If2-=CO)atNn%r!KY0t6_CwW!tm+R+Eu8=zrYll75$x~oAcMEV@mS=-e!Mn zSjVJdjS~IdQMzH1cm?{G&`bD!lHxZq1Zfui?y(82bJj<}-+?I>r8WHnEq{-ZF#H2bAK0FrmqMO m0cQh@@p*>v@N!h*>=FUa6V7(g&fcfVpRAl@p9{YOwf_M9)w8Jp diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc deleted file mode 100644 index 56b8244939b1845dc99bc5ac627b37a3d15a81f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 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 (3, 11): - import tomllib -else: - from pip._vendor import tomli as tomllib diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py deleted file mode 100644 index 37b0e65..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py +++ /dev/null @@ -1,330 +0,0 @@ -import json -import os -import sys -import tempfile -from contextlib import contextmanager -from os.path import abspath -from os.path import join as pjoin -from subprocess import STDOUT, check_call, check_output - -from ._in_process import _in_proc_script_path - - -def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - -def read_json(path): - with open(path, encoding='utf-8') as f: - return json.load(f) - - -class BackendUnavailable(Exception): - """Will be raised if the backend cannot be imported in the hook process.""" - def __init__(self, traceback): - self.traceback = traceback - - -class BackendInvalid(Exception): - """Will be raised if the backend is invalid.""" - def __init__(self, backend_name, backend_path, message): - super().__init__(message) - self.backend_name = backend_name - self.backend_path = backend_path - - -class HookMissing(Exception): - """Will be raised on missing hooks (if a fallback can't be used).""" - def __init__(self, hook_name): - super().__init__(hook_name) - self.hook_name = hook_name - - -class UnsupportedOperation(Exception): - """May be raised by build_sdist if the backend indicates that it can't.""" - def __init__(self, traceback): - self.traceback = traceback - - -def default_subprocess_runner(cmd, cwd=None, extra_environ=None): - """The default method of calling the wrapper subprocess. - - This uses :func:`subprocess.check_call` under the hood. - """ - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_call(cmd, cwd=cwd, env=env) - - -def quiet_subprocess_runner(cmd, cwd=None, extra_environ=None): - """Call the subprocess while suppressing output. - - This uses :func:`subprocess.check_output` under the hood. - """ - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_output(cmd, cwd=cwd, env=env, stderr=STDOUT) - - -def norm_and_check(source_tree, requested): - """Normalise and check a backend path. - - Ensure that the requested backend path is specified as a relative path, - and resolves to a location under the given source tree. - - Return an absolute version of the requested path. - """ - if os.path.isabs(requested): - raise ValueError("paths must be relative") - - abs_source = os.path.abspath(source_tree) - abs_requested = os.path.normpath(os.path.join(abs_source, requested)) - # We have to use commonprefix for Python 2.7 compatibility. So we - # normalise case to avoid problems because commonprefix is a character - # based comparison :-( - norm_source = os.path.normcase(abs_source) - norm_requested = os.path.normcase(abs_requested) - if os.path.commonprefix([norm_source, norm_requested]) != norm_source: - raise ValueError("paths must be inside source tree") - - return abs_requested - - -class BuildBackendHookCaller: - """A wrapper to call the build backend hooks for a source directory. - """ - - def __init__( - self, - source_dir, - build_backend, - backend_path=None, - runner=None, - python_executable=None, - ): - """ - :param source_dir: The source directory to invoke the build backend for - :param build_backend: The build backend spec - :param backend_path: Additional path entries for the build backend spec - :param runner: The :ref:`subprocess runner ` to use - :param python_executable: - The Python executable used to invoke the build backend - """ - if runner is None: - runner = default_subprocess_runner - - self.source_dir = abspath(source_dir) - self.build_backend = build_backend - if backend_path: - backend_path = [ - norm_and_check(self.source_dir, p) for p in backend_path - ] - self.backend_path = backend_path - self._subprocess_runner = runner - if not python_executable: - python_executable = sys.executable - self.python_executable = python_executable - - @contextmanager - def subprocess_runner(self, runner): - """A context manager for temporarily overriding the default - :ref:`subprocess runner `. - - .. code-block:: python - - hook_caller = BuildBackendHookCaller(...) - with hook_caller.subprocess_runner(quiet_subprocess_runner): - ... - """ - prev = self._subprocess_runner - self._subprocess_runner = runner - try: - yield - finally: - self._subprocess_runner = prev - - def _supported_features(self): - """Return the list of optional features supported by the backend.""" - return self._call_hook('_supported_features', {}) - - def get_requires_for_build_wheel(self, config_settings=None): - """Get additional dependencies required for building a wheel. - - :returns: A list of :pep:`dependency specifiers <508>`. - :rtype: list[str] - - .. admonition:: Fallback - - If the build backend does not defined a hook with this name, an - empty list will be returned. - """ - return self._call_hook('get_requires_for_build_wheel', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_wheel( - self, metadata_directory, config_settings=None, - _allow_fallback=True): - """Prepare a ``*.dist-info`` folder with metadata for this project. - - :returns: Name of the newly created subfolder within - ``metadata_directory``, containing the metadata. - :rtype: str - - .. admonition:: Fallback - - If the build backend does not define a hook with this name and - ``_allow_fallback`` is truthy, the backend will be asked to build a - wheel via the ``build_wheel`` hook and the dist-info extracted from - that will be returned. - """ - return self._call_hook('prepare_metadata_for_build_wheel', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - '_allow_fallback': _allow_fallback, - }) - - def build_wheel( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build a wheel from this project. - - :returns: - The name of the newly created wheel within ``wheel_directory``. - - .. admonition:: Interaction with fallback - - If the ``build_wheel`` hook was called in the fallback for - :meth:`prepare_metadata_for_build_wheel`, the build backend would - not be invoked. Instead, the previously built wheel will be copied - to ``wheel_directory`` and the name of that file will be returned. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_wheel', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_editable(self, config_settings=None): - """Get additional dependencies required for building an editable wheel. - - :returns: A list of :pep:`dependency specifiers <508>`. - :rtype: list[str] - - .. admonition:: Fallback - - If the build backend does not defined a hook with this name, an - empty list will be returned. - """ - return self._call_hook('get_requires_for_build_editable', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_editable( - self, metadata_directory, config_settings=None, - _allow_fallback=True): - """Prepare a ``*.dist-info`` folder with metadata for this project. - - :returns: Name of the newly created subfolder within - ``metadata_directory``, containing the metadata. - :rtype: str - - .. admonition:: Fallback - - If the build backend does not define a hook with this name and - ``_allow_fallback`` is truthy, the backend will be asked to build a - wheel via the ``build_editable`` hook and the dist-info - extracted from that will be returned. - """ - return self._call_hook('prepare_metadata_for_build_editable', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - '_allow_fallback': _allow_fallback, - }) - - def build_editable( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build an editable wheel from this project. - - :returns: - The name of the newly created wheel within ``wheel_directory``. - - .. admonition:: Interaction with fallback - - If the ``build_editable`` hook was called in the fallback for - :meth:`prepare_metadata_for_build_editable`, the build backend - would not be invoked. Instead, the previously built wheel will be - copied to ``wheel_directory`` and the name of that file will be - returned. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_editable', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_sdist(self, config_settings=None): - """Get additional dependencies required for building an sdist. - - :returns: A list of :pep:`dependency specifiers <508>`. - :rtype: list[str] - """ - return self._call_hook('get_requires_for_build_sdist', { - 'config_settings': config_settings - }) - - def build_sdist(self, sdist_directory, config_settings=None): - """Build an sdist from this project. - - :returns: - The name of the newly created sdist within ``wheel_directory``. - """ - return self._call_hook('build_sdist', { - 'sdist_directory': abspath(sdist_directory), - 'config_settings': config_settings, - }) - - def _call_hook(self, hook_name, kwargs): - extra_environ = {'PEP517_BUILD_BACKEND': self.build_backend} - - if self.backend_path: - backend_path = os.pathsep.join(self.backend_path) - extra_environ['PEP517_BACKEND_PATH'] = backend_path - - with tempfile.TemporaryDirectory() as td: - hook_input = {'kwargs': kwargs} - write_json(hook_input, pjoin(td, 'input.json'), indent=2) - - # Run the hook in a subprocess - with _in_proc_script_path() as script: - python = self.python_executable - self._subprocess_runner( - [python, abspath(str(script)), hook_name, td], - cwd=self.source_dir, - extra_environ=extra_environ - ) - - data = read_json(pjoin(td, 'output.json')) - if data.get('unsupported'): - raise UnsupportedOperation(data.get('traceback', '')) - if data.get('no_backend'): - raise BackendUnavailable(data.get('traceback', '')) - if data.get('backend_invalid'): - raise BackendInvalid( - backend_name=self.build_backend, - backend_path=self.backend_path, - message=data.get('backend_error', '') - ) - if data.get('hook_missing'): - raise HookMissing(data.get('missing_hook_name') or hook_name) - return data['return_val'] diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py deleted file mode 100644 index 917fa06..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -"""This is a subpackage because the directory is on sys.path for _in_process.py - -The subpackage should stay as empty as possible to avoid shadowing modules that -the backend might import. -""" - -import importlib.resources as resources - -try: - resources.files -except AttributeError: - # Python 3.8 compatibility - def _in_proc_script_path(): - return resources.path(__package__, '_in_process.py') -else: - def _in_proc_script_path(): - return resources.as_file( - resources.files(__package__).joinpath('_in_process.py')) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 14cf045888951f04430cf25b1674789d029b782e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 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 1: - print('Found multiple .whl files; unspecified behaviour. ' - 'Will call build_wheel.') - return None - - # Exactly one .whl file - return whl_files[0] - - -def build_wheel(wheel_directory, config_settings, metadata_directory=None): - """Invoke the mandatory build_wheel hook. - - If a wheel was already built in the - prepare_metadata_for_build_wheel fallback, this - will copy it rather than rebuilding the wheel. - """ - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return _build_backend().build_wheel(wheel_directory, config_settings, - metadata_directory) - - -def build_editable(wheel_directory, config_settings, metadata_directory=None): - """Invoke the optional build_editable hook. - - If a wheel was already built in the - prepare_metadata_for_build_editable fallback, this - will copy it rather than rebuilding the wheel. - """ - backend = _build_backend() - try: - hook = backend.build_editable - except AttributeError: - raise HookMissing() - else: - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return hook(wheel_directory, config_settings, metadata_directory) - - -def get_requires_for_build_sdist(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_sdist - except AttributeError: - return [] - else: - return hook(config_settings) - - -class _DummyException(Exception): - """Nothing should ever raise this exception""" - - -class GotUnsupportedOperation(Exception): - """For internal use when backend raises UnsupportedOperation""" - def __init__(self, traceback): - self.traceback = traceback - - -def build_sdist(sdist_directory, config_settings): - """Invoke the mandatory build_sdist hook.""" - backend = _build_backend() - try: - return backend.build_sdist(sdist_directory, config_settings) - except getattr(backend, 'UnsupportedOperation', _DummyException): - raise GotUnsupportedOperation(traceback.format_exc()) - - -HOOK_NAMES = { - 'get_requires_for_build_wheel', - 'prepare_metadata_for_build_wheel', - 'build_wheel', - 'get_requires_for_build_editable', - 'prepare_metadata_for_build_editable', - 'build_editable', - 'get_requires_for_build_sdist', - 'build_sdist', - '_supported_features', -} - - -def main(): - if len(sys.argv) < 3: - sys.exit("Needs args: hook_name, control_dir") - hook_name = sys.argv[1] - control_dir = sys.argv[2] - if hook_name not in HOOK_NAMES: - sys.exit("Unknown hook: %s" % hook_name) - hook = globals()[hook_name] - - hook_input = read_json(pjoin(control_dir, 'input.json')) - - json_out = {'unsupported': False, 'return_val': None} - try: - json_out['return_val'] = hook(**hook_input['kwargs']) - except BackendUnavailable as e: - json_out['no_backend'] = True - json_out['traceback'] = e.traceback - except BackendInvalid as e: - json_out['backend_invalid'] = True - json_out['backend_error'] = e.message - except GotUnsupportedOperation as e: - json_out['unsupported'] = True - json_out['traceback'] = e.traceback - except HookMissing as e: - json_out['hook_missing'] = True - json_out['missing_hook_name'] = e.hook_name or hook_name - - write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) - - -if __name__ == '__main__': - main() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py deleted file mode 100644 index 10ff67f..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py +++ /dev/null @@ -1,182 +0,0 @@ -# __ -# /__) _ _ _ _ _/ _ -# / ( (- (/ (/ (- _) / _) -# / - -""" -Requests HTTP Library -~~~~~~~~~~~~~~~~~~~~~ - -Requests is an HTTP library, written in Python, for human beings. -Basic GET usage: - - >>> import requests - >>> r = requests.get('https://www.python.org') - >>> r.status_code - 200 - >>> b'Python is a programming language' in r.content - True - -... or POST: - - >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post('https://httpbin.org/post', data=payload) - >>> print(r.text) - { - ... - "form": { - "key1": "value1", - "key2": "value2" - }, - ... - } - -The other HTTP methods are supported - see `requests.api`. Full documentation -is at . - -:copyright: (c) 2017 by Kenneth Reitz. -:license: Apache 2.0, see LICENSE for more details. -""" - -import warnings - -from pip._vendor import urllib3 - -from .exceptions import RequestsDependencyWarning - -charset_normalizer_version = None - -try: - from pip._vendor.chardet import __version__ as chardet_version -except ImportError: - chardet_version = None - - -def check_compatibility(urllib3_version, chardet_version, charset_normalizer_version): - urllib3_version = urllib3_version.split(".") - assert urllib3_version != ["dev"] # Verify urllib3 isn't installed from git. - - # Sometimes, urllib3 only reports its version as 16.1. - if len(urllib3_version) == 2: - urllib3_version.append("0") - - # Check urllib3 for compatibility. - major, minor, patch = urllib3_version # noqa: F811 - major, minor, patch = int(major), int(minor), int(patch) - # urllib3 >= 1.21.1 - assert major >= 1 - if major == 1: - assert minor >= 21 - - # Check charset_normalizer for compatibility. - if chardet_version: - major, minor, patch = chardet_version.split(".")[:3] - major, minor, patch = int(major), int(minor), int(patch) - # chardet_version >= 3.0.2, < 6.0.0 - assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0) - elif charset_normalizer_version: - major, minor, patch = charset_normalizer_version.split(".")[:3] - major, minor, patch = int(major), int(minor), int(patch) - # charset_normalizer >= 2.0.0 < 4.0.0 - assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0) - else: - raise Exception("You need either charset_normalizer or chardet installed") - - -def _check_cryptography(cryptography_version): - # cryptography < 1.3.4 - try: - cryptography_version = list(map(int, cryptography_version.split("."))) - except ValueError: - return - - if cryptography_version < [1, 3, 4]: - warning = "Old version of cryptography ({}) may cause slowdown.".format( - cryptography_version - ) - warnings.warn(warning, RequestsDependencyWarning) - - -# Check imported dependencies for compatibility. -try: - check_compatibility( - urllib3.__version__, chardet_version, charset_normalizer_version - ) -except (AssertionError, ValueError): - warnings.warn( - "urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported " - "version!".format( - urllib3.__version__, chardet_version, charset_normalizer_version - ), - RequestsDependencyWarning, - ) - -# Attempt to enable urllib3's fallback for SNI support -# if the standard library doesn't support SNI or the -# 'ssl' library isn't available. -try: - # Note: This logic prevents upgrading cryptography on Windows, if imported - # as part of pip. - from pip._internal.utils.compat import WINDOWS - if not WINDOWS: - raise ImportError("pip internals: don't import cryptography on Windows") - try: - import ssl - except ImportError: - ssl = None - - if not getattr(ssl, "HAS_SNI", False): - from pip._vendor.urllib3.contrib import pyopenssl - - pyopenssl.inject_into_urllib3() - - # Check cryptography version - from cryptography import __version__ as cryptography_version - - _check_cryptography(cryptography_version) -except ImportError: - pass - -# urllib3's DependencyWarnings should be silenced. -from pip._vendor.urllib3.exceptions import DependencyWarning - -warnings.simplefilter("ignore", DependencyWarning) - -# Set default logging handler to avoid "No handler found" warnings. -import logging -from logging import NullHandler - -from . import packages, utils -from .__version__ import ( - __author__, - __author_email__, - __build__, - __cake__, - __copyright__, - __description__, - __license__, - __title__, - __url__, - __version__, -) -from .api import delete, get, head, options, patch, post, put, request -from .exceptions import ( - ConnectionError, - ConnectTimeout, - FileModeWarning, - HTTPError, - JSONDecodeError, - ReadTimeout, - RequestException, - Timeout, - TooManyRedirects, - URLRequired, -) -from .models import PreparedRequest, Request, Response -from .sessions import Session, session -from .status_codes import codes - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter("default", FileModeWarning, append=True) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 06c7a7c263ea75a8157eac9888ab13fcfc27b973..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5450 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc deleted file mode 100644 index 22dc77209e86ad462d3249efc045e0cc8651ffdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581 zcmY*WJ#W)M7(OR$;y860QA8w!gcl^Dg0D%p3h^P9N=T?eojh=IeJ}A5e{pxV6i@CC z=*)ryBWy_g3>HQ!Bm99#-8vv%x1@r1I6u$hd+y%%x$m}Z5v(V_Kh3@wg#2pAx{zPi z`2+mCC!BbM8=k>iUW>QAHsA0z_@=kXJ6?x(y)HLBllQ#d!W#FNri6DnD6PuT(L#r5 z;v60yA31MQ=^W;j$C%@$J3LhbzL%(rlupC3LutB+@29Rx4O z*0RT#7CHjPmfMVRP=OSg7HNV)m$6(%2>Of_Ak~$Mj+0zO9CeE^KgSUz;^8%h*cX3Y zkq97B&EYm}HD#^HH4gJc7q^h}Sjms}68kwGG2qS;QVy uz52#(wOw1gRkt48s`~ZTP1Ni=l~wQD|3QZJ;5LfGab?&2d#9!xp#2Z&M8AIk diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc deleted file mode 100644 index 5592e88aa5658e62ecc41ccdc65f6b99de939e06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2021 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/api.cpython-312.pyc deleted file mode 100644 index f138db6eae3027e607c0fa5e817077879882ef3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7201 zcmeHM&u<&Y72YMOU!)zkPVB@@>P~AQ6m5!YOLm+Rj%-DeYo~@RL~@Y0DYUEIp}5j= zmz`OPp{q1Gq(FOVb7)~5ib97TY~+x?Hn6Deqxj@HrV&M@AI&X;cj@XkS=Y@%w}Wj>l`l5=+H;^g$q+%zi% z0?P@`93EP(CkyFMb!<7Ow+1Db(hYoRx0OLU8Ne@t-`4vmu4^F;R@ZX(sJQK;_EMt_4iRcpRUbmN3;`~)ay|ETbho)M&h01 zTUuSurL2DqY1$-&3`Na`o-E(N_Iw95R3P%4qjGt6{^I4Cx#;1-^u$zDo4q_25175uu1w5N zUZ7s++%%`AFHO%+n-Hc;mYVR2?8@tx9!83u7u8lIkPuWu7|rr>Y|6D&RW$O~wYb!OBT#t`< z?h5Zn5NWtASX-dQz-cJ?VVDQXu`C0>M~(^h+T7(C>{7Uv=U%fG;aIZ`Slo||`N&I^ zx#e*2-*isWUYMVsWf!7hon`7SoRa|dzDsR7uslE za#y*pcBq1vY4)y&X)Wf!la-gW4NenT(Y%)9xRJ-RSjf)WaBlQ={FfBk6Emz@Snl-| zG(;hS&X_5?=v%on;99@HouZ3m$XL7i1BAHjq}XvAeq zT({h?BNZHTm5YvdP#o!OV38v|aRwDdAj&g~R9pg>LKQv`w4L>%kXIl1`{gGi@=j;MxMpsI%m;L9rI8`pd}+HWF?!wG{)&h zN9pK3OH=^LD1KC}u-rQ>T!2kZu*I710L$2BP4WloH{t|Xi(8eRy}A?`&s&~^E%HiU z!DSWHW81ImuIG^;ZlwZiLUOOcoS^Pg@Z)j#i;+az+d2K5%C~t&yHE}xJ!X3@f|=4r z6eNZVRbI&z*u@f?r(~XI!&#avi_o{i8`&IQcSUSC!NZzBKHN?DH0Wedj(th~l#(^?#;D z-Bsm1If#jVec)vB_kFJn%=FN7+N`4K43%!0?&xb;2?TphclC&H&p~UJ10FvY^JW;R zZMI&b{69-h-#+^G(a7dSb~)z93=pWb4_8(Q-;Rxjj2l`j948@y1oF${av_?ol?29H z{SjNgsVhtXv;<4Bj|w`HO2RM(i#^mrkWs}rbv=&)*g2@}dHTas>qj;-r#DK?%;{VG zs5Mikx6rNGokJNOI!Jf{54(}z;_yYsE}$TB?b8?nK8q99W5&S~WQT!>qDb*IsO4rN zvVc-PojcpQe;Rc`1$_pP2T?%x`$_lTUAH$g`HeSFG*fx;b#&cd?dQ;Q9ZFvAHVWG4 zqE8Cj=iHFYt}Z$gml9p3Nm(mh4jS_X6`~)Lhd!ERkc8s+3`)O)lPEgu2O$xORTt?G zi92NN3@JIdTEOCb%7!i3nJB1M1Ie8>B>{mZD#VHu>5CmFMVc*Jt8O52Uyh&d+p(SV ztrXE~q?|NlkA;fj`ZKVZ>_*MAXb@DqNj+Hfk8wdWBGX9d; z|KUsPW1E@W#)~MLsayo34h--j1qKzzzk|wd?_EO-cM|w?l8k*gX?@ZK6r!7t*@gcP z&-st$8(&KHNWnEiU@%2yXr<_5hYDbzH!6itb`TWkqdbyA4S6I^B;TNRDwgn*-$a36 z_8bK>ps<-ayD@(&wV65lF;dCdX6kGN#`r5726v?rhKJo?+(jyGcSG^YS4jNAU!0yG zBqpo1P$;;m1R7Hq)v%kw90pzl6|4BQDU3p%qA+6{Q_alSjq{tCv1V%Qi{tLk-MFKJ z_E#~m{ox2Xmp+ew?$4@E5c2wPJhsc**c0C(Q1wveZxi0A_~}l(onD{Z%$(YAnwe8K zN~kqcryjuF9)dFet$k{WzU4e-q&-1u?{~PzL$1<|*hP7ckjAO_6=}SiD8IZux0yM% z0p~u}OdV6o&gnC`#LP@C(;8SI>1fcI;%h~iFC*Y&?A2KCfGpV9PZ@Ai-A6Z)2^XY`lvzA&VZ+M|}Q2{##rG diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index 1458c0d3d2a58114015e7b6a60eaf1e93c4c2563..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13920 zcmdrzTWlNGl{0*cZ;F&C$&x*K*b-$)v}9Xx+{lh%Ieu)Sq_&beYO*Y?8C#?&Qob{? zEtX8(B0woOyOt2_O5U^x)6F6>5}@u^oUf)Rux-(gil$mJQ+HQIvmXKW!?9en@JF%d z+~JTSMdi^h7U*7?XYQQ)KIh(Z&YXMv3!BZ%Ksx;A^!ZnjXzdq<

E@>#^;H@WG2GJ89|i9zTk{BX?}TQ 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 ZddNThfPu#Y=d)V2b^gpB7<^J{{}1C(Wgq|m diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-312.pyc deleted file mode 100644 index 2acfb2e44db7bba833056a37f1077021e759272c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 919 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc deleted file mode 100644 index bdfd4bad55da00c5281ba0b2f19eef541e8e9760..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7044 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/help.cpython-312.pyc deleted file mode 100644 index dc59b24f2c6d381fc8c525ad4b7888d88ee8a576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4309 zcmbUkTWk~A^^Rw3j~|JXIJOfW$v6oZ6JoPud59vmYzZlBNK(S1>mSSU49O(+jC*Gs zaMqDh)Jn8kX;pP4kje*0D=if(mCt?_Y5)3TCsZ~As7T9x&@V5c(u%58&%HBa3=7?* z*Pi=0_q^`8_nvd^U)$Qe2+Di^xjq*QAoLX(*oCt?8;_xL1&JtyL`HPvm=r@>N6JB4 zHpSAGOL5S$IcMILaxny#gT6cEhQ3pD<@mfO<%PZ@<@1nPH_ZA|eg@GIpKH$tQUOZm z$aSPTD9_GRr|9_=N_B}|sDq*p>TW3{`WJT~gn0*&x^G!(GN|MzIR=r`HiWQ~%JF}Q zK2Bah7ugTd1;(23(3t>e(FtD%V7y~v#M_o*CsnbSlZ33Q=owj&l{sOyI45AKpkiH^ zmvRLO@6h6jCq(FEoH00AR5H-Ii#V5)XGfnfFacv#=z0nz zwIC^)mdje2)5Zxk3*W|e2eGzJ_|UQd<5!El<`q;1OHx~eS}5$DYawe=Fv{P7#zAR5 z6WIlK3zF50?4iuSjr==d(hEn*!gE6n#u>oW0LYmr;r59ei8 zbS{Ki;by=5e{h_0+_H9Pg;Dl_MO|;X3tNE3{gyNikzZlTsLY6-YmONd_h#;a5~n1+ zh!r6th;mjJF39@4pwCOfbV;9A6+zAya#CJ`Z)Qr_WQ!Pslw3)`MTK0Pgm6s7f^;!M6xbzz?4MXFjV9jNofs8l zqHHb)my766nS2x@!ea-8n1vhLCB!Th2-KvEtyrp`o|iS@d{N2LrCm_*q9)8rn%*jm zEO@#!T{#FJN^xGn*?>*`g|GN(^)YHo|#O{e)>i=pDzZV(Jcy zDuT8WFk1pa@|GD4x_x5pezixWd(yHD_G_~T1n8q;XE%ZnVf+Pm#L)TeW9Y^KBFuu>IEh4FgRjP z!);kG?lX8>gb^yx<)vRfA4af|GL=xXnpd*DGdUW*>6Mh~n<4_5iUx+ijV z-pALe(eKd?Qug$nD6Q z??8Q9?DKOs&ec0(Uj%FM!`1lVTKt1*{DVrz#0Klw-d^<&G+fBrbM?TQXYe(89a{6m zUI9Of?gVj?m_(w(KgqL5~3&Qzp^KKZ6F5 z?y_N!f$=2If*;*=$g=+3%(A@8+s7qE!Wo^oQPaPW&_w)TrX}4SY9q8pNn{GZ!;@OaRH# zG)Yf`H_K;o^0I_U!Zrm7+sw=aCW#d$8I#fV8bp56>7 z2x5o54U|b|t36B<4@sA47efM%jKGU6p-_!D0+N-O1q%d;qo?FO=)Mo1CPL1$iW;29 z>3tmTyQ2P1T@S||MEYxySTzz`kHo)mvc2BRZO^*V=AG-ChAUj8-o5qOgk=r<55?r z);V1599}(9j|jJyEBjAgPu*s2Ojc&jRKjOhr$CR;Kz-9lJ-qF~=AoNME1P#e7#hB* zU!SUn2J69o^6%SQ?}^ttdLQ{icOx<29rAwD8}PdtDByH``)rIs{@_!@IlYg<{UC)} z?ze3X79h{HPO$c+_|YEpWl#IjIQ!)e2I?#Tn}r-xa^g15Le=_c(Fv561#)LzDSGqK zVFv;7*!zODUEM9%VN&2p$Hkq?@o7jA_0mWI%ZiyykvADV6p)(GtX30F%uG!tPCp^Z z1NaS(2Jf}>q6A5cOIAckOef=<;iMcOA<AM5`+H&R03p~o_a_3>T#G^9j^x? qmnIr+fIZiU;x}DKy3wCpN22IXxBEyRduJ;{>ZtEXlD(5)p#CqF2p|{$ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc deleted file mode 100644 index af0a09eb016ae0189ffe8f4b992fbe50e2e871d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1049 zcmY*YL2DaF6rR~#S@uef6W2C4)G*Mx$r`GqF7+Xll!8s_8f=JtCYzXn3D^~XSP-|5{3=LiL869u@0H*sJ*L7PTkf;AhKliB~v7VP^yCY3Cd z!>}UlAO9z|y;0_p?1sT!m61q|H`^89FjL3#mY`0+B zU)L$G(jBOg2JYGR_O@U$3Tu*WZ{M>C$OaT0V5G!qOi;xFQWW7Xp`>5AU?;a3=u=8{}}=a$1==02*|S>Oh&?keCcsz|p0Np-i%cigC<%30LQs=O2tSvYPCRO;5X(D_Gq|H(PWv+bqM{K4{z zoO5b9|G^?H2p`x}maiW@kRfn#puHBDBNXEwu!QGv)Wk7gb3{d;r&acIbs~JDNwlu zriEVRZ~e5=dDvR&=5IY)K3MMfKd-iyUS{*>x$({y$8&$@X1kNOI}h4R-HGW-WRBcv zFTR|fIp$~6^M5RWX@A=tn?4(x?SA;lFC!OONVphA`N>mjq6Y_{RmV!Qo)?6^=Ly}! zwBzY5{zT#f4d`254S#w4)7=;Pa=J-!2F!(tF@9s%*t(cP_C!11%3Ka%JlDIC!;|Uu Ecj)#WhyVZp diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/models.cpython-312.pyc deleted file mode 100644 index f52b691c1d75f97f231fc08019c2d0832b76b65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35445 zcmdVD3v?UTnI>3;7x5wikObe4;!6@J5_(#esD~|)qAg3JWQn$8+Gz?RKnW56GF6~t zGN2>7v)y2#L{!|sXU4BNW{F$-tUO(_#BA|`zJj>D&mMR5IpWSfXWZ52 zV%MxOcf7E#kmYT$qPVBe!}0|&Z`{}CL*5>C#ERo3eI@bIzEXDXjQQhbePt}~ij~JJ z`YPg;eUs2*Y>StWuDl&c%Uy3Z|!T1ukTwQZ|iG|xA(QjgMC4E-HYp$eH&Qbhy2FA zjVxb`ysK{$%aXhieDE*Fprshz3 zQO)bWDE+>ErshyOspj?HL2KWEa7EuU;mW>);i|qvChjRNT>Wh>T=Ong0UdpZSy?U0 z>a?;RR#uNPA=2}%S*dx1l{TQXF>)B?7Nz_sD{n%1v)011qozR1*a@c?`Nl{@N=m`_ zP&g8koUg7toX+0UQAxnXkyu0+7)m5V(S#%&E8b^e;V&=cTurOzd#k>TMXF&POT8IFjdWOOJIu;yG{kpVn;zbFogx#B}Z1MI@l zkSHl-g-6Aq?xMO!f~BiSckK8Nx*e3ZzK?h#31dk6s2$Id5{PKYFUB82AnxR+8sFCFTY+t>rpg0D!+ONb0rT4MlV-%3aeh~AB^Mqq2y@+t5--4 z2_sS@_<-N=fPW#Ds^Zp@i!8Cix=D`&$Vk0io5D?q6@ioH7&CD3M(BC$cSgDUgG z;!gaEyOBs%Bmx}|UfghcC?45x=G?hRctbdHZbK3vV)(4IA$Ts5IJW_yV8ife^7K$* zOK{WX4Or@t_TkXL+0dzov|%_pyrCb}!b9Q)T8jk4H^@LdI6RuOQ_l#tjn(Fx`Jj6F zIqFda$pvo7&Ut)k^Bs5TWbc))UH;mfyDrV&_INLyn>d%YeC8?1mXxKtZrfd#oDt`-+*6q3U%)~R3(#0ccc4XdNd)wo?bbjLer1afX#$LUQ2XQM_ zodX4I)%{bfr7N6q#U-^Bm(y7R&f{i z^*`jem+{nb)418t6LXSLZB$)-g5)+l*^HH_^i{%&KSk@^jMn>JDKM$zHH$x{x=pbNidro zDNvg4S=C-0=V;smwz2=jKndu8kO&A0a48AVgb)&jqmhA#Ff=F-nhiRgY^fu8AsUMb z(#QZHsx&wfi;W60Vly^y{&XaPb4iMXg^+~C2z3cVB60*Q(W=(m=Jw>sa4aGPg(E

`73oowESo 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-312.pyc deleted file mode 100644 index f0ab9e2fa9f5a25435c1eb311e4669aa239dcd9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmZuvzi-n(7`?NdxHxGEv{3_6QCkF}13p0;#88!?Pzs?H8zP~JLhhq+;yT9X1d<8F z5~N7L)D5K*p#A~yCx94m8X<*aWMb=&Ed%1L#!`pgaDLzW?!E7QlD`iRYe<|M|Jv)H zC4~O?MR39caL^ZE6H!F5iPDHlH_@7dP#RMia6|Ocl7v78X&WCZM5SyG#DM1o5=;nC zDLNpJd;*Q|ToO(ys34UuA;jXKmQEdcIDjBg#h)4I7;a5~D*R7SIp8Qhi_+Th^FTc# z)W`Q|2sGc@PuyBoP|H7^!1S32msy>0b-?i0p%!Q^V6(o6GUASt;aA z#ud|GE>|}yv}yw5vH)CTZr*X(Gs7)%*#wJ^R4vCsKuWb5 zP(qd4%S+z+DtD5ppBL}-CMLH=+u82a zoHv#9CayJCdn@;UWWHs*hmSfdYt6+ssn;nlasA6eCvj&ddUsFt9rq%B6lYXK{0|V; B&#nLf diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc deleted file mode 100644 index 6f6646f450d49be5bcdf36f7a266468167b7ff34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27754 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-312.pyc deleted file mode 100644 index f6e267c79c2b0c7fa2c401d6a075c5712dcb4ab7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5614 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 00640becc23a113f9c9b62a55a46a60c49e0b7ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36266 zcmc(|3wTpko+o&(-cL(@$xn>1!4L2QV<2E&@e>GO5^VBt9**#pK}MFGD;cmNCk|hA zm0h71(a9EKLTy~z`KFw$^c2-oHI?b<*~zQ6duMlhCFG1175xo0lir@%{k~lX(qGb4 z@Am%w=RPDGLDJt$?_Th^N9Ue%?z!il^MC*U_kXh6EgX&m|IfndpI_v-|42WS!z5?! z4r@8?DkpHmoWKhjKR?W~vu0Ss&e~xuJL`sZ?5rQwv$J8?z|O{DBRiXhP3&wQHnX#3 z*uu`%VJpsBziq-kZ0G47I)A~0W7sj_9CqTjUNHCzCyIuPSl;L_o+utJW_gppWTJGq zbiy_4nkXACne&2E6Pt%Ov%KBEWukewd7@>wWukSs zb)s#!jg=Spw@$PVws%WE1Jv+b0eP=2a8* zD^wxfBUB^ZD;yHmeTN_3C)D8AeqlY*176MetkOPv7Tn+A)aU6EHlSv=P>Zxjs6*N- zY((0J{x+e%exV+}4hjuO4+)J(4+~959}_ksJtAyDdQ@medQ50RI)JA#NS}PbICtcX^C@8`YCbI-79PQ4f}$DkUML~BbTTzDNu9M?eoGHK(8On~$3?*_;t71C;U-PSHsLwz z9XaFmpfHp%PkO|VcVtTR|CZJxs_RF+VmS0J+Kr5yLlty3GSZ~Wl#Lwf>+0=0G4f>B z(Zju6L&r}Hj&wgW)R%GPxiC0%B2#!@{fsjl90_>BzH{D@P+0T@PB$4c#$%qzNn|sY zQ=Sm!kcu<gyH^CRBCIiDB|On3v~jNKOqdry1Ck?{1SH-rap zNRM|zf71M)@88M>B>I zcK+?-cxAqSg%^kSs-p+a=qU|FG|ldauKBsp<{_F8&*-RkGK?o34GI`hL@sDi3Nm_( zp<~;q43TKza0dJVZ*X@xK&GplnczC-=Vo{_7v;yXU)CNdr8a90L90Nv8BN%%Ttr=~ zlFy!_8bPPj7I+2~<@b2GlFOcdLT?L4h`%&WW7l!hnmR5l;}wqE$cb8>dj_TFxeMB7xbr-&+N3rd z7cNk8W19PGHWdtr)KPzA&tPyYd>%0BxnsUjF&M(H=bpj>4xSG^*E1!G*pW|4K;yZ? z*q0*Kse8~H4rAGcGSkp24{QK|mtwRybbFCSE zb41g+`5u3u$(}J_iHhFS8SCMR$)Ff!8zo~rKIsh{@lFHQ9O-*zr03*`6MX|iBPR#@ zPGq!z3mMxJQ(kfUNsoWZ+jjxg2c>ovsf0FLMjx647|s|)@1)-|>dk0GZ$>}i36Gx1 z@P`4PbZ3G92V3#<87F}ndZg?VF;JpB5&NM$QAP&{77o##aI@py(`{#h6W+G*bLYH5 zo8UdyMinN{hT2-s0id<{eW%(cr^9E0fsWSpZEe{2-j+$v=vmKcZ>Vk3H`xYojENT8 z6lBxJkWK64bf%QuS%z;Tm?nTdaa!!by^rEA1hR^o`9exowMIA z*>Hz5nXBh|(~jcU^i795UF?brR}OquwLV>3c6INSy$jlfld0k@sPVwxL#g7;bG^45 zg_kePUx@4C!aLnR?)_2kr;eu2%Bofh(f>*j=PdpD%L5q69ga6we1^ejasJ(xL; z^~!`}-fN7`%jcefkK zRW7VTPKBZptzo*(jwq)V!wx*hRaUb#_dTO^wQy>!XV#y?3a3h)JzO-?+ z+9hkP_N|2RB>y<)_NCpxK)#?LjjxA{mA4_Y81#v0hFRM%8jd2 zOMOU(GVwE9lp6#-jI>D;8ghFAZfW0wLJAQv6&Urp30Z@(@rcvzsY$^T_O@p9*l-ge zU{d25PskGvi{e3a4gARqIZv8#QqvI-GD=_KW2hFzU#JEN9^1f~9CI(l8kUTeX`B7> z!TE!)AD-iHTWzz4#6DD6_0Y5)*h4P@z!H}>1MUpCQe9Dac#Zn-wtTB`i1YHg8-1
o8Xr^2jF!>I=MnBQ}n)x(&mT2rfAV%9vhCP0I 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 QfbZh();jn>o?+_$7f}7~%K!iX diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py deleted file mode 100644 index 5063c3f..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -# .-. .-. .-. . . .-. .-. .-. .-. -# |( |- |.| | | |- `-. | `-. -# ' ' `-' `-`.`-' `-' `-' ' `-' - -__title__ = "requests" -__description__ = "Python HTTP for Humans." -__url__ = "https://requests.readthedocs.io" -__version__ = "2.31.0" -__build__ = 0x023100 -__author__ = "Kenneth Reitz" -__author_email__ = "me@kennethreitz.org" -__license__ = "Apache 2.0" -__copyright__ = "Copyright Kenneth Reitz" -__cake__ = "\u2728 \U0001f370 \u2728" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py deleted file mode 100644 index f2cf635..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -requests._internal_utils -~~~~~~~~~~~~~~ - -Provides utility functions that are consumed internally by Requests -which depend on extremely few external helpers (such as compat) -""" -import re - -from .compat import builtin_str - -_VALID_HEADER_NAME_RE_BYTE = re.compile(rb"^[^:\s][^:\r\n]*$") -_VALID_HEADER_NAME_RE_STR = re.compile(r"^[^:\s][^:\r\n]*$") -_VALID_HEADER_VALUE_RE_BYTE = re.compile(rb"^\S[^\r\n]*$|^$") -_VALID_HEADER_VALUE_RE_STR = re.compile(r"^\S[^\r\n]*$|^$") - -_HEADER_VALIDATORS_STR = (_VALID_HEADER_NAME_RE_STR, _VALID_HEADER_VALUE_RE_STR) -_HEADER_VALIDATORS_BYTE = (_VALID_HEADER_NAME_RE_BYTE, _VALID_HEADER_VALUE_RE_BYTE) -HEADER_VALIDATORS = { - bytes: _HEADER_VALIDATORS_BYTE, - str: _HEADER_VALIDATORS_STR, -} - - -def to_native_string(string, encoding="ascii"): - """Given a string object, regardless of type, returns a representation of - that string in the native string type, encoding and decoding where - necessary. This assumes ASCII unless told otherwise. - """ - if isinstance(string, builtin_str): - out = string - else: - out = string.decode(encoding) - - return out - - -def unicode_is_ascii(u_string): - """Determine if unicode string only contains ASCII characters. - - :param str u_string: unicode string to check. Must be unicode - and not Python 2 `str`. - :rtype: bool - """ - assert isinstance(u_string, str) - try: - u_string.encode("ascii") - return True - except UnicodeEncodeError: - return False diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py deleted file mode 100644 index 10c1767..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py +++ /dev/null @@ -1,538 +0,0 @@ -""" -requests.adapters -~~~~~~~~~~~~~~~~~ - -This module contains the transport adapters that Requests uses to define -and maintain connections. -""" - -import os.path -import socket # noqa: F401 - -from pip._vendor.urllib3.exceptions import ClosedPoolError, ConnectTimeoutError -from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError -from pip._vendor.urllib3.exceptions import InvalidHeader as _InvalidHeader -from pip._vendor.urllib3.exceptions import ( - LocationValueError, - MaxRetryError, - NewConnectionError, - ProtocolError, -) -from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError -from pip._vendor.urllib3.exceptions import ReadTimeoutError, ResponseError -from pip._vendor.urllib3.exceptions import SSLError as _SSLError -from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url -from pip._vendor.urllib3.util import Timeout as TimeoutSauce -from pip._vendor.urllib3.util import parse_url -from pip._vendor.urllib3.util.retry import Retry - -from .auth import _basic_auth_str -from .compat import basestring, urlparse -from .cookies import extract_cookies_to_jar -from .exceptions import ( - ConnectionError, - ConnectTimeout, - InvalidHeader, - InvalidProxyURL, - InvalidSchema, - InvalidURL, - ProxyError, - ReadTimeout, - RetryError, - SSLError, -) -from .models import Response -from .structures import CaseInsensitiveDict -from .utils import ( - DEFAULT_CA_BUNDLE_PATH, - extract_zipped_paths, - get_auth_from_url, - get_encoding_from_headers, - prepend_scheme_if_needed, - select_proxy, - urldefragauth, -) - -try: - from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager -except ImportError: - - def SOCKSProxyManager(*args, **kwargs): - raise InvalidSchema("Missing dependencies for SOCKS support.") - - -DEFAULT_POOLBLOCK = False -DEFAULT_POOLSIZE = 10 -DEFAULT_RETRIES = 0 -DEFAULT_POOL_TIMEOUT = None - - -class BaseAdapter: - """The Base Transport Adapter""" - - def __init__(self): - super().__init__() - - def send( - self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None - ): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest ` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - """ - raise NotImplementedError - - def close(self): - """Cleans up adapter specific items.""" - raise NotImplementedError - - -class HTTPAdapter(BaseAdapter): - """The built-in HTTP Adapter for urllib3. - - Provides a general-case interface for Requests sessions to contact HTTP and - HTTPS urls by implementing the Transport Adapter interface. This class will - usually be created by the :class:`Session ` class under the - covers. - - :param pool_connections: The number of urllib3 connection pools to cache. - :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection - should attempt. Note, this applies only to failed DNS lookups, socket - connections and connection timeouts, never to requests where data has - made it to the server. By default, Requests does not retry failed - connections. If you need granular control over the conditions under - which we retry a request, import urllib3's ``Retry`` class and pass - that instead. - :param pool_block: Whether the connection pool should block for connections. - - Usage:: - - >>> import requests - >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter(max_retries=3) - >>> s.mount('http://', a) - """ - - __attrs__ = [ - "max_retries", - "config", - "_pool_connections", - "_pool_maxsize", - "_pool_block", - ] - - def __init__( - self, - pool_connections=DEFAULT_POOLSIZE, - pool_maxsize=DEFAULT_POOLSIZE, - max_retries=DEFAULT_RETRIES, - pool_block=DEFAULT_POOLBLOCK, - ): - if max_retries == DEFAULT_RETRIES: - self.max_retries = Retry(0, read=False) - else: - self.max_retries = Retry.from_int(max_retries) - self.config = {} - self.proxy_manager = {} - - super().__init__() - - self._pool_connections = pool_connections - self._pool_maxsize = pool_maxsize - self._pool_block = pool_block - - self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) - - def __getstate__(self): - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - # Can't handle by adding 'proxy_manager' to self.__attrs__ because - # self.poolmanager uses a lambda function, which isn't pickleable. - self.proxy_manager = {} - self.config = {} - - for attr, value in state.items(): - setattr(self, attr, value) - - self.init_poolmanager( - self._pool_connections, self._pool_maxsize, block=self._pool_block - ) - - def init_poolmanager( - self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs - ): - """Initializes a urllib3 PoolManager. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param connections: The number of urllib3 connection pools to cache. - :param maxsize: The maximum number of connections to save in the pool. - :param block: Block when no free connections are available. - :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. - """ - # save these values for pickling - self._pool_connections = connections - self._pool_maxsize = maxsize - self._pool_block = block - - self.poolmanager = PoolManager( - num_pools=connections, - maxsize=maxsize, - block=block, - **pool_kwargs, - ) - - def proxy_manager_for(self, proxy, **proxy_kwargs): - """Return urllib3 ProxyManager for the given proxy. - - This method should not be called from user code, and is only - exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param proxy: The proxy to return a urllib3 ProxyManager for. - :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. - :returns: ProxyManager - :rtype: urllib3.ProxyManager - """ - if proxy in self.proxy_manager: - manager = self.proxy_manager[proxy] - elif proxy.lower().startswith("socks"): - username, password = get_auth_from_url(proxy) - manager = self.proxy_manager[proxy] = SOCKSProxyManager( - proxy, - username=username, - password=password, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs, - ) - else: - proxy_headers = self.proxy_headers(proxy) - manager = self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers, - num_pools=self._pool_connections, - maxsize=self._pool_maxsize, - block=self._pool_block, - **proxy_kwargs, - ) - - return manager - - def cert_verify(self, conn, url, verify, cert): - """Verify a SSL certificate. This method should not be called from user - code, and is only exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param conn: The urllib3 connection object associated with the cert. - :param url: The requested URL. - :param verify: Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use - :param cert: The SSL certificate to verify. - """ - if url.lower().startswith("https") and verify: - - cert_loc = None - - # Allow self-specified cert location. - if verify is not True: - cert_loc = verify - - if not cert_loc: - cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) - - if not cert_loc or not os.path.exists(cert_loc): - raise OSError( - f"Could not find a suitable TLS CA certificate bundle, " - f"invalid path: {cert_loc}" - ) - - conn.cert_reqs = "CERT_REQUIRED" - - if not os.path.isdir(cert_loc): - conn.ca_certs = cert_loc - else: - conn.ca_cert_dir = cert_loc - else: - conn.cert_reqs = "CERT_NONE" - conn.ca_certs = None - conn.ca_cert_dir = None - - if cert: - if not isinstance(cert, basestring): - conn.cert_file = cert[0] - conn.key_file = cert[1] - else: - conn.cert_file = cert - conn.key_file = None - if conn.cert_file and not os.path.exists(conn.cert_file): - raise OSError( - f"Could not find the TLS certificate file, " - f"invalid path: {conn.cert_file}" - ) - if conn.key_file and not os.path.exists(conn.key_file): - raise OSError( - f"Could not find the TLS key file, invalid path: {conn.key_file}" - ) - - def build_response(self, req, resp): - """Builds a :class:`Response ` object from a urllib3 - response. This should not be called from user code, and is only exposed - for use when subclassing the - :class:`HTTPAdapter ` - - :param req: The :class:`PreparedRequest ` used to generate the response. - :param resp: The urllib3 response object. - :rtype: requests.Response - """ - response = Response() - - # Fallback to None if there's no status_code, for whatever reason. - response.status_code = getattr(resp, "status", None) - - # Make headers case-insensitive. - response.headers = CaseInsensitiveDict(getattr(resp, "headers", {})) - - # Set encoding. - response.encoding = get_encoding_from_headers(response.headers) - response.raw = resp - response.reason = response.raw.reason - - if isinstance(req.url, bytes): - response.url = req.url.decode("utf-8") - else: - response.url = req.url - - # Add new cookies from the server. - extract_cookies_to_jar(response.cookies, req, resp) - - # Give the Response some context. - response.request = req - response.connection = self - - return response - - def get_connection(self, url, proxies=None): - """Returns a urllib3 connection for the given URL. This should not be - called from user code, and is only exposed for use when subclassing the - :class:`HTTPAdapter `. - - :param url: The URL to connect to. - :param proxies: (optional) A Requests-style dictionary of proxies used on this request. - :rtype: urllib3.ConnectionPool - """ - proxy = select_proxy(url, proxies) - - if proxy: - proxy = prepend_scheme_if_needed(proxy, "http") - proxy_url = parse_url(proxy) - if not proxy_url.host: - raise InvalidProxyURL( - "Please check proxy URL. It is malformed " - "and could be missing the host." - ) - proxy_manager = self.proxy_manager_for(proxy) - conn = proxy_manager.connection_from_url(url) - else: - # Only scheme should be lower case - parsed = urlparse(url) - url = parsed.geturl() - conn = self.poolmanager.connection_from_url(url) - - return conn - - def close(self): - """Disposes of any internal state. - - Currently, this closes the PoolManager and any active ProxyManager, - which closes any pooled connections. - """ - self.poolmanager.clear() - for proxy in self.proxy_manager.values(): - proxy.clear() - - def request_url(self, request, proxies): - """Obtain the url to use when making the final request. - - If the message is being sent through a HTTP proxy, the full URL has to - be used. Otherwise, we should only use the path portion of the URL. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param request: The :class:`PreparedRequest ` being sent. - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. - :rtype: str - """ - proxy = select_proxy(request.url, proxies) - scheme = urlparse(request.url).scheme - - is_proxied_http_request = proxy and scheme != "https" - using_socks_proxy = False - if proxy: - proxy_scheme = urlparse(proxy).scheme.lower() - using_socks_proxy = proxy_scheme.startswith("socks") - - url = request.path_url - if is_proxied_http_request and not using_socks_proxy: - url = urldefragauth(request.url) - - return url - - def add_headers(self, request, **kwargs): - """Add any headers needed by the connection. As of v2.0 this does - nothing by default, but is left for overriding by users that subclass - the :class:`HTTPAdapter `. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param request: The :class:`PreparedRequest ` to add headers to. - :param kwargs: The keyword arguments from the call to send(). - """ - pass - - def proxy_headers(self, proxy): - """Returns a dictionary of the headers to add to any request sent - through a proxy. This works with urllib3 magic to ensure that they are - correctly sent to the proxy, rather than in a tunnelled request if - CONNECT is being used. - - This should not be called from user code, and is only exposed for use - when subclassing the - :class:`HTTPAdapter `. - - :param proxy: The url of the proxy being used for this request. - :rtype: dict - """ - headers = {} - username, password = get_auth_from_url(proxy) - - if username: - headers["Proxy-Authorization"] = _basic_auth_str(username, password) - - return headers - - def send( - self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None - ): - """Sends PreparedRequest object. Returns Response object. - - :param request: The :class:`PreparedRequest ` being sent. - :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple or urllib3 Timeout object - :param verify: (optional) Either a boolean, in which case it controls whether - we verify the server's TLS certificate, or a string, in which case it - must be a path to a CA bundle to use - :param cert: (optional) Any user-provided SSL certificate to be trusted. - :param proxies: (optional) The proxies dictionary to apply to the request. - :rtype: requests.Response - """ - - try: - conn = self.get_connection(request.url, proxies) - except LocationValueError as e: - raise InvalidURL(e, request=request) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers( - request, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - ) - - chunked = not (request.body is None or "Content-Length" in request.headers) - - if isinstance(timeout, tuple): - try: - connect, read = timeout - timeout = TimeoutSauce(connect=connect, read=read) - except ValueError: - raise ValueError( - f"Invalid timeout {timeout}. Pass a (connect, read) timeout tuple, " - f"or a single float to set both timeouts to the same value." - ) - elif isinstance(timeout, TimeoutSauce): - pass - else: - timeout = TimeoutSauce(connect=timeout, read=timeout) - - try: - resp = conn.urlopen( - method=request.method, - url=url, - body=request.body, - headers=request.headers, - redirect=False, - assert_same_host=False, - preload_content=False, - decode_content=False, - retries=self.max_retries, - timeout=timeout, - chunked=chunked, - ) - - except (ProtocolError, OSError) as err: - raise ConnectionError(err, request=request) - - except MaxRetryError as e: - if isinstance(e.reason, ConnectTimeoutError): - # TODO: Remove this in 3.0.0: see #2811 - if not isinstance(e.reason, NewConnectionError): - raise ConnectTimeout(e, request=request) - - if isinstance(e.reason, ResponseError): - raise RetryError(e, request=request) - - if isinstance(e.reason, _ProxyError): - raise ProxyError(e, request=request) - - if isinstance(e.reason, _SSLError): - # This branch is for urllib3 v1.22 and later. - raise SSLError(e, request=request) - - raise ConnectionError(e, request=request) - - except ClosedPoolError as e: - raise ConnectionError(e, request=request) - - except _ProxyError as e: - raise ProxyError(e) - - except (_SSLError, _HTTPError) as e: - if isinstance(e, _SSLError): - # This branch is for urllib3 versions earlier than v1.22 - raise SSLError(e, request=request) - elif isinstance(e, ReadTimeoutError): - raise ReadTimeout(e, request=request) - elif isinstance(e, _InvalidHeader): - raise InvalidHeader(e, request=request) - else: - raise - - return self.build_response(request, resp) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py deleted file mode 100644 index cd0b3ee..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py +++ /dev/null @@ -1,157 +0,0 @@ -""" -requests.api -~~~~~~~~~~~~ - -This module implements the Requests API. - -:copyright: (c) 2012 by Kenneth Reitz. -:license: Apache2, see LICENSE for more details. -""" - -from . import sessions - - -def request(method, url, **kwargs): - """Constructs and sends a :class:`Request `. - - :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the query string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. - ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` - or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string - defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers - to add for the file. - :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How many seconds to wait for the server to send data - before giving up, as a float, or a :ref:`(connect timeout, read - timeout) ` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. - :param stream: (optional) if ``False``, the response content will be immediately downloaded. - :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. - :return: :class:`Response ` object - :rtype: requests.Response - - Usage:: - - >>> import requests - >>> req = requests.request('GET', 'https://httpbin.org/get') - >>> req - - """ - - # By using the 'with' statement we are sure the session is closed, thus we - # avoid leaving sockets open which can trigger a ResourceWarning in some - # cases, and look like a memory leak in others. - with sessions.Session() as session: - return session.request(method=method, url=url, **kwargs) - - -def get(url, params=None, **kwargs): - r"""Sends a GET request. - - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary, list of tuples or bytes to send - in the query string for the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("get", url, params=params, **kwargs) - - -def options(url, **kwargs): - r"""Sends an OPTIONS request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("options", url, **kwargs) - - -def head(url, **kwargs): - r"""Sends a HEAD request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. If - `allow_redirects` is not provided, it will be set to `False` (as - opposed to the default :meth:`request` behavior). - :return: :class:`Response ` object - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", False) - return request("head", url, **kwargs) - - -def post(url, data=None, json=None, **kwargs): - r"""Sends a POST request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("post", url, data=data, json=json, **kwargs) - - -def put(url, data=None, **kwargs): - r"""Sends a PUT request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("put", url, data=data, **kwargs) - - -def patch(url, data=None, **kwargs): - r"""Sends a PATCH request. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("patch", url, data=data, **kwargs) - - -def delete(url, **kwargs): - r"""Sends a DELETE request. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :return: :class:`Response ` object - :rtype: requests.Response - """ - - return request("delete", url, **kwargs) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py deleted file mode 100644 index 9733686..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py +++ /dev/null @@ -1,315 +0,0 @@ -""" -requests.auth -~~~~~~~~~~~~~ - -This module contains the authentication handlers for Requests. -""" - -import hashlib -import os -import re -import threading -import time -import warnings -from base64 import b64encode - -from ._internal_utils import to_native_string -from .compat import basestring, str, urlparse -from .cookies import extract_cookies_to_jar -from .utils import parse_dict_header - -CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded" -CONTENT_TYPE_MULTI_PART = "multipart/form-data" - - -def _basic_auth_str(username, password): - """Returns a Basic Auth string.""" - - # "I want us to put a big-ol' comment on top of it that - # says that this behaviour is dumb but we need to preserve - # it because people are relying on it." - # - Lukasa - # - # These are here solely to maintain backwards compatibility - # for things like ints. This will be removed in 3.0.0. - if not isinstance(username, basestring): - warnings.warn( - "Non-string usernames will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(username), - category=DeprecationWarning, - ) - username = str(username) - - if not isinstance(password, basestring): - warnings.warn( - "Non-string passwords will no longer be supported in Requests " - "3.0.0. Please convert the object you've passed in ({!r}) to " - "a string or bytes object in the near future to avoid " - "problems.".format(type(password)), - category=DeprecationWarning, - ) - password = str(password) - # -- End Removal -- - - if isinstance(username, str): - username = username.encode("latin1") - - if isinstance(password, str): - password = password.encode("latin1") - - authstr = "Basic " + to_native_string( - b64encode(b":".join((username, password))).strip() - ) - - return authstr - - -class AuthBase: - """Base class that all auth implementations derive from""" - - def __call__(self, r): - raise NotImplementedError("Auth hooks must be callable.") - - -class HTTPBasicAuth(AuthBase): - """Attaches HTTP Basic Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - - def __eq__(self, other): - return all( - [ - self.username == getattr(other, "username", None), - self.password == getattr(other, "password", None), - ] - ) - - def __ne__(self, other): - return not self == other - - def __call__(self, r): - r.headers["Authorization"] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPProxyAuth(HTTPBasicAuth): - """Attaches HTTP Proxy Authentication to a given Request object.""" - - def __call__(self, r): - r.headers["Proxy-Authorization"] = _basic_auth_str(self.username, self.password) - return r - - -class HTTPDigestAuth(AuthBase): - """Attaches HTTP Digest Authentication to the given Request object.""" - - def __init__(self, username, password): - self.username = username - self.password = password - # Keep state in per-thread local storage - self._thread_local = threading.local() - - def init_per_thread_state(self): - # Ensure state is initialized just once per-thread - if not hasattr(self._thread_local, "init"): - self._thread_local.init = True - self._thread_local.last_nonce = "" - self._thread_local.nonce_count = 0 - self._thread_local.chal = {} - self._thread_local.pos = None - self._thread_local.num_401_calls = None - - def build_digest_header(self, method, url): - """ - :rtype: str - """ - - realm = self._thread_local.chal["realm"] - nonce = self._thread_local.chal["nonce"] - qop = self._thread_local.chal.get("qop") - algorithm = self._thread_local.chal.get("algorithm") - opaque = self._thread_local.chal.get("opaque") - hash_utf8 = None - - if algorithm is None: - _algorithm = "MD5" - else: - _algorithm = algorithm.upper() - # lambdas assume digest modules are imported at the top level - if _algorithm == "MD5" or _algorithm == "MD5-SESS": - - def md5_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.md5(x).hexdigest() - - hash_utf8 = md5_utf8 - elif _algorithm == "SHA": - - def sha_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha1(x).hexdigest() - - hash_utf8 = sha_utf8 - elif _algorithm == "SHA-256": - - def sha256_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha256(x).hexdigest() - - hash_utf8 = sha256_utf8 - elif _algorithm == "SHA-512": - - def sha512_utf8(x): - if isinstance(x, str): - x = x.encode("utf-8") - return hashlib.sha512(x).hexdigest() - - hash_utf8 = sha512_utf8 - - KD = lambda s, d: hash_utf8(f"{s}:{d}") # noqa:E731 - - if hash_utf8 is None: - return None - - # XXX not implemented yet - entdig = None - p_parsed = urlparse(url) - #: path is request-uri defined in RFC 2616 which should not be empty - path = p_parsed.path or "/" - if p_parsed.query: - path += f"?{p_parsed.query}" - - A1 = f"{self.username}:{realm}:{self.password}" - A2 = f"{method}:{path}" - - HA1 = hash_utf8(A1) - HA2 = hash_utf8(A2) - - if nonce == self._thread_local.last_nonce: - self._thread_local.nonce_count += 1 - else: - self._thread_local.nonce_count = 1 - ncvalue = f"{self._thread_local.nonce_count:08x}" - s = str(self._thread_local.nonce_count).encode("utf-8") - s += nonce.encode("utf-8") - s += time.ctime().encode("utf-8") - s += os.urandom(8) - - cnonce = hashlib.sha1(s).hexdigest()[:16] - if _algorithm == "MD5-SESS": - HA1 = hash_utf8(f"{HA1}:{nonce}:{cnonce}") - - if not qop: - respdig = KD(HA1, f"{nonce}:{HA2}") - elif qop == "auth" or "auth" in qop.split(","): - noncebit = f"{nonce}:{ncvalue}:{cnonce}:auth:{HA2}" - respdig = KD(HA1, noncebit) - else: - # XXX handle auth-int. - return None - - self._thread_local.last_nonce = nonce - - # XXX should the partial digests be encoded too? - base = ( - f'username="{self.username}", realm="{realm}", nonce="{nonce}", ' - f'uri="{path}", response="{respdig}"' - ) - if opaque: - base += f', opaque="{opaque}"' - if algorithm: - base += f', algorithm="{algorithm}"' - if entdig: - base += f', digest="{entdig}"' - if qop: - base += f', qop="auth", nc={ncvalue}, cnonce="{cnonce}"' - - return f"Digest {base}" - - def handle_redirect(self, r, **kwargs): - """Reset num_401_calls counter on redirects.""" - if r.is_redirect: - self._thread_local.num_401_calls = 1 - - def handle_401(self, r, **kwargs): - """ - Takes the given response and tries digest-auth, if needed. - - :rtype: requests.Response - """ - - # If response is not 4xx, do not auth - # See https://github.com/psf/requests/issues/3772 - if not 400 <= r.status_code < 500: - self._thread_local.num_401_calls = 1 - return r - - if self._thread_local.pos is not None: - # Rewind the file position indicator of the body to where - # it was to resend the request. - r.request.body.seek(self._thread_local.pos) - s_auth = r.headers.get("www-authenticate", "") - - if "digest" in s_auth.lower() and self._thread_local.num_401_calls < 2: - - self._thread_local.num_401_calls += 1 - pat = re.compile(r"digest ", flags=re.IGNORECASE) - self._thread_local.chal = parse_dict_header(pat.sub("", s_auth, count=1)) - - # Consume content and release the original connection - # to allow our new request to reuse the same one. - r.content - r.close() - prep = r.request.copy() - extract_cookies_to_jar(prep._cookies, r.request, r.raw) - prep.prepare_cookies(prep._cookies) - - prep.headers["Authorization"] = self.build_digest_header( - prep.method, prep.url - ) - _r = r.connection.send(prep, **kwargs) - _r.history.append(r) - _r.request = prep - - return _r - - self._thread_local.num_401_calls = 1 - return r - - def __call__(self, r): - # Initialize per-thread state, if needed - self.init_per_thread_state() - # If we have a saved nonce, skip the 401 - if self._thread_local.last_nonce: - r.headers["Authorization"] = self.build_digest_header(r.method, r.url) - try: - self._thread_local.pos = r.body.tell() - except AttributeError: - # In the case of HTTPDigestAuth being reused and the body of - # the previous request was a file-like object, pos has the - # file position of the previous body. Ensure it's set to - # None. - self._thread_local.pos = None - r.register_hook("response", self.handle_401) - r.register_hook("response", self.handle_redirect) - self._thread_local.num_401_calls = 1 - - return r - - def __eq__(self, other): - return all( - [ - self.username == getattr(other, "username", None), - self.password == getattr(other, "password", None), - ] - ) - - def __ne__(self, other): - return not self == other diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py deleted file mode 100644 index 38696a1..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python - -""" -requests.certs -~~~~~~~~~~~~~~ - -This module returns the preferred default CA certificate bundle. There is -only one — the one from the certifi package. - -If you are packaging Requests, e.g., for a Linux distribution or a managed -environment, you can change the definition of where() to return a separately -packaged CA bundle. -""" - -import os - -if "_PIP_STANDALONE_CERT" not in os.environ: - from pip._vendor.certifi import where -else: - def where(): - return os.environ["_PIP_STANDALONE_CERT"] - -if __name__ == "__main__": - print(where()) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py deleted file mode 100644 index 9ab2bb4..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -requests.compat -~~~~~~~~~~~~~~~ - -This module previously handled import compatibility issues -between Python 2 and Python 3. It remains for backwards -compatibility until the next major version. -""" - -from pip._vendor import chardet - -import sys - -# ------- -# Pythons -# ------- - -# Syntax sugar. -_ver = sys.version_info - -#: Python 2.x? -is_py2 = _ver[0] == 2 - -#: Python 3.x? -is_py3 = _ver[0] == 3 - -# Note: We've patched out simplejson support in pip because it prevents -# upgrading simplejson on Windows. -import json -from json import JSONDecodeError - -# Keep OrderedDict for backwards compatibility. -from collections import OrderedDict -from collections.abc import Callable, Mapping, MutableMapping -from http import cookiejar as cookielib -from http.cookies import Morsel -from io import StringIO - -# -------------- -# Legacy Imports -# -------------- -from urllib.parse import ( - quote, - quote_plus, - unquote, - unquote_plus, - urldefrag, - urlencode, - urljoin, - urlparse, - urlsplit, - urlunparse, -) -from urllib.request import ( - getproxies, - getproxies_environment, - parse_http_list, - proxy_bypass, - proxy_bypass_environment, -) - -builtin_str = str -str = str -bytes = bytes -basestring = (str, bytes) -numeric_types = (int, float) -integer_types = (int,) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py deleted file mode 100644 index bf54ab2..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py +++ /dev/null @@ -1,561 +0,0 @@ -""" -requests.cookies -~~~~~~~~~~~~~~~~ - -Compatibility code to be able to use `cookielib.CookieJar` with requests. - -requests.utils imports from here, so be careful with imports. -""" - -import calendar -import copy -import time - -from ._internal_utils import to_native_string -from .compat import Morsel, MutableMapping, cookielib, urlparse, urlunparse - -try: - import threading -except ImportError: - import dummy_threading as threading - - -class MockRequest: - """Wraps a `requests.Request` to mimic a `urllib2.Request`. - - The code in `cookielib.CookieJar` expects this interface in order to correctly - manage cookie policies, i.e., determine whether a cookie can be set, given the - domains of the request and the cookie. - - The original request object is read-only. The client is responsible for collecting - the new headers via `get_new_headers()` and interpreting them appropriately. You - probably want `get_cookie_header`, defined below. - """ - - def __init__(self, request): - self._r = request - self._new_headers = {} - self.type = urlparse(self._r.url).scheme - - def get_type(self): - return self.type - - def get_host(self): - return urlparse(self._r.url).netloc - - def get_origin_req_host(self): - return self.get_host() - - def get_full_url(self): - # Only return the response's URL if the user hadn't set the Host - # header - if not self._r.headers.get("Host"): - return self._r.url - # If they did set it, retrieve it and reconstruct the expected domain - host = to_native_string(self._r.headers["Host"], encoding="utf-8") - parsed = urlparse(self._r.url) - # Reconstruct the URL as we expect it - return urlunparse( - [ - parsed.scheme, - host, - parsed.path, - parsed.params, - parsed.query, - parsed.fragment, - ] - ) - - def is_unverifiable(self): - return True - - def has_header(self, name): - return name in self._r.headers or name in self._new_headers - - def get_header(self, name, default=None): - return self._r.headers.get(name, self._new_headers.get(name, default)) - - def add_header(self, key, val): - """cookielib has no legitimate use for this method; add it back if you find one.""" - raise NotImplementedError( - "Cookie headers should be added with add_unredirected_header()" - ) - - def add_unredirected_header(self, name, value): - self._new_headers[name] = value - - def get_new_headers(self): - return self._new_headers - - @property - def unverifiable(self): - return self.is_unverifiable() - - @property - def origin_req_host(self): - return self.get_origin_req_host() - - @property - def host(self): - return self.get_host() - - -class MockResponse: - """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. - - ...what? Basically, expose the parsed HTTP headers from the server response - the way `cookielib` expects to see them. - """ - - def __init__(self, headers): - """Make a MockResponse for `cookielib` to read. - - :param headers: a httplib.HTTPMessage or analogous carrying the headers - """ - self._headers = headers - - def info(self): - return self._headers - - def getheaders(self, name): - self._headers.getheaders(name) - - -def extract_cookies_to_jar(jar, request, response): - """Extract the cookies from the response into a CookieJar. - - :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) - :param request: our own requests.Request object - :param response: urllib3.HTTPResponse object - """ - if not (hasattr(response, "_original_response") and response._original_response): - return - # the _original_response field is the wrapped httplib.HTTPResponse object, - req = MockRequest(request) - # pull out the HTTPMessage with the headers and put it in the mock: - res = MockResponse(response._original_response.msg) - jar.extract_cookies(res, req) - - -def get_cookie_header(jar, request): - """ - Produce an appropriate Cookie header string to be sent with `request`, or None. - - :rtype: str - """ - r = MockRequest(request) - jar.add_cookie_header(r) - return r.get_new_headers().get("Cookie") - - -def remove_cookie_by_name(cookiejar, name, domain=None, path=None): - """Unsets a cookie by name, by default over all domains and paths. - - Wraps CookieJar.clear(), is O(n). - """ - clearables = [] - for cookie in cookiejar: - if cookie.name != name: - continue - if domain is not None and domain != cookie.domain: - continue - if path is not None and path != cookie.path: - continue - clearables.append((cookie.domain, cookie.path, cookie.name)) - - for domain, path, name in clearables: - cookiejar.clear(domain, path, name) - - -class CookieConflictError(RuntimeError): - """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific. - """ - - -class RequestsCookieJar(cookielib.CookieJar, MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict - interface. - - This is the CookieJar we create by default for requests and sessions that - don't specify one, since some clients may expect response.cookies and - session.cookies to support dict operations. - - Requests does not use the dict interface internally; it's just for - compatibility with external client code. All requests code should work - out of the box with externally provided instances of ``CookieJar``, e.g. - ``LWPCookieJar`` and ``FileCookieJar``. - - Unlike a regular CookieJar, this class is pickleable. - - .. warning:: dictionary operations that are normally O(1) may be O(n). - """ - - def get(self, name, default=None, domain=None, path=None): - """Dict-like get() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - - .. warning:: operation is O(n), not O(1). - """ - try: - return self._find_no_duplicates(name, domain, path) - except KeyError: - return default - - def set(self, name, value, **kwargs): - """Dict-like set() that also supports optional domain and path args in - order to resolve naming collisions from using one cookie jar over - multiple domains. - """ - # support client code that unsets cookies by assignment of a None value: - if value is None: - remove_cookie_by_name( - self, name, domain=kwargs.get("domain"), path=kwargs.get("path") - ) - return - - if isinstance(value, Morsel): - c = morsel_to_cookie(value) - else: - c = create_cookie(name, value, **kwargs) - self.set_cookie(c) - return c - - def iterkeys(self): - """Dict-like iterkeys() that returns an iterator of names of cookies - from the jar. - - .. seealso:: itervalues() and iteritems(). - """ - for cookie in iter(self): - yield cookie.name - - def keys(self): - """Dict-like keys() that returns a list of names of cookies from the - jar. - - .. seealso:: values() and items(). - """ - return list(self.iterkeys()) - - def itervalues(self): - """Dict-like itervalues() that returns an iterator of values of cookies - from the jar. - - .. seealso:: iterkeys() and iteritems(). - """ - for cookie in iter(self): - yield cookie.value - - def values(self): - """Dict-like values() that returns a list of values of cookies from the - jar. - - .. seealso:: keys() and items(). - """ - return list(self.itervalues()) - - def iteritems(self): - """Dict-like iteritems() that returns an iterator of name-value tuples - from the jar. - - .. seealso:: iterkeys() and itervalues(). - """ - for cookie in iter(self): - yield cookie.name, cookie.value - - def items(self): - """Dict-like items() that returns a list of name-value tuples from the - jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a - vanilla python dict of key value pairs. - - .. seealso:: keys() and values(). - """ - return list(self.iteritems()) - - def list_domains(self): - """Utility method to list all the domains in the jar.""" - domains = [] - for cookie in iter(self): - if cookie.domain not in domains: - domains.append(cookie.domain) - return domains - - def list_paths(self): - """Utility method to list all the paths in the jar.""" - paths = [] - for cookie in iter(self): - if cookie.path not in paths: - paths.append(cookie.path) - return paths - - def multiple_domains(self): - """Returns True if there are multiple domains in the jar. - Returns False otherwise. - - :rtype: bool - """ - domains = [] - for cookie in iter(self): - if cookie.domain is not None and cookie.domain in domains: - return True - domains.append(cookie.domain) - return False # there is only one domain in jar - - def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain - old Python dict of name-value pairs of cookies that meet the - requirements. - - :rtype: dict - """ - dictionary = {} - for cookie in iter(self): - if (domain is None or cookie.domain == domain) and ( - path is None or cookie.path == path - ): - dictionary[cookie.name] = cookie.value - return dictionary - - def __contains__(self, name): - try: - return super().__contains__(name) - except CookieConflictError: - return True - - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws - exception if there are more than one cookie with name. In that case, - use the more explicit get() method instead. - - .. warning:: operation is O(n), not O(1). - """ - return self._find_no_duplicates(name) - - def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws - exception if there is already a cookie of that name in the jar. In that - case, use the more explicit set() method instead. - """ - self.set(name, value) - - def __delitem__(self, name): - """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s - ``remove_cookie_by_name()``. - """ - remove_cookie_by_name(self, name) - - def set_cookie(self, cookie, *args, **kwargs): - if ( - hasattr(cookie.value, "startswith") - and cookie.value.startswith('"') - and cookie.value.endswith('"') - ): - cookie.value = cookie.value.replace('\\"', "") - return super().set_cookie(cookie, *args, **kwargs) - - def update(self, other): - """Updates this jar with cookies from another CookieJar or dict-like""" - if isinstance(other, cookielib.CookieJar): - for cookie in other: - self.set_cookie(copy.copy(cookie)) - else: - super().update(other) - - def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. - - If there are conflicting cookies, _find arbitrarily chooses one. - See _find_no_duplicates if you want an exception thrown if there are - conflicting cookies. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :return: cookie.value - """ - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - return cookie.value - - raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") - - def _find_no_duplicates(self, name, domain=None, path=None): - """Both ``__get_item__`` and ``get`` call this function: it's never - used elsewhere in Requests. - - :param name: a string containing name of cookie - :param domain: (optional) string containing domain of cookie - :param path: (optional) string containing path of cookie - :raises KeyError: if cookie is not found - :raises CookieConflictError: if there are multiple cookies - that match name and optionally domain and path - :return: cookie.value - """ - toReturn = None - for cookie in iter(self): - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if toReturn is not None: - # if there are multiple cookies that meet passed in criteria - raise CookieConflictError( - f"There are multiple cookies with name, {name!r}" - ) - # we will eventually return this as long as no cookie conflict - toReturn = cookie.value - - if toReturn: - return toReturn - raise KeyError(f"name={name!r}, domain={domain!r}, path={path!r}") - - def __getstate__(self): - """Unlike a normal CookieJar, this class is pickleable.""" - state = self.__dict__.copy() - # remove the unpickleable RLock object - state.pop("_cookies_lock") - return state - - def __setstate__(self, state): - """Unlike a normal CookieJar, this class is pickleable.""" - self.__dict__.update(state) - if "_cookies_lock" not in self.__dict__: - self._cookies_lock = threading.RLock() - - def copy(self): - """Return a copy of this RequestsCookieJar.""" - new_cj = RequestsCookieJar() - new_cj.set_policy(self.get_policy()) - new_cj.update(self) - return new_cj - - def get_policy(self): - """Return the CookiePolicy instance used.""" - return self._policy - - -def _copy_cookie_jar(jar): - if jar is None: - return None - - if hasattr(jar, "copy"): - # We're dealing with an instance of RequestsCookieJar - return jar.copy() - # We're dealing with a generic CookieJar instance - new_jar = copy.copy(jar) - new_jar.clear() - for cookie in jar: - new_jar.set_cookie(copy.copy(cookie)) - return new_jar - - -def create_cookie(name, value, **kwargs): - """Make a cookie from underspecified parameters. - - By default, the pair of `name` and `value` will be set for the domain '' - and sent on every request (this is sometimes called a "supercookie"). - """ - result = { - "version": 0, - "name": name, - "value": value, - "port": None, - "domain": "", - "path": "/", - "secure": False, - "expires": None, - "discard": True, - "comment": None, - "comment_url": None, - "rest": {"HttpOnly": None}, - "rfc2109": False, - } - - badargs = set(kwargs) - set(result) - if badargs: - raise TypeError( - f"create_cookie() got unexpected keyword arguments: {list(badargs)}" - ) - - result.update(kwargs) - result["port_specified"] = bool(result["port"]) - result["domain_specified"] = bool(result["domain"]) - result["domain_initial_dot"] = result["domain"].startswith(".") - result["path_specified"] = bool(result["path"]) - - return cookielib.Cookie(**result) - - -def morsel_to_cookie(morsel): - """Convert a Morsel object into a Cookie containing the one k/v pair.""" - - expires = None - if morsel["max-age"]: - try: - expires = int(time.time() + int(morsel["max-age"])) - except ValueError: - raise TypeError(f"max-age: {morsel['max-age']} must be integer") - elif morsel["expires"]: - time_template = "%a, %d-%b-%Y %H:%M:%S GMT" - expires = calendar.timegm(time.strptime(morsel["expires"], time_template)) - return create_cookie( - comment=morsel["comment"], - comment_url=bool(morsel["comment"]), - discard=False, - domain=morsel["domain"], - expires=expires, - name=morsel.key, - path=morsel["path"], - port=None, - rest={"HttpOnly": morsel["httponly"]}, - rfc2109=False, - secure=bool(morsel["secure"]), - value=morsel.value, - version=morsel["version"] or 0, - ) - - -def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): - """Returns a CookieJar from a key/value dictionary. - - :param cookie_dict: Dict of key/values to insert into CookieJar. - :param cookiejar: (optional) A cookiejar to add the cookies to. - :param overwrite: (optional) If False, will not replace cookies - already in the jar with new ones. - :rtype: CookieJar - """ - if cookiejar is None: - cookiejar = RequestsCookieJar() - - if cookie_dict is not None: - names_from_jar = [cookie.name for cookie in cookiejar] - for name in cookie_dict: - if overwrite or (name not in names_from_jar): - cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) - - return cookiejar - - -def merge_cookies(cookiejar, cookies): - """Add cookies to cookiejar and returns a merged CookieJar. - - :param cookiejar: CookieJar object to add the cookies to. - :param cookies: Dictionary or CookieJar object to be added. - :rtype: CookieJar - """ - if not isinstance(cookiejar, cookielib.CookieJar): - raise ValueError("You can only merge into CookieJar") - - if isinstance(cookies, dict): - cookiejar = cookiejar_from_dict(cookies, cookiejar=cookiejar, overwrite=False) - elif isinstance(cookies, cookielib.CookieJar): - try: - cookiejar.update(cookies) - except AttributeError: - for cookie_in_jar in cookies: - cookiejar.set_cookie(cookie_in_jar) - - return cookiejar diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py deleted file mode 100644 index 168d073..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py +++ /dev/null @@ -1,141 +0,0 @@ -""" -requests.exceptions -~~~~~~~~~~~~~~~~~~~ - -This module contains the set of Requests' exceptions. -""" -from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError - -from .compat import JSONDecodeError as CompatJSONDecodeError - - -class RequestException(IOError): - """There was an ambiguous exception that occurred while handling your - request. - """ - - def __init__(self, *args, **kwargs): - """Initialize RequestException with `request` and `response` objects.""" - response = kwargs.pop("response", None) - self.response = response - self.request = kwargs.pop("request", None) - if response is not None and not self.request and hasattr(response, "request"): - self.request = self.response.request - super().__init__(*args, **kwargs) - - -class InvalidJSONError(RequestException): - """A JSON error occurred.""" - - -class JSONDecodeError(InvalidJSONError, CompatJSONDecodeError): - """Couldn't decode the text into json""" - - def __init__(self, *args, **kwargs): - """ - Construct the JSONDecodeError instance first with all - args. Then use it's args to construct the IOError so that - the json specific args aren't used as IOError specific args - and the error message from JSONDecodeError is preserved. - """ - CompatJSONDecodeError.__init__(self, *args) - InvalidJSONError.__init__(self, *self.args, **kwargs) - - -class HTTPError(RequestException): - """An HTTP error occurred.""" - - -class ConnectionError(RequestException): - """A Connection error occurred.""" - - -class ProxyError(ConnectionError): - """A proxy error occurred.""" - - -class SSLError(ConnectionError): - """An SSL error occurred.""" - - -class Timeout(RequestException): - """The request timed out. - - Catching this error will catch both - :exc:`~requests.exceptions.ConnectTimeout` and - :exc:`~requests.exceptions.ReadTimeout` errors. - """ - - -class ConnectTimeout(ConnectionError, Timeout): - """The request timed out while trying to connect to the remote server. - - Requests that produced this error are safe to retry. - """ - - -class ReadTimeout(Timeout): - """The server did not send any data in the allotted amount of time.""" - - -class URLRequired(RequestException): - """A valid URL is required to make a request.""" - - -class TooManyRedirects(RequestException): - """Too many redirects.""" - - -class MissingSchema(RequestException, ValueError): - """The URL scheme (e.g. http or https) is missing.""" - - -class InvalidSchema(RequestException, ValueError): - """The URL scheme provided is either invalid or unsupported.""" - - -class InvalidURL(RequestException, ValueError): - """The URL provided was somehow invalid.""" - - -class InvalidHeader(RequestException, ValueError): - """The header value provided was somehow invalid.""" - - -class InvalidProxyURL(InvalidURL): - """The proxy URL provided is invalid.""" - - -class ChunkedEncodingError(RequestException): - """The server declared chunked encoding but sent an invalid chunk.""" - - -class ContentDecodingError(RequestException, BaseHTTPError): - """Failed to decode response content.""" - - -class StreamConsumedError(RequestException, TypeError): - """The content for this response was already consumed.""" - - -class RetryError(RequestException): - """Custom retries logic failed""" - - -class UnrewindableBodyError(RequestException): - """Requests encountered an error when trying to rewind a body.""" - - -# Warnings - - -class RequestsWarning(Warning): - """Base warning for Requests.""" - - -class FileModeWarning(RequestsWarning, DeprecationWarning): - """A file was opened in text mode, but Requests determined its binary length.""" - - -class RequestsDependencyWarning(RequestsWarning): - """An imported dependency doesn't match the expected version range.""" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py deleted file mode 100644 index 2d292c2..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py +++ /dev/null @@ -1,131 +0,0 @@ -"""Module containing bug report helper(s).""" - -import json -import platform -import ssl -import sys - -from pip._vendor import idna -from pip._vendor import urllib3 - -from . import __version__ as requests_version - -charset_normalizer = None - -try: - from pip._vendor import chardet -except ImportError: - chardet = None - -try: - from pip._vendor.urllib3.contrib import pyopenssl -except ImportError: - pyopenssl = None - OpenSSL = None - cryptography = None -else: - import cryptography - import OpenSSL - - -def _implementation(): - """Return a dict with the Python implementation and version. - - Provide both the name and the version of the Python implementation - currently running. For example, on CPython 3.10.3 it will return - {'name': 'CPython', 'version': '3.10.3'}. - - This function works best on CPython and PyPy: in particular, it probably - doesn't work for Jython or IronPython. Future investigation should be done - to work out the correct shape of the code for those platforms. - """ - implementation = platform.python_implementation() - - if implementation == "CPython": - implementation_version = platform.python_version() - elif implementation == "PyPy": - implementation_version = "{}.{}.{}".format( - sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro, - ) - if sys.pypy_version_info.releaselevel != "final": - implementation_version = "".join( - [implementation_version, sys.pypy_version_info.releaselevel] - ) - elif implementation == "Jython": - implementation_version = platform.python_version() # Complete Guess - elif implementation == "IronPython": - implementation_version = platform.python_version() # Complete Guess - else: - implementation_version = "Unknown" - - return {"name": implementation, "version": implementation_version} - - -def info(): - """Generate information for a bug report.""" - try: - platform_info = { - "system": platform.system(), - "release": platform.release(), - } - except OSError: - platform_info = { - "system": "Unknown", - "release": "Unknown", - } - - implementation_info = _implementation() - urllib3_info = {"version": urllib3.__version__} - charset_normalizer_info = {"version": None} - chardet_info = {"version": None} - if charset_normalizer: - charset_normalizer_info = {"version": charset_normalizer.__version__} - if chardet: - chardet_info = {"version": chardet.__version__} - - pyopenssl_info = { - "version": None, - "openssl_version": "", - } - if OpenSSL: - pyopenssl_info = { - "version": OpenSSL.__version__, - "openssl_version": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}", - } - cryptography_info = { - "version": getattr(cryptography, "__version__", ""), - } - idna_info = { - "version": getattr(idna, "__version__", ""), - } - - system_ssl = ssl.OPENSSL_VERSION_NUMBER - system_ssl_info = {"version": f"{system_ssl:x}" if system_ssl is not None else ""} - - return { - "platform": platform_info, - "implementation": implementation_info, - "system_ssl": system_ssl_info, - "using_pyopenssl": pyopenssl is not None, - "using_charset_normalizer": chardet is None, - "pyOpenSSL": pyopenssl_info, - "urllib3": urllib3_info, - "chardet": chardet_info, - "charset_normalizer": charset_normalizer_info, - "cryptography": cryptography_info, - "idna": idna_info, - "requests": { - "version": requests_version, - }, - } - - -def main(): - """Pretty-print the bug information as JSON.""" - print(json.dumps(info(), sort_keys=True, indent=2)) - - -if __name__ == "__main__": - main() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py deleted file mode 100644 index d181ba2..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -requests.hooks -~~~~~~~~~~~~~~ - -This module provides the capabilities for the Requests hooks system. - -Available hooks: - -``response``: - The response generated from a Request. -""" -HOOKS = ["response"] - - -def default_hooks(): - return {event: [] for event in HOOKS} - - -# TODO: response is the only one - - -def dispatch_hook(key, hooks, hook_data, **kwargs): - """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or {} - hooks = hooks.get(key) - if hooks: - if hasattr(hooks, "__call__"): - hooks = [hooks] - for hook in hooks: - _hook_data = hook(hook_data, **kwargs) - if _hook_data is not None: - hook_data = _hook_data - return hook_data diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py deleted file mode 100644 index 76e6f19..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py +++ /dev/null @@ -1,1034 +0,0 @@ -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -import datetime - -# Import encoding now, to avoid implicit import later. -# Implicit import within threads may cause LookupError when standard library is in a ZIP, -# such as in Embedded Python. See https://github.com/psf/requests/issues/3578. -import encodings.idna # noqa: F401 -from io import UnsupportedOperation - -from pip._vendor.urllib3.exceptions import ( - DecodeError, - LocationParseError, - ProtocolError, - ReadTimeoutError, - SSLError, -) -from pip._vendor.urllib3.fields import RequestField -from pip._vendor.urllib3.filepost import encode_multipart_formdata -from pip._vendor.urllib3.util import parse_url - -from ._internal_utils import to_native_string, unicode_is_ascii -from .auth import HTTPBasicAuth -from .compat import ( - Callable, - JSONDecodeError, - Mapping, - basestring, - builtin_str, - chardet, - cookielib, -) -from .compat import json as complexjson -from .compat import urlencode, urlsplit, urlunparse -from .cookies import _copy_cookie_jar, cookiejar_from_dict, get_cookie_header -from .exceptions import ( - ChunkedEncodingError, - ConnectionError, - ContentDecodingError, - HTTPError, - InvalidJSONError, - InvalidURL, -) -from .exceptions import JSONDecodeError as RequestsJSONDecodeError -from .exceptions import MissingSchema -from .exceptions import SSLError as RequestsSSLError -from .exceptions import StreamConsumedError -from .hooks import default_hooks -from .status_codes import codes -from .structures import CaseInsensitiveDict -from .utils import ( - check_header_validity, - get_auth_from_url, - guess_filename, - guess_json_utf, - iter_slices, - parse_header_links, - requote_uri, - stream_decode_response_unicode, - super_len, - to_key_val_list, -) - -#: The set of HTTP status codes that indicate an automatically -#: processable redirect. -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_redirect, # 307 - codes.permanent_redirect, # 308 -) - -DEFAULT_REDIRECT_LIMIT = 30 -CONTENT_CHUNK_SIZE = 10 * 1024 -ITER_CHUNK_SIZE = 512 - - -class RequestEncodingMixin: - @property - def path_url(self): - """Build the path URL to use.""" - - url = [] - - p = urlsplit(self.url) - - path = p.path - if not path: - path = "/" - - url.append(path) - - query = p.query - if query: - url.append("?") - url.append(query) - - return "".join(url) - - @staticmethod - def _encode_params(data): - """Encode parameters in a piece of data. - - Will successfully encode parameters when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary - if parameters are supplied as a dict. - """ - - if isinstance(data, (str, bytes)): - return data - elif hasattr(data, "read"): - return data - elif hasattr(data, "__iter__"): - result = [] - for k, vs in to_key_val_list(data): - if isinstance(vs, basestring) or not hasattr(vs, "__iter__"): - vs = [vs] - for v in vs: - if v is not None: - result.append( - ( - k.encode("utf-8") if isinstance(k, str) else k, - v.encode("utf-8") if isinstance(v, str) else v, - ) - ) - return urlencode(result, doseq=True) - else: - return data - - @staticmethod - def _encode_files(files, data): - """Build the body for a multipart/form-data request. - - Will successfully encode files when passed as a dict or a list of - tuples. Order is retained if data is a list of tuples but arbitrary - if parameters are supplied as a dict. - The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) - or 4-tuples (filename, fileobj, contentype, custom_headers). - """ - if not files: - raise ValueError("Files must be provided.") - elif isinstance(data, basestring): - raise ValueError("Data must not be a string.") - - new_fields = [] - fields = to_key_val_list(data or {}) - files = to_key_val_list(files or {}) - - for field, val in fields: - if isinstance(val, basestring) or not hasattr(val, "__iter__"): - val = [val] - for v in val: - if v is not None: - # Don't call str() on bytestrings: in Py3 it all goes wrong. - if not isinstance(v, bytes): - v = str(v) - - new_fields.append( - ( - field.decode("utf-8") - if isinstance(field, bytes) - else field, - v.encode("utf-8") if isinstance(v, str) else v, - ) - ) - - for (k, v) in files: - # support for explicit filename - ft = None - fh = None - if isinstance(v, (tuple, list)): - if len(v) == 2: - fn, fp = v - elif len(v) == 3: - fn, fp, ft = v - else: - fn, fp, ft, fh = v - else: - fn = guess_filename(v) or k - fp = v - - if isinstance(fp, (str, bytes, bytearray)): - fdata = fp - elif hasattr(fp, "read"): - fdata = fp.read() - elif fp is None: - continue - else: - fdata = fp - - rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) - rf.make_multipart(content_type=ft) - new_fields.append(rf) - - body, content_type = encode_multipart_formdata(new_fields) - - return body, content_type - - -class RequestHooksMixin: - def register_hook(self, event, hook): - """Properly register a hook.""" - - if event not in self.hooks: - raise ValueError(f'Unsupported event specified, with event name "{event}"') - - if isinstance(hook, Callable): - self.hooks[event].append(hook) - elif hasattr(hook, "__iter__"): - self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) - - def deregister_hook(self, event, hook): - """Deregister a previously registered hook. - Returns True if the hook existed, False if not. - """ - - try: - self.hooks[event].remove(hook) - return True - except ValueError: - return False - - -class Request(RequestHooksMixin): - """A user-created :class:`Request ` object. - - Used to prepare a :class:`PreparedRequest `, which is sent to the server. - - :param method: HTTP method to use. - :param url: URL to send. - :param headers: dictionary of headers to send. - :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach to the request. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param json: json for the body to attach to the request (if files or data is not specified). - :param params: URL parameters to append to the URL. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :param auth: Auth handler or (user, pass) tuple. - :param cookies: dictionary or CookieJar of cookies to attach to this request. - :param hooks: dictionary of callback hooks, for internal usage. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> req.prepare() - - """ - - def __init__( - self, - method=None, - url=None, - headers=None, - files=None, - data=None, - params=None, - auth=None, - cookies=None, - hooks=None, - json=None, - ): - - # Default empty dicts for dict params. - data = [] if data is None else data - files = [] if files is None else files - headers = {} if headers is None else headers - params = {} if params is None else params - hooks = {} if hooks is None else hooks - - self.hooks = default_hooks() - for (k, v) in list(hooks.items()): - self.register_hook(event=k, hook=v) - - self.method = method - self.url = url - self.headers = headers - self.files = files - self.data = data - self.json = json - self.params = params - self.auth = auth - self.cookies = cookies - - def __repr__(self): - return f"" - - def prepare(self): - """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" - p = PreparedRequest() - p.prepare( - method=self.method, - url=self.url, - headers=self.headers, - files=self.files, - data=self.data, - json=self.json, - params=self.params, - auth=self.auth, - cookies=self.cookies, - hooks=self.hooks, - ) - return p - - -class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): - """The fully mutable :class:`PreparedRequest ` object, - containing the exact bytes that will be sent to the server. - - Instances are generated from a :class:`Request ` object, and - should not be instantiated manually; doing so may produce undesirable - effects. - - Usage:: - - >>> import requests - >>> req = requests.Request('GET', 'https://httpbin.org/get') - >>> r = req.prepare() - >>> r - - - >>> s = requests.Session() - >>> s.send(r) - - """ - - def __init__(self): - #: HTTP verb to send to the server. - self.method = None - #: HTTP URL to send the request to. - self.url = None - #: dictionary of HTTP headers. - self.headers = None - # The `CookieJar` used to create the Cookie header will be stored here - # after prepare_cookies is called - self._cookies = None - #: request body to send to the server. - self.body = None - #: dictionary of callback hooks, for internal usage. - self.hooks = default_hooks() - #: integer denoting starting position of a readable file-like body. - self._body_position = None - - def prepare( - self, - method=None, - url=None, - headers=None, - files=None, - data=None, - params=None, - auth=None, - cookies=None, - hooks=None, - json=None, - ): - """Prepares the entire request with the given parameters.""" - - self.prepare_method(method) - self.prepare_url(url, params) - self.prepare_headers(headers) - self.prepare_cookies(cookies) - self.prepare_body(data, files, json) - self.prepare_auth(auth, url) - - # Note that prepare_auth must be last to enable authentication schemes - # such as OAuth to work on a fully prepared request. - - # This MUST go after prepare_auth. Authenticators could add a hook - self.prepare_hooks(hooks) - - def __repr__(self): - return f"" - - def copy(self): - p = PreparedRequest() - p.method = self.method - p.url = self.url - p.headers = self.headers.copy() if self.headers is not None else None - p._cookies = _copy_cookie_jar(self._cookies) - p.body = self.body - p.hooks = self.hooks - p._body_position = self._body_position - return p - - def prepare_method(self, method): - """Prepares the given HTTP method.""" - self.method = method - if self.method is not None: - self.method = to_native_string(self.method.upper()) - - @staticmethod - def _get_idna_encoded_host(host): - from pip._vendor import idna - - try: - host = idna.encode(host, uts46=True).decode("utf-8") - except idna.IDNAError: - raise UnicodeError - return host - - def prepare_url(self, url, params): - """Prepares the given HTTP URL.""" - #: Accept objects that have string representations. - #: We're unable to blindly call unicode/str functions - #: as this will include the bytestring indicator (b'') - #: on python 3.x. - #: https://github.com/psf/requests/pull/2238 - if isinstance(url, bytes): - url = url.decode("utf8") - else: - url = str(url) - - # Remove leading whitespaces from url - url = url.lstrip() - - # Don't do any URL preparation for non-HTTP schemes like `mailto`, - # `data` etc to work around exceptions from `url_parse`, which - # handles RFC 3986 only. - if ":" in url and not url.lower().startswith("http"): - self.url = url - return - - # Support for unicode domain names and paths. - try: - scheme, auth, host, port, path, query, fragment = parse_url(url) - except LocationParseError as e: - raise InvalidURL(*e.args) - - if not scheme: - raise MissingSchema( - f"Invalid URL {url!r}: No scheme supplied. " - f"Perhaps you meant https://{url}?" - ) - - if not host: - raise InvalidURL(f"Invalid URL {url!r}: No host supplied") - - # In general, we want to try IDNA encoding the hostname if the string contains - # non-ASCII characters. This allows users to automatically get the correct IDNA - # behaviour. For strings containing only ASCII characters, we need to also verify - # it doesn't start with a wildcard (*), before allowing the unencoded hostname. - if not unicode_is_ascii(host): - try: - host = self._get_idna_encoded_host(host) - except UnicodeError: - raise InvalidURL("URL has an invalid label.") - elif host.startswith(("*", ".")): - raise InvalidURL("URL has an invalid label.") - - # Carefully reconstruct the network location - netloc = auth or "" - if netloc: - netloc += "@" - netloc += host - if port: - netloc += f":{port}" - - # Bare domains aren't valid URLs. - if not path: - path = "/" - - if isinstance(params, (str, bytes)): - params = to_native_string(params) - - enc_params = self._encode_params(params) - if enc_params: - if query: - query = f"{query}&{enc_params}" - else: - query = enc_params - - url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) - self.url = url - - def prepare_headers(self, headers): - """Prepares the given HTTP headers.""" - - self.headers = CaseInsensitiveDict() - if headers: - for header in headers.items(): - # Raise exception on invalid header value. - check_header_validity(header) - name, value = header - self.headers[to_native_string(name)] = value - - def prepare_body(self, data, files, json=None): - """Prepares the given HTTP body data.""" - - # Check if file, fo, generator, iterator. - # If not, run through normal process. - - # Nottin' on you. - body = None - content_type = None - - if not data and json is not None: - # urllib3 requires a bytes-like body. Python 2's json.dumps - # provides this natively, but Python 3 gives a Unicode string. - content_type = "application/json" - - try: - body = complexjson.dumps(json, allow_nan=False) - except ValueError as ve: - raise InvalidJSONError(ve, request=self) - - if not isinstance(body, bytes): - body = body.encode("utf-8") - - is_stream = all( - [ - hasattr(data, "__iter__"), - not isinstance(data, (basestring, list, tuple, Mapping)), - ] - ) - - if is_stream: - try: - length = super_len(data) - except (TypeError, AttributeError, UnsupportedOperation): - length = None - - body = data - - if getattr(body, "tell", None) is not None: - # Record the current file position before reading. - # This will allow us to rewind a file in the event - # of a redirect. - try: - self._body_position = body.tell() - except OSError: - # This differentiates from None, allowing us to catch - # a failed `tell()` later when trying to rewind the body - self._body_position = object() - - if files: - raise NotImplementedError( - "Streamed bodies and files are mutually exclusive." - ) - - if length: - self.headers["Content-Length"] = builtin_str(length) - else: - self.headers["Transfer-Encoding"] = "chunked" - else: - # Multi-part file uploads. - if files: - (body, content_type) = self._encode_files(files, data) - else: - if data: - body = self._encode_params(data) - if isinstance(data, basestring) or hasattr(data, "read"): - content_type = None - else: - content_type = "application/x-www-form-urlencoded" - - self.prepare_content_length(body) - - # Add content-type if it wasn't explicitly provided. - if content_type and ("content-type" not in self.headers): - self.headers["Content-Type"] = content_type - - self.body = body - - def prepare_content_length(self, body): - """Prepare Content-Length header based on request method and body""" - if body is not None: - length = super_len(body) - if length: - # If length exists, set it. Otherwise, we fallback - # to Transfer-Encoding: chunked. - self.headers["Content-Length"] = builtin_str(length) - elif ( - self.method not in ("GET", "HEAD") - and self.headers.get("Content-Length") is None - ): - # Set Content-Length to 0 for methods that can have a body - # but don't provide one. (i.e. not GET or HEAD) - self.headers["Content-Length"] = "0" - - def prepare_auth(self, auth, url=""): - """Prepares the given HTTP auth data.""" - - # If no Auth is explicitly provided, extract it from the URL first. - if auth is None: - url_auth = get_auth_from_url(self.url) - auth = url_auth if any(url_auth) else None - - if auth: - if isinstance(auth, tuple) and len(auth) == 2: - # special-case basic HTTP auth - auth = HTTPBasicAuth(*auth) - - # Allow auth to make its changes. - r = auth(self) - - # Update self to reflect the auth changes. - self.__dict__.update(r.__dict__) - - # Recompute Content-Length - self.prepare_content_length(self.body) - - def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data. - - This function eventually generates a ``Cookie`` header from the - given cookies using cookielib. Due to cookielib's design, the header - will not be regenerated if it already exists, meaning this function - can only be called once for the life of the - :class:`PreparedRequest ` object. Any subsequent calls - to ``prepare_cookies`` will have no actual effect, unless the "Cookie" - header is removed beforehand. - """ - if isinstance(cookies, cookielib.CookieJar): - self._cookies = cookies - else: - self._cookies = cookiejar_from_dict(cookies) - - cookie_header = get_cookie_header(self._cookies, self) - if cookie_header is not None: - self.headers["Cookie"] = cookie_header - - def prepare_hooks(self, hooks): - """Prepares the given hooks.""" - # hooks can be passed as None to the prepare method and to this - # method. To prevent iterating over None, simply use an empty list - # if hooks is False-y - hooks = hooks or [] - for event in hooks: - self.register_hook(event, hooks[event]) - - -class Response: - """The :class:`Response ` object, which contains a - server's response to an HTTP request. - """ - - __attrs__ = [ - "_content", - "status_code", - "headers", - "url", - "history", - "encoding", - "reason", - "cookies", - "elapsed", - "request", - ] - - def __init__(self): - self._content = False - self._content_consumed = False - self._next = None - - #: Integer Code of responded HTTP Status, e.g. 404 or 200. - self.status_code = None - - #: Case-insensitive Dictionary of Response Headers. - #: For example, ``headers['content-encoding']`` will return the - #: value of a ``'Content-Encoding'`` response header. - self.headers = CaseInsensitiveDict() - - #: File-like object representation of response (for advanced usage). - #: Use of ``raw`` requires that ``stream=True`` be set on the request. - #: This requirement does not apply for use internally to Requests. - self.raw = None - - #: Final URL location of Response. - self.url = None - - #: Encoding to decode with when accessing r.text. - self.encoding = None - - #: A list of :class:`Response ` objects from - #: the history of the Request. Any redirect responses will end - #: up here. The list is sorted from the oldest to the most recent request. - self.history = [] - - #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". - self.reason = None - - #: A CookieJar of Cookies the server sent back. - self.cookies = cookiejar_from_dict({}) - - #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta). - #: This property specifically measures the time taken between sending - #: the first byte of the request and finishing parsing the headers. It - #: is therefore unaffected by consuming the response content or the - #: value of the ``stream`` keyword argument. - self.elapsed = datetime.timedelta(0) - - #: The :class:`PreparedRequest ` object to which this - #: is a response. - self.request = None - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def __getstate__(self): - # Consume everything; accessing the content attribute makes - # sure the content has been fully read. - if not self._content_consumed: - self.content - - return {attr: getattr(self, attr, None) for attr in self.__attrs__} - - def __setstate__(self, state): - for name, value in state.items(): - setattr(self, name, value) - - # pickled objects do not have .raw - setattr(self, "_content_consumed", True) - setattr(self, "raw", None) - - def __repr__(self): - return f"" - - def __bool__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __nonzero__(self): - """Returns True if :attr:`status_code` is less than 400. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code, is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - return self.ok - - def __iter__(self): - """Allows you to use a response as an iterator.""" - return self.iter_content(128) - - @property - def ok(self): - """Returns True if :attr:`status_code` is less than 400, False if not. - - This attribute checks if the status code of the response is between - 400 and 600 to see if there was a client error or a server error. If - the status code is between 200 and 400, this will return True. This - is **not** a check to see if the response code is ``200 OK``. - """ - try: - self.raise_for_status() - except HTTPError: - return False - return True - - @property - def is_redirect(self): - """True if this Response is a well-formed HTTP redirect that could have - been processed automatically (by :meth:`Session.resolve_redirects`). - """ - return "location" in self.headers and self.status_code in REDIRECT_STATI - - @property - def is_permanent_redirect(self): - """True if this Response one of the permanent versions of redirect.""" - return "location" in self.headers and self.status_code in ( - codes.moved_permanently, - codes.permanent_redirect, - ) - - @property - def next(self): - """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" - return self._next - - @property - def apparent_encoding(self): - """The apparent encoding, provided by the charset_normalizer or chardet libraries.""" - return chardet.detect(self.content)["encoding"] - - def iter_content(self, chunk_size=1, decode_unicode=False): - """Iterates over the response data. When stream=True is set on the - request, this avoids reading the content at once into memory for - large responses. The chunk size is the number of bytes it should - read into memory. This is not necessarily the length of each item - returned as decoding can take place. - - chunk_size must be of type int or None. A value of None will - function differently depending on the value of `stream`. - stream=True will read data as it arrives in whatever size the - chunks are received. If stream=False, data is returned as - a single chunk. - - If decode_unicode is True, content will be decoded using the best - available encoding based on the response. - """ - - def generate(): - # Special case for urllib3. - if hasattr(self.raw, "stream"): - try: - yield from self.raw.stream(chunk_size, decode_content=True) - except ProtocolError as e: - raise ChunkedEncodingError(e) - except DecodeError as e: - raise ContentDecodingError(e) - except ReadTimeoutError as e: - raise ConnectionError(e) - except SSLError as e: - raise RequestsSSLError(e) - else: - # Standard file-like object. - while True: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk - - self._content_consumed = True - - if self._content_consumed and isinstance(self._content, bool): - raise StreamConsumedError() - elif chunk_size is not None and not isinstance(chunk_size, int): - raise TypeError( - f"chunk_size must be an int, it is instead a {type(chunk_size)}." - ) - # simulate reading small chunks of the content - reused_chunks = iter_slices(self._content, chunk_size) - - stream_chunks = generate() - - chunks = reused_chunks if self._content_consumed else stream_chunks - - if decode_unicode: - chunks = stream_decode_response_unicode(chunks, self) - - return chunks - - def iter_lines( - self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None - ): - """Iterates over the response data, one line at a time. When - stream=True is set on the request, this avoids reading the - content at once into memory for large responses. - - .. note:: This method is not reentrant safe. - """ - - pending = None - - for chunk in self.iter_content( - chunk_size=chunk_size, decode_unicode=decode_unicode - ): - - if pending is not None: - chunk = pending + chunk - - if delimiter: - lines = chunk.split(delimiter) - else: - lines = chunk.splitlines() - - if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: - pending = lines.pop() - else: - pending = None - - yield from lines - - if pending is not None: - yield pending - - @property - def content(self): - """Content of the response, in bytes.""" - - if self._content is False: - # Read the contents. - if self._content_consumed: - raise RuntimeError("The content for this response was already consumed") - - if self.status_code == 0 or self.raw is None: - self._content = None - else: - self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b"" - - self._content_consumed = True - # don't need to release the connection; that's been handled by urllib3 - # since we exhausted the data. - return self._content - - @property - def text(self): - """Content of the response, in unicode. - - If Response.encoding is None, encoding will be guessed using - ``charset_normalizer`` or ``chardet``. - - The encoding of the response content is determined based solely on HTTP - headers, following RFC 2616 to the letter. If you can take advantage of - non-HTTP knowledge to make a better guess at the encoding, you should - set ``r.encoding`` appropriately before accessing this property. - """ - - # Try charset from content-type - content = None - encoding = self.encoding - - if not self.content: - return "" - - # Fallback to auto-detected encoding. - if self.encoding is None: - encoding = self.apparent_encoding - - # Decode unicode from given encoding. - try: - content = str(self.content, encoding, errors="replace") - except (LookupError, TypeError): - # A LookupError is raised if the encoding was not found which could - # indicate a misspelling or similar mistake. - # - # A TypeError can be raised if encoding is None - # - # So we try blindly encoding. - content = str(self.content, errors="replace") - - return content - - def json(self, **kwargs): - r"""Returns the json-encoded content of a response, if any. - - :param \*\*kwargs: Optional arguments that ``json.loads`` takes. - :raises requests.exceptions.JSONDecodeError: If the response body does not - contain valid json. - """ - - if not self.encoding and self.content and len(self.content) > 3: - # No encoding set. JSON RFC 4627 section 3 states we should expect - # UTF-8, -16 or -32. Detect which one to use; If the detection or - # decoding fails, fall back to `self.text` (using charset_normalizer to make - # a best guess). - encoding = guess_json_utf(self.content) - if encoding is not None: - try: - return complexjson.loads(self.content.decode(encoding), **kwargs) - except UnicodeDecodeError: - # Wrong UTF codec detected; usually because it's not UTF-8 - # but some other 8-bit codec. This is an RFC violation, - # and the server didn't bother to tell us what codec *was* - # used. - pass - except JSONDecodeError as e: - raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) - - try: - return complexjson.loads(self.text, **kwargs) - except JSONDecodeError as e: - # Catch JSON-related errors and raise as requests.JSONDecodeError - # This aliases json.JSONDecodeError and simplejson.JSONDecodeError - raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) - - @property - def links(self): - """Returns the parsed header links of the response, if any.""" - - header = self.headers.get("link") - - resolved_links = {} - - if header: - links = parse_header_links(header) - - for link in links: - key = link.get("rel") or link.get("url") - resolved_links[key] = link - - return resolved_links - - def raise_for_status(self): - """Raises :class:`HTTPError`, if one occurred.""" - - http_error_msg = "" - if isinstance(self.reason, bytes): - # We attempt to decode utf-8 first because some servers - # choose to localize their reason strings. If the string - # isn't utf-8, we fall back to iso-8859-1 for all other - # encodings. (See PR #3538) - try: - reason = self.reason.decode("utf-8") - except UnicodeDecodeError: - reason = self.reason.decode("iso-8859-1") - else: - reason = self.reason - - if 400 <= self.status_code < 500: - http_error_msg = ( - f"{self.status_code} Client Error: {reason} for url: {self.url}" - ) - - elif 500 <= self.status_code < 600: - http_error_msg = ( - f"{self.status_code} Server Error: {reason} for url: {self.url}" - ) - - if http_error_msg: - raise HTTPError(http_error_msg, response=self) - - def close(self): - """Releases the connection back to the pool. Once this method has been - called the underlying ``raw`` object must not be accessed again. - - *Note: Should not normally need to be called explicitly.* - """ - if not self._content_consumed: - self.raw.close() - - release_conn = getattr(self.raw, "release_conn", None) - if release_conn is not None: - release_conn() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py deleted file mode 100644 index 9582fa7..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys - -# This code exists for backwards compatibility reasons. -# I don't like it either. Just look the other way. :) - -for package in ('urllib3', 'idna', 'chardet'): - vendored_package = "pip._vendor." + package - locals()[package] = __import__(vendored_package) - # This traversal is apparently necessary such that the identities are - # preserved (requests.packages.urllib3.* is urllib3.*) - for mod in list(sys.modules): - if mod == vendored_package or mod.startswith(vendored_package + '.'): - unprefixed_mod = mod[len("pip._vendor."):] - sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] - -# Kinda cool, though, right? diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py deleted file mode 100644 index dbcf2a7..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py +++ /dev/null @@ -1,833 +0,0 @@ -""" -requests.sessions -~~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). -""" -import os -import sys -import time -from collections import OrderedDict -from datetime import timedelta - -from ._internal_utils import to_native_string -from .adapters import HTTPAdapter -from .auth import _basic_auth_str -from .compat import Mapping, cookielib, urljoin, urlparse -from .cookies import ( - RequestsCookieJar, - cookiejar_from_dict, - extract_cookies_to_jar, - merge_cookies, -) -from .exceptions import ( - ChunkedEncodingError, - ContentDecodingError, - InvalidSchema, - TooManyRedirects, -) -from .hooks import default_hooks, dispatch_hook - -# formerly defined here, reexposed here for backward compatibility -from .models import ( # noqa: F401 - DEFAULT_REDIRECT_LIMIT, - REDIRECT_STATI, - PreparedRequest, - Request, -) -from .status_codes import codes -from .structures import CaseInsensitiveDict -from .utils import ( # noqa: F401 - DEFAULT_PORTS, - default_headers, - get_auth_from_url, - get_environ_proxies, - get_netrc_auth, - requote_uri, - resolve_proxies, - rewind_body, - should_bypass_proxies, - to_key_val_list, -) - -# Preferred clock, based on which one is more accurate on a given system. -if sys.platform == "win32": - preferred_clock = time.perf_counter -else: - preferred_clock = time.time - - -def merge_setting(request_setting, session_setting, dict_class=OrderedDict): - """Determines appropriate setting for a given request, taking into account - the explicit setting on that request, and the setting in the session. If a - setting is a dictionary, they will be merged together using `dict_class` - """ - - if session_setting is None: - return request_setting - - if request_setting is None: - return session_setting - - # Bypass if not a dictionary (e.g. verify) - if not ( - isinstance(session_setting, Mapping) and isinstance(request_setting, Mapping) - ): - return request_setting - - merged_setting = dict_class(to_key_val_list(session_setting)) - merged_setting.update(to_key_val_list(request_setting)) - - # Remove keys that are set to None. Extract keys first to avoid altering - # the dictionary during iteration. - none_keys = [k for (k, v) in merged_setting.items() if v is None] - for key in none_keys: - del merged_setting[key] - - return merged_setting - - -def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): - """Properly merges both requests and session hooks. - - This is necessary because when request_hooks == {'response': []}, the - merge breaks Session hooks entirely. - """ - if session_hooks is None or session_hooks.get("response") == []: - return request_hooks - - if request_hooks is None or request_hooks.get("response") == []: - return session_hooks - - return merge_setting(request_hooks, session_hooks, dict_class) - - -class SessionRedirectMixin: - def get_redirect_target(self, resp): - """Receives a Response. Returns a redirect URI or ``None``""" - # Due to the nature of how requests processes redirects this method will - # be called at least once upon the original response and at least twice - # on each subsequent redirect response (if any). - # If a custom mixin is used to handle this logic, it may be advantageous - # to cache the redirect location onto the response object as a private - # attribute. - if resp.is_redirect: - location = resp.headers["location"] - # Currently the underlying http module on py3 decode headers - # in latin1, but empirical evidence suggests that latin1 is very - # rarely used with non-ASCII characters in HTTP headers. - # It is more likely to get UTF8 header rather than latin1. - # This causes incorrect handling of UTF8 encoded location headers. - # To solve this, we re-encode the location in latin1. - location = location.encode("latin1") - return to_native_string(location, "utf8") - return None - - def should_strip_auth(self, old_url, new_url): - """Decide whether Authorization header should be removed when redirecting""" - old_parsed = urlparse(old_url) - new_parsed = urlparse(new_url) - if old_parsed.hostname != new_parsed.hostname: - return True - # Special case: allow http -> https redirect when using the standard - # ports. This isn't specified by RFC 7235, but is kept to avoid - # breaking backwards compatibility with older versions of requests - # that allowed any redirects on the same host. - if ( - old_parsed.scheme == "http" - and old_parsed.port in (80, None) - and new_parsed.scheme == "https" - and new_parsed.port in (443, None) - ): - return False - - # Handle default port usage corresponding to scheme. - changed_port = old_parsed.port != new_parsed.port - changed_scheme = old_parsed.scheme != new_parsed.scheme - default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) - if ( - not changed_scheme - and old_parsed.port in default_port - and new_parsed.port in default_port - ): - return False - - # Standard case: root URI must match - return changed_port or changed_scheme - - def resolve_redirects( - self, - resp, - req, - stream=False, - timeout=None, - verify=True, - cert=None, - proxies=None, - yield_requests=False, - **adapter_kwargs, - ): - """Receives a Response. Returns a generator of Responses or Requests.""" - - hist = [] # keep track of history - - url = self.get_redirect_target(resp) - previous_fragment = urlparse(req.url).fragment - while url: - prepared_request = req.copy() - - # Update history and keep track of redirects. - # resp.history must ignore the original request in this loop - hist.append(resp) - resp.history = hist[1:] - - try: - resp.content # Consume socket so it can be released - except (ChunkedEncodingError, ContentDecodingError, RuntimeError): - resp.raw.read(decode_content=False) - - if len(resp.history) >= self.max_redirects: - raise TooManyRedirects( - f"Exceeded {self.max_redirects} redirects.", response=resp - ) - - # Release the connection back into the pool. - resp.close() - - # Handle redirection without scheme (see: RFC 1808 Section 4) - if url.startswith("//"): - parsed_rurl = urlparse(resp.url) - url = ":".join([to_native_string(parsed_rurl.scheme), url]) - - # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) - parsed = urlparse(url) - if parsed.fragment == "" and previous_fragment: - parsed = parsed._replace(fragment=previous_fragment) - elif parsed.fragment: - previous_fragment = parsed.fragment - url = parsed.geturl() - - # Facilitate relative 'location' headers, as allowed by RFC 7231. - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - # Compliant with RFC3986, we percent encode the url. - if not parsed.netloc: - url = urljoin(resp.url, requote_uri(url)) - else: - url = requote_uri(url) - - prepared_request.url = to_native_string(url) - - self.rebuild_method(prepared_request, resp) - - # https://github.com/psf/requests/issues/1084 - if resp.status_code not in ( - codes.temporary_redirect, - codes.permanent_redirect, - ): - # https://github.com/psf/requests/issues/3490 - purged_headers = ("Content-Length", "Content-Type", "Transfer-Encoding") - for header in purged_headers: - prepared_request.headers.pop(header, None) - prepared_request.body = None - - headers = prepared_request.headers - headers.pop("Cookie", None) - - # Extract any cookies sent on the response to the cookiejar - # in the new request. Because we've mutated our copied prepared - # request, use the old one that we haven't yet touched. - extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) - merge_cookies(prepared_request._cookies, self.cookies) - prepared_request.prepare_cookies(prepared_request._cookies) - - # Rebuild auth and proxy information. - proxies = self.rebuild_proxies(prepared_request, proxies) - self.rebuild_auth(prepared_request, resp) - - # A failed tell() sets `_body_position` to `object()`. This non-None - # value ensures `rewindable` will be True, allowing us to raise an - # UnrewindableBodyError, instead of hanging the connection. - rewindable = prepared_request._body_position is not None and ( - "Content-Length" in headers or "Transfer-Encoding" in headers - ) - - # Attempt to rewind consumed file-like object. - if rewindable: - rewind_body(prepared_request) - - # Override the original request. - req = prepared_request - - if yield_requests: - yield req - else: - - resp = self.send( - req, - stream=stream, - timeout=timeout, - verify=verify, - cert=cert, - proxies=proxies, - allow_redirects=False, - **adapter_kwargs, - ) - - extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) - - # extract redirect url, if any, for the next loop - url = self.get_redirect_target(resp) - yield resp - - def rebuild_auth(self, prepared_request, response): - """When being redirected we may want to strip authentication from the - request to avoid leaking credentials. This method intelligently removes - and reapplies authentication where possible to avoid credential loss. - """ - headers = prepared_request.headers - url = prepared_request.url - - if "Authorization" in headers and self.should_strip_auth( - response.request.url, url - ): - # If we get redirected to a new host, we should strip out any - # authentication headers. - del headers["Authorization"] - - # .netrc might have more auth for us on our new host. - new_auth = get_netrc_auth(url) if self.trust_env else None - if new_auth is not None: - prepared_request.prepare_auth(new_auth) - - def rebuild_proxies(self, prepared_request, proxies): - """This method re-evaluates the proxy configuration by considering the - environment variables. If we are redirected to a URL covered by - NO_PROXY, we strip the proxy configuration. Otherwise, we set missing - proxy keys for this URL (in case they were stripped by a previous - redirect). - - This method also replaces the Proxy-Authorization header where - necessary. - - :rtype: dict - """ - headers = prepared_request.headers - scheme = urlparse(prepared_request.url).scheme - new_proxies = resolve_proxies(prepared_request, proxies, self.trust_env) - - if "Proxy-Authorization" in headers: - del headers["Proxy-Authorization"] - - try: - username, password = get_auth_from_url(new_proxies[scheme]) - except KeyError: - username, password = None, None - - # urllib3 handles proxy authorization for us in the standard adapter. - # Avoid appending this to TLS tunneled requests where it may be leaked. - if not scheme.startswith('https') and username and password: - headers["Proxy-Authorization"] = _basic_auth_str(username, password) - - return new_proxies - - def rebuild_method(self, prepared_request, response): - """When being redirected we may want to change the method of the request - based on certain specs or browser behavior. - """ - method = prepared_request.method - - # https://tools.ietf.org/html/rfc7231#section-6.4.4 - if response.status_code == codes.see_other and method != "HEAD": - method = "GET" - - # Do what the browsers do, despite standards... - # First, turn 302s into GETs. - if response.status_code == codes.found and method != "HEAD": - method = "GET" - - # Second, if a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in Issue 1704. - if response.status_code == codes.moved and method == "POST": - method = "GET" - - prepared_request.method = method - - -class Session(SessionRedirectMixin): - """A Requests session. - - Provides cookie persistence, connection-pooling, and configuration. - - Basic Usage:: - - >>> import requests - >>> s = requests.Session() - >>> s.get('https://httpbin.org/get') - - - Or as a context manager:: - - >>> with requests.Session() as s: - ... s.get('https://httpbin.org/get') - - """ - - __attrs__ = [ - "headers", - "cookies", - "auth", - "proxies", - "hooks", - "params", - "verify", - "cert", - "adapters", - "stream", - "trust_env", - "max_redirects", - ] - - def __init__(self): - - #: A case-insensitive dictionary of headers to be sent on each - #: :class:`Request ` sent from this - #: :class:`Session `. - self.headers = default_headers() - - #: Default Authentication tuple or object to attach to - #: :class:`Request `. - self.auth = None - - #: Dictionary mapping protocol or protocol and host to the URL of the proxy - #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to - #: be used on each :class:`Request `. - self.proxies = {} - - #: Event-handling hooks. - self.hooks = default_hooks() - - #: Dictionary of querystring data to attach to each - #: :class:`Request `. The dictionary values may be lists for - #: representing multivalued query parameters. - self.params = {} - - #: Stream response content default. - self.stream = False - - #: SSL Verification default. - #: Defaults to `True`, requiring requests to verify the TLS certificate at the - #: remote end. - #: If verify is set to `False`, requests will accept any TLS certificate - #: presented by the server, and will ignore hostname mismatches and/or - #: expired certificates, which will make your application vulnerable to - #: man-in-the-middle (MitM) attacks. - #: Only set this to `False` for testing. - self.verify = True - - #: SSL client certificate default, if String, path to ssl client - #: cert file (.pem). If Tuple, ('cert', 'key') pair. - self.cert = None - - #: Maximum number of redirects allowed. If the request exceeds this - #: limit, a :class:`TooManyRedirects` exception is raised. - #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is - #: 30. - self.max_redirects = DEFAULT_REDIRECT_LIMIT - - #: Trust environment settings for proxy configuration, default - #: authentication and similar. - self.trust_env = True - - #: A CookieJar containing all currently outstanding cookies set on this - #: session. By default it is a - #: :class:`RequestsCookieJar `, but - #: may be any other ``cookielib.CookieJar`` compatible object. - self.cookies = cookiejar_from_dict({}) - - # Default connection adapters. - self.adapters = OrderedDict() - self.mount("https://", HTTPAdapter()) - self.mount("http://", HTTPAdapter()) - - def __enter__(self): - return self - - def __exit__(self, *args): - self.close() - - def prepare_request(self, request): - """Constructs a :class:`PreparedRequest ` for - transmission and returns it. The :class:`PreparedRequest` has settings - merged from the :class:`Request ` instance and those of the - :class:`Session`. - - :param request: :class:`Request` instance to prepare with this - session's settings. - :rtype: requests.PreparedRequest - """ - cookies = request.cookies or {} - - # Bootstrap CookieJar. - if not isinstance(cookies, cookielib.CookieJar): - cookies = cookiejar_from_dict(cookies) - - # Merge with session cookies - merged_cookies = merge_cookies( - merge_cookies(RequestsCookieJar(), self.cookies), cookies - ) - - # Set environment's basic authentication if not explicitly set. - auth = request.auth - if self.trust_env and not auth and not self.auth: - auth = get_netrc_auth(request.url) - - p = PreparedRequest() - p.prepare( - method=request.method.upper(), - url=request.url, - files=request.files, - data=request.data, - json=request.json, - headers=merge_setting( - request.headers, self.headers, dict_class=CaseInsensitiveDict - ), - params=merge_setting(request.params, self.params), - auth=merge_setting(auth, self.auth), - cookies=merged_cookies, - hooks=merge_hooks(request.hooks, self.hooks), - ) - return p - - def request( - self, - method, - url, - params=None, - data=None, - headers=None, - cookies=None, - files=None, - auth=None, - timeout=None, - allow_redirects=True, - proxies=None, - hooks=None, - stream=None, - verify=None, - cert=None, - json=None, - ): - """Constructs a :class:`Request `, prepares it and sends it. - Returns :class:`Response ` object. - - :param method: method for the new :class:`Request` object. - :param url: URL for the new :class:`Request` object. - :param params: (optional) Dictionary or bytes to be sent in the query - string for the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the - :class:`Request`. - :param headers: (optional) Dictionary of HTTP Headers to send with the - :class:`Request`. - :param cookies: (optional) Dict or CookieJar object to send with the - :class:`Request`. - :param files: (optional) Dictionary of ``'filename': file-like-objects`` - for multipart encoding upload. - :param auth: (optional) Auth tuple or callable to enable - Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) How long to wait for the server to send - data before giving up, as a float, or a :ref:`(connect timeout, - read timeout) ` tuple. - :type timeout: float or tuple - :param allow_redirects: (optional) Set to True by default. - :type allow_redirects: bool - :param proxies: (optional) Dictionary mapping protocol or protocol and - hostname to the URL of the proxy. - :param stream: (optional) whether to immediately download the response - content. Defaults to ``False``. - :param verify: (optional) Either a boolean, in which case it controls whether we verify - the server's TLS certificate, or a string, in which case it must be a path - to a CA bundle to use. Defaults to ``True``. When set to - ``False``, requests will accept any TLS certificate presented by - the server, and will ignore hostname mismatches and/or expired - certificates, which will make your application vulnerable to - man-in-the-middle (MitM) attacks. Setting verify to ``False`` - may be useful during local development or testing. - :param cert: (optional) if String, path to ssl client cert file (.pem). - If Tuple, ('cert', 'key') pair. - :rtype: requests.Response - """ - # Create the Request. - req = Request( - method=method.upper(), - url=url, - headers=headers, - files=files, - data=data or {}, - json=json, - params=params or {}, - auth=auth, - cookies=cookies, - hooks=hooks, - ) - prep = self.prepare_request(req) - - proxies = proxies or {} - - settings = self.merge_environment_settings( - prep.url, proxies, stream, verify, cert - ) - - # Send the request. - send_kwargs = { - "timeout": timeout, - "allow_redirects": allow_redirects, - } - send_kwargs.update(settings) - resp = self.send(prep, **send_kwargs) - - return resp - - def get(self, url, **kwargs): - r"""Sends a GET request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", True) - return self.request("GET", url, **kwargs) - - def options(self, url, **kwargs): - r"""Sends a OPTIONS request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", True) - return self.request("OPTIONS", url, **kwargs) - - def head(self, url, **kwargs): - r"""Sends a HEAD request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - kwargs.setdefault("allow_redirects", False) - return self.request("HEAD", url, **kwargs) - - def post(self, url, data=None, json=None, **kwargs): - r"""Sends a POST request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) json to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("POST", url, data=data, json=json, **kwargs) - - def put(self, url, data=None, **kwargs): - r"""Sends a PUT request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("PUT", url, data=data, **kwargs) - - def patch(self, url, data=None, **kwargs): - r"""Sends a PATCH request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("PATCH", url, data=data, **kwargs) - - def delete(self, url, **kwargs): - r"""Sends a DELETE request. Returns :class:`Response` object. - - :param url: URL for the new :class:`Request` object. - :param \*\*kwargs: Optional arguments that ``request`` takes. - :rtype: requests.Response - """ - - return self.request("DELETE", url, **kwargs) - - def send(self, request, **kwargs): - """Send a given PreparedRequest. - - :rtype: requests.Response - """ - # Set defaults that the hooks can utilize to ensure they always have - # the correct parameters to reproduce the previous request. - kwargs.setdefault("stream", self.stream) - kwargs.setdefault("verify", self.verify) - kwargs.setdefault("cert", self.cert) - if "proxies" not in kwargs: - kwargs["proxies"] = resolve_proxies(request, self.proxies, self.trust_env) - - # It's possible that users might accidentally send a Request object. - # Guard against that specific failure case. - if isinstance(request, Request): - raise ValueError("You can only send PreparedRequests.") - - # Set up variables needed for resolve_redirects and dispatching of hooks - allow_redirects = kwargs.pop("allow_redirects", True) - stream = kwargs.get("stream") - hooks = request.hooks - - # Get the appropriate adapter to use - adapter = self.get_adapter(url=request.url) - - # Start time (approximately) of the request - start = preferred_clock() - - # Send the request - r = adapter.send(request, **kwargs) - - # Total elapsed time of the request (approximately) - elapsed = preferred_clock() - start - r.elapsed = timedelta(seconds=elapsed) - - # Response manipulation hooks - r = dispatch_hook("response", hooks, r, **kwargs) - - # Persist cookies - if r.history: - - # If the hooks create history then we want those cookies too - for resp in r.history: - extract_cookies_to_jar(self.cookies, resp.request, resp.raw) - - extract_cookies_to_jar(self.cookies, request, r.raw) - - # Resolve redirects if allowed. - if allow_redirects: - # Redirect resolving generator. - gen = self.resolve_redirects(r, request, **kwargs) - history = [resp for resp in gen] - else: - history = [] - - # Shuffle things around if there's history. - if history: - # Insert the first (original) request at the start - history.insert(0, r) - # Get the last request made - r = history.pop() - r.history = history - - # If redirects aren't being followed, store the response on the Request for Response.next(). - if not allow_redirects: - try: - r._next = next( - self.resolve_redirects(r, request, yield_requests=True, **kwargs) - ) - except StopIteration: - pass - - if not stream: - r.content - - return r - - def merge_environment_settings(self, url, proxies, stream, verify, cert): - """ - Check the environment and merge it with some settings. - - :rtype: dict - """ - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - no_proxy = proxies.get("no_proxy") if proxies is not None else None - env_proxies = get_environ_proxies(url, no_proxy=no_proxy) - for (k, v) in env_proxies.items(): - proxies.setdefault(k, v) - - # Look for requests environment configuration - # and be compatible with cURL. - if verify is True or verify is None: - verify = ( - os.environ.get("REQUESTS_CA_BUNDLE") - or os.environ.get("CURL_CA_BUNDLE") - or verify - ) - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) - - return {"proxies": proxies, "stream": stream, "verify": verify, "cert": cert} - - def get_adapter(self, url): - """ - Returns the appropriate connection adapter for the given URL. - - :rtype: requests.adapters.BaseAdapter - """ - for (prefix, adapter) in self.adapters.items(): - - if url.lower().startswith(prefix.lower()): - return adapter - - # Nothing matches :-/ - raise InvalidSchema(f"No connection adapters were found for {url!r}") - - def close(self): - """Closes all adapters and as such the session""" - for v in self.adapters.values(): - v.close() - - def mount(self, prefix, adapter): - """Registers a connection adapter to a prefix. - - Adapters are sorted in descending order by prefix length. - """ - self.adapters[prefix] = adapter - keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] - - for key in keys_to_move: - self.adapters[key] = self.adapters.pop(key) - - def __getstate__(self): - state = {attr: getattr(self, attr, None) for attr in self.__attrs__} - return state - - def __setstate__(self, state): - for attr, value in state.items(): - setattr(self, attr, value) - - -def session(): - """ - Returns a :class:`Session` for context-management. - - .. deprecated:: 1.0.0 - - This method has been deprecated since version 1.0.0 and is only kept for - backwards compatibility. New code should use :class:`~requests.sessions.Session` - to create a session. This may be removed at a future date. - - :rtype: Session - """ - return Session() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py deleted file mode 100644 index 4bd072b..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py +++ /dev/null @@ -1,128 +0,0 @@ -r""" -The ``codes`` object defines a mapping from common names for HTTP statuses -to their numerical codes, accessible either as attributes or as dictionary -items. - -Example:: - - >>> import requests - >>> requests.codes['temporary_redirect'] - 307 - >>> requests.codes.teapot - 418 - >>> requests.codes['\o/'] - 200 - -Some codes have multiple names, and both upper- and lower-case versions of -the names are allowed. For example, ``codes.ok``, ``codes.OK``, and -``codes.okay`` all correspond to the HTTP status code 200. -""" - -from .structures import LookupDict - -_codes = { - # Informational. - 100: ("continue",), - 101: ("switching_protocols",), - 102: ("processing",), - 103: ("checkpoint",), - 122: ("uri_too_long", "request_uri_too_long"), - 200: ("ok", "okay", "all_ok", "all_okay", "all_good", "\\o/", "✓"), - 201: ("created",), - 202: ("accepted",), - 203: ("non_authoritative_info", "non_authoritative_information"), - 204: ("no_content",), - 205: ("reset_content", "reset"), - 206: ("partial_content", "partial"), - 207: ("multi_status", "multiple_status", "multi_stati", "multiple_stati"), - 208: ("already_reported",), - 226: ("im_used",), - # Redirection. - 300: ("multiple_choices",), - 301: ("moved_permanently", "moved", "\\o-"), - 302: ("found",), - 303: ("see_other", "other"), - 304: ("not_modified",), - 305: ("use_proxy",), - 306: ("switch_proxy",), - 307: ("temporary_redirect", "temporary_moved", "temporary"), - 308: ( - "permanent_redirect", - "resume_incomplete", - "resume", - ), # "resume" and "resume_incomplete" to be removed in 3.0 - # Client Error. - 400: ("bad_request", "bad"), - 401: ("unauthorized",), - 402: ("payment_required", "payment"), - 403: ("forbidden",), - 404: ("not_found", "-o-"), - 405: ("method_not_allowed", "not_allowed"), - 406: ("not_acceptable",), - 407: ("proxy_authentication_required", "proxy_auth", "proxy_authentication"), - 408: ("request_timeout", "timeout"), - 409: ("conflict",), - 410: ("gone",), - 411: ("length_required",), - 412: ("precondition_failed", "precondition"), - 413: ("request_entity_too_large",), - 414: ("request_uri_too_large",), - 415: ("unsupported_media_type", "unsupported_media", "media_type"), - 416: ( - "requested_range_not_satisfiable", - "requested_range", - "range_not_satisfiable", - ), - 417: ("expectation_failed",), - 418: ("im_a_teapot", "teapot", "i_am_a_teapot"), - 421: ("misdirected_request",), - 422: ("unprocessable_entity", "unprocessable"), - 423: ("locked",), - 424: ("failed_dependency", "dependency"), - 425: ("unordered_collection", "unordered"), - 426: ("upgrade_required", "upgrade"), - 428: ("precondition_required", "precondition"), - 429: ("too_many_requests", "too_many"), - 431: ("header_fields_too_large", "fields_too_large"), - 444: ("no_response", "none"), - 449: ("retry_with", "retry"), - 450: ("blocked_by_windows_parental_controls", "parental_controls"), - 451: ("unavailable_for_legal_reasons", "legal_reasons"), - 499: ("client_closed_request",), - # Server Error. - 500: ("internal_server_error", "server_error", "/o\\", "✗"), - 501: ("not_implemented",), - 502: ("bad_gateway",), - 503: ("service_unavailable", "unavailable"), - 504: ("gateway_timeout",), - 505: ("http_version_not_supported", "http_version"), - 506: ("variant_also_negotiates",), - 507: ("insufficient_storage",), - 509: ("bandwidth_limit_exceeded", "bandwidth"), - 510: ("not_extended",), - 511: ("network_authentication_required", "network_auth", "network_authentication"), -} - -codes = LookupDict(name="status_codes") - - -def _init(): - for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(("\\", "/")): - setattr(codes, title.upper(), code) - - def doc(code): - names = ", ".join(f"``{n}``" for n in _codes[code]) - return "* %d: %s" % (code, names) - - global __doc__ - __doc__ = ( - __doc__ + "\n" + "\n".join(doc(code) for code in sorted(_codes)) - if __doc__ is not None - else None - ) - - -_init() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py deleted file mode 100644 index 188e13e..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -from collections import OrderedDict - -from .compat import Mapping, MutableMapping - - -class CaseInsensitiveDict(MutableMapping): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``MutableMapping`` as well as dict's ``copy``. Also - provides ``lower_items``. - - All keys are expected to be strings. The structure remembers the - case of the last key to be set, and ``iter(instance)``, - ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` - will contain case-sensitive keys. However, querying and contains - testing is case insensitive:: - - cid = CaseInsensitiveDict() - cid['Accept'] = 'application/json' - cid['aCCEPT'] == 'application/json' # True - list(cid) == ['Accept'] # True - - For example, ``headers['content-encoding']`` will return the - value of a ``'Content-Encoding'`` response header, regardless - of how the header name was originally stored. - - If the constructor, ``.update``, or equality comparison - operations are given keys that have equal ``.lower()``s, the - behavior is undefined. - """ - - def __init__(self, data=None, **kwargs): - self._store = OrderedDict() - if data is None: - data = {} - self.update(data, **kwargs) - - def __setitem__(self, key, value): - # Use the lowercased key for lookups, but store the actual - # key alongside the value. - self._store[key.lower()] = (key, value) - - def __getitem__(self, key): - return self._store[key.lower()][1] - - def __delitem__(self, key): - del self._store[key.lower()] - - def __iter__(self): - return (casedkey for casedkey, mappedvalue in self._store.values()) - - def __len__(self): - return len(self._store) - - def lower_items(self): - """Like iteritems(), but with all lowercase keys.""" - return ((lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items()) - - def __eq__(self, other): - if isinstance(other, Mapping): - other = CaseInsensitiveDict(other) - else: - return NotImplemented - # Compare insensitively - return dict(self.lower_items()) == dict(other.lower_items()) - - # Copy is required - def copy(self): - return CaseInsensitiveDict(self._store.values()) - - def __repr__(self): - return str(dict(self.items())) - - -class LookupDict(dict): - """Dictionary lookup object.""" - - def __init__(self, name=None): - self.name = name - super().__init__() - - def __repr__(self): - return f"" - - def __getitem__(self, key): - # We allow fall-through here, so values default to None - - return self.__dict__.get(key, None) - - def get(self, key, default=None): - return self.__dict__.get(key, default) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py b/.venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py deleted file mode 100644 index 36607ed..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py +++ /dev/null @@ -1,1094 +0,0 @@ -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -import codecs -import contextlib -import io -import os -import re -import socket -import struct -import sys -import tempfile -import warnings -import zipfile -from collections import OrderedDict - -from pip._vendor.urllib3.util import make_headers, parse_url - -from . import certs -from .__version__ import __version__ - -# to_native_string is unused here, but imported here for backwards compatibility -from ._internal_utils import ( # noqa: F401 - _HEADER_VALIDATORS_BYTE, - _HEADER_VALIDATORS_STR, - HEADER_VALIDATORS, - to_native_string, -) -from .compat import ( - Mapping, - basestring, - bytes, - getproxies, - getproxies_environment, - integer_types, -) -from .compat import parse_http_list as _parse_list_header -from .compat import ( - proxy_bypass, - proxy_bypass_environment, - quote, - str, - unquote, - urlparse, - urlunparse, -) -from .cookies import cookiejar_from_dict -from .exceptions import ( - FileModeWarning, - InvalidHeader, - InvalidURL, - UnrewindableBodyError, -) -from .structures import CaseInsensitiveDict - -NETRC_FILES = (".netrc", "_netrc") - -DEFAULT_CA_BUNDLE_PATH = certs.where() - -DEFAULT_PORTS = {"http": 80, "https": 443} - -# Ensure that ', ' is used to preserve previous delimiter behavior. -DEFAULT_ACCEPT_ENCODING = ", ".join( - re.split(r",\s*", make_headers(accept_encoding=True)["accept-encoding"]) -) - - -if sys.platform == "win32": - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host): - try: - import winreg - except ImportError: - return False - - try: - internetSettings = winreg.OpenKey( - winreg.HKEY_CURRENT_USER, - r"Software\Microsoft\Windows\CurrentVersion\Internet Settings", - ) - # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it - proxyEnable = int(winreg.QueryValueEx(internetSettings, "ProxyEnable")[0]) - # ProxyOverride is almost always a string - proxyOverride = winreg.QueryValueEx(internetSettings, "ProxyOverride")[0] - except (OSError, ValueError): - return False - if not proxyEnable or not proxyOverride: - return False - - # make a check value list from the registry entry: replace the - # '' string by the localhost entry and the corresponding - # canonical entry. - proxyOverride = proxyOverride.split(";") - # now check if we match one of the registry values. - for test in proxyOverride: - if test == "": - if "." not in host: - return True - test = test.replace(".", r"\.") # mask dots - test = test.replace("*", r".*") # change glob sequence - test = test.replace("?", r".") # change glob char - if re.match(test, host, re.I): - return True - return False - - def proxy_bypass(host): # noqa - """Return True, if the host should be bypassed. - - Checks proxy settings gathered from the environment, if specified, - or the registry. - """ - if getproxies_environment(): - return proxy_bypass_environment(host) - else: - return proxy_bypass_registry(host) - - -def dict_to_sequence(d): - """Returns an internal sequence dictionary update.""" - - if hasattr(d, "items"): - d = d.items() - - return d - - -def super_len(o): - total_length = None - current_position = 0 - - if hasattr(o, "__len__"): - total_length = len(o) - - elif hasattr(o, "len"): - total_length = o.len - - elif hasattr(o, "fileno"): - try: - fileno = o.fileno() - except (io.UnsupportedOperation, AttributeError): - # AttributeError is a surprising exception, seeing as how we've just checked - # that `hasattr(o, 'fileno')`. It happens for objects obtained via - # `Tarfile.extractfile()`, per issue 5229. - pass - else: - total_length = os.fstat(fileno).st_size - - # Having used fstat to determine the file length, we need to - # confirm that this file was opened up in binary mode. - if "b" not in o.mode: - warnings.warn( - ( - "Requests has determined the content-length for this " - "request using the binary size of the file: however, the " - "file has been opened in text mode (i.e. without the 'b' " - "flag in the mode). This may lead to an incorrect " - "content-length. In Requests 3.0, support will be removed " - "for files in text mode." - ), - FileModeWarning, - ) - - if hasattr(o, "tell"): - try: - current_position = o.tell() - except OSError: - # This can happen in some weird situations, such as when the file - # is actually a special file descriptor like stdin. In this - # instance, we don't know what the length is, so set it to zero and - # let requests chunk it instead. - if total_length is not None: - current_position = total_length - else: - if hasattr(o, "seek") and total_length is None: - # StringIO and BytesIO have seek but no usable fileno - try: - # seek to end of file - o.seek(0, 2) - total_length = o.tell() - - # seek back to current position to support - # partially read file-like objects - o.seek(current_position or 0) - except OSError: - total_length = 0 - - if total_length is None: - total_length = 0 - - return max(0, total_length - current_position) - - -def get_netrc_auth(url, raise_errors=False): - """Returns the Requests tuple auth for a given url from netrc.""" - - netrc_file = os.environ.get("NETRC") - if netrc_file is not None: - netrc_locations = (netrc_file,) - else: - netrc_locations = (f"~/{f}" for f in NETRC_FILES) - - try: - from netrc import NetrcParseError, netrc - - netrc_path = None - - for f in netrc_locations: - try: - loc = os.path.expanduser(f) - except KeyError: - # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See https://bugs.python.org/issue20164 & - # https://github.com/psf/requests/issues/1846 - return - - if os.path.exists(loc): - netrc_path = loc - break - - # Abort early if there isn't one. - if netrc_path is None: - return - - ri = urlparse(url) - - # Strip port numbers from netloc. This weird `if...encode`` dance is - # used for Python 3.2, which doesn't support unicode literals. - splitstr = b":" - if isinstance(url, str): - splitstr = splitstr.decode("ascii") - host = ri.netloc.split(splitstr)[0] - - try: - _netrc = netrc(netrc_path).authenticators(host) - if _netrc: - # Return with login / password - login_i = 0 if _netrc[0] else 1 - return (_netrc[login_i], _netrc[2]) - except (NetrcParseError, OSError): - # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth unless explicitly asked to raise errors. - if raise_errors: - raise - - # App Engine hackiness. - except (ImportError, AttributeError): - pass - - -def guess_filename(obj): - """Tries to guess the filename of the given object.""" - name = getattr(obj, "name", None) - if name and isinstance(name, basestring) and name[0] != "<" and name[-1] != ">": - return os.path.basename(name) - - -def extract_zipped_paths(path): - """Replace nonexistent paths that look like they refer to a member of a zip - archive with the location of an extracted copy of the target, or else - just return the provided path unchanged. - """ - if os.path.exists(path): - # this is already a valid path, no need to do anything further - return path - - # find the first valid part of the provided path and treat that as a zip archive - # assume the rest of the path is the name of a member in the archive - archive, member = os.path.split(path) - while archive and not os.path.exists(archive): - archive, prefix = os.path.split(archive) - if not prefix: - # If we don't check for an empty prefix after the split (in other words, archive remains unchanged after the split), - # we _can_ end up in an infinite loop on a rare corner case affecting a small number of users - break - member = "/".join([prefix, member]) - - if not zipfile.is_zipfile(archive): - return path - - zip_file = zipfile.ZipFile(archive) - if member not in zip_file.namelist(): - return path - - # we have a valid zip archive and a valid member of that archive - tmp = tempfile.gettempdir() - extracted_path = os.path.join(tmp, member.split("/")[-1]) - if not os.path.exists(extracted_path): - # use read + write to avoid the creating nested folders, we only want the file, avoids mkdir racing condition - with atomic_open(extracted_path) as file_handler: - file_handler.write(zip_file.read(member)) - return extracted_path - - -@contextlib.contextmanager -def atomic_open(filename): - """Write a file to the disk in an atomic fashion""" - tmp_descriptor, tmp_name = tempfile.mkstemp(dir=os.path.dirname(filename)) - try: - with os.fdopen(tmp_descriptor, "wb") as tmp_handler: - yield tmp_handler - os.replace(tmp_name, filename) - except BaseException: - os.remove(tmp_name) - raise - - -def from_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. Unless it can not be represented as such, return an - OrderedDict, e.g., - - :: - - >>> from_key_val_list([('key', 'val')]) - OrderedDict([('key', 'val')]) - >>> from_key_val_list('string') - Traceback (most recent call last): - ... - ValueError: cannot encode objects that are not 2-tuples - >>> from_key_val_list({'key': 'val'}) - OrderedDict([('key', 'val')]) - - :rtype: OrderedDict - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError("cannot encode objects that are not 2-tuples") - - return OrderedDict(value) - - -def to_key_val_list(value): - """Take an object and test to see if it can be represented as a - dictionary. If it can be, return a list of tuples, e.g., - - :: - - >>> to_key_val_list([('key', 'val')]) - [('key', 'val')] - >>> to_key_val_list({'key': 'val'}) - [('key', 'val')] - >>> to_key_val_list('string') - Traceback (most recent call last): - ... - ValueError: cannot encode objects that are not 2-tuples - - :rtype: list - """ - if value is None: - return None - - if isinstance(value, (str, bytes, bool, int)): - raise ValueError("cannot encode objects that are not 2-tuples") - - if isinstance(value, Mapping): - value = value.items() - - return list(value) - - -# From mitsuhiko/werkzeug (used with permission). -def parse_list_header(value): - """Parse lists as described by RFC 2068 Section 2. - - In particular, parse comma-separated lists where the elements of - the list may include quoted-strings. A quoted-string could - contain a comma. A non-quoted string could have quotes in the - middle. Quotes are removed automatically after parsing. - - It basically works like :func:`parse_set_header` just that items - may appear multiple times and case sensitivity is preserved. - - The return value is a standard :class:`list`: - - >>> parse_list_header('token, "quoted value"') - ['token', 'quoted value'] - - To create a header from the :class:`list` again, use the - :func:`dump_header` function. - - :param value: a string with a list header. - :return: :class:`list` - :rtype: list - """ - result = [] - for item in _parse_list_header(value): - if item[:1] == item[-1:] == '"': - item = unquote_header_value(item[1:-1]) - result.append(item) - return result - - -# From mitsuhiko/werkzeug (used with permission). -def parse_dict_header(value): - """Parse lists of key, value pairs as described by RFC 2068 Section 2 and - convert them into a python dict: - - >>> d = parse_dict_header('foo="is a fish", bar="as well"') - >>> type(d) is dict - True - >>> sorted(d.items()) - [('bar', 'as well'), ('foo', 'is a fish')] - - If there is no value for a key it will be `None`: - - >>> parse_dict_header('key_without_value') - {'key_without_value': None} - - To create a header from the :class:`dict` again, use the - :func:`dump_header` function. - - :param value: a string with a dict header. - :return: :class:`dict` - :rtype: dict - """ - result = {} - for item in _parse_list_header(value): - if "=" not in item: - result[item] = None - continue - name, value = item.split("=", 1) - if value[:1] == value[-1:] == '"': - value = unquote_header_value(value[1:-1]) - result[name] = value - return result - - -# From mitsuhiko/werkzeug (used with permission). -def unquote_header_value(value, is_filename=False): - r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). - This does not use the real unquoting but what browsers are actually - using for quoting. - - :param value: the header value to unquote. - :rtype: str - """ - if value and value[0] == value[-1] == '"': - # this is not the real unquoting, but fixing this so that the - # RFC is met will result in bugs with internet explorer and - # probably some other browsers as well. IE for example is - # uploading files with "C:\foo\bar.txt" as filename - value = value[1:-1] - - # if this is a filename and the starting characters look like - # a UNC path, then just return the value without quotes. Using the - # replace sequence below on a UNC path has the effect of turning - # the leading double slash into a single slash and then - # _fix_ie_filename() doesn't work correctly. See #458. - if not is_filename or value[:2] != "\\\\": - return value.replace("\\\\", "\\").replace('\\"', '"') - return value - - -def dict_from_cookiejar(cj): - """Returns a key/value dictionary from a CookieJar. - - :param cj: CookieJar object to extract cookies from. - :rtype: dict - """ - - cookie_dict = {} - - for cookie in cj: - cookie_dict[cookie.name] = cookie.value - - return cookie_dict - - -def add_dict_to_cookiejar(cj, cookie_dict): - """Returns a CookieJar from a key/value dictionary. - - :param cj: CookieJar to insert cookies into. - :param cookie_dict: Dict of key/values to insert into CookieJar. - :rtype: CookieJar - """ - - return cookiejar_from_dict(cookie_dict, cj) - - -def get_encodings_from_content(content): - """Returns encodings from given content string. - - :param content: bytestring to extract encodings from. - """ - warnings.warn( - ( - "In requests 3.0, get_encodings_from_content will be removed. For " - "more information, please see the discussion on issue #2266. (This" - " warning should only appear once.)" - ), - DeprecationWarning, - ) - - charset_re = re.compile(r']', flags=re.I) - pragma_re = re.compile(r']', flags=re.I) - xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') - - return ( - charset_re.findall(content) - + pragma_re.findall(content) - + xml_re.findall(content) - ) - - -def _parse_content_type_header(header): - """Returns content type and parameters from given header - - :param header: string - :return: tuple containing content type and dictionary of - parameters - """ - - tokens = header.split(";") - content_type, params = tokens[0].strip(), tokens[1:] - params_dict = {} - items_to_strip = "\"' " - - for param in params: - param = param.strip() - if param: - key, value = param, True - index_of_equals = param.find("=") - if index_of_equals != -1: - key = param[:index_of_equals].strip(items_to_strip) - value = param[index_of_equals + 1 :].strip(items_to_strip) - params_dict[key.lower()] = value - return content_type, params_dict - - -def get_encoding_from_headers(headers): - """Returns encodings from given HTTP Header Dict. - - :param headers: dictionary to extract encoding from. - :rtype: str - """ - - content_type = headers.get("content-type") - - if not content_type: - return None - - content_type, params = _parse_content_type_header(content_type) - - if "charset" in params: - return params["charset"].strip("'\"") - - if "text" in content_type: - return "ISO-8859-1" - - if "application/json" in content_type: - # Assume UTF-8 based on RFC 4627: https://www.ietf.org/rfc/rfc4627.txt since the charset was unset - return "utf-8" - - -def stream_decode_response_unicode(iterator, r): - """Stream decodes an iterator.""" - - if r.encoding is None: - yield from iterator - return - - decoder = codecs.getincrementaldecoder(r.encoding)(errors="replace") - for chunk in iterator: - rv = decoder.decode(chunk) - if rv: - yield rv - rv = decoder.decode(b"", final=True) - if rv: - yield rv - - -def iter_slices(string, slice_length): - """Iterate over slices of a string.""" - pos = 0 - if slice_length is None or slice_length <= 0: - slice_length = len(string) - while pos < len(string): - yield string[pos : pos + slice_length] - pos += slice_length - - -def get_unicode_from_response(r): - """Returns the requested content back in unicode. - - :param r: Response object to get unicode content from. - - Tried: - - 1. charset from content-type - 2. fall back and replace all unicode characters - - :rtype: str - """ - warnings.warn( - ( - "In requests 3.0, get_unicode_from_response will be removed. For " - "more information, please see the discussion on issue #2266. (This" - " warning should only appear once.)" - ), - DeprecationWarning, - ) - - tried_encodings = [] - - # Try charset from content-type - encoding = get_encoding_from_headers(r.headers) - - if encoding: - try: - return str(r.content, encoding) - except UnicodeError: - tried_encodings.append(encoding) - - # Fall back: - try: - return str(r.content, encoding, errors="replace") - except TypeError: - return r.content - - -# The unreserved URI characters (RFC 3986) -UNRESERVED_SET = frozenset( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~" -) - - -def unquote_unreserved(uri): - """Un-escape any percent-escape sequences in a URI that are unreserved - characters. This leaves all reserved, illegal and non-ASCII bytes encoded. - - :rtype: str - """ - parts = uri.split("%") - for i in range(1, len(parts)): - h = parts[i][0:2] - if len(h) == 2 and h.isalnum(): - try: - c = chr(int(h, 16)) - except ValueError: - raise InvalidURL(f"Invalid percent-escape sequence: '{h}'") - - if c in UNRESERVED_SET: - parts[i] = c + parts[i][2:] - else: - parts[i] = f"%{parts[i]}" - else: - parts[i] = f"%{parts[i]}" - return "".join(parts) - - -def requote_uri(uri): - """Re-quote the given URI. - - This function passes the given URI through an unquote/quote cycle to - ensure that it is fully and consistently quoted. - - :rtype: str - """ - safe_with_percent = "!#$%&'()*+,/:;=?@[]~" - safe_without_percent = "!#$&'()*+,/:;=?@[]~" - try: - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, - # unreserved, or '%') - return quote(unquote_unreserved(uri), safe=safe_with_percent) - except InvalidURL: - # We couldn't unquote the given URI, so let's try quoting it, but - # there may be unquoted '%'s in the URI. We need to make sure they're - # properly quoted so they do not cause issues elsewhere. - return quote(uri, safe=safe_without_percent) - - -def address_in_network(ip, net): - """This function allows you to check if an IP belongs to a network subnet - - Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 - returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 - - :rtype: bool - """ - ipaddr = struct.unpack("=L", socket.inet_aton(ip))[0] - netaddr, bits = net.split("/") - netmask = struct.unpack("=L", socket.inet_aton(dotted_netmask(int(bits))))[0] - network = struct.unpack("=L", socket.inet_aton(netaddr))[0] & netmask - return (ipaddr & netmask) == (network & netmask) - - -def dotted_netmask(mask): - """Converts mask from /xx format to xxx.xxx.xxx.xxx - - Example: if mask is 24 function returns 255.255.255.0 - - :rtype: str - """ - bits = 0xFFFFFFFF ^ (1 << 32 - mask) - 1 - return socket.inet_ntoa(struct.pack(">I", bits)) - - -def is_ipv4_address(string_ip): - """ - :rtype: bool - """ - try: - socket.inet_aton(string_ip) - except OSError: - return False - return True - - -def is_valid_cidr(string_network): - """ - Very simple check of the cidr format in no_proxy variable. - - :rtype: bool - """ - if string_network.count("/") == 1: - try: - mask = int(string_network.split("/")[1]) - except ValueError: - return False - - if mask < 1 or mask > 32: - return False - - try: - socket.inet_aton(string_network.split("/")[0]) - except OSError: - return False - else: - return False - return True - - -@contextlib.contextmanager -def set_environ(env_name, value): - """Set the environment variable 'env_name' to 'value' - - Save previous value, yield, and then restore the previous value stored in - the environment variable 'env_name'. - - If 'value' is None, do nothing""" - value_changed = value is not None - if value_changed: - old_value = os.environ.get(env_name) - os.environ[env_name] = value - try: - yield - finally: - if value_changed: - if old_value is None: - del os.environ[env_name] - else: - os.environ[env_name] = old_value - - -def should_bypass_proxies(url, no_proxy): - """ - Returns whether we should bypass proxies or not. - - :rtype: bool - """ - # Prioritize lowercase environment variables over uppercase - # to keep a consistent behaviour with other http projects (curl, wget). - def get_proxy(key): - return os.environ.get(key) or os.environ.get(key.upper()) - - # First check whether no_proxy is defined. If it is, check that the URL - # we're getting isn't in the no_proxy list. - no_proxy_arg = no_proxy - if no_proxy is None: - no_proxy = get_proxy("no_proxy") - parsed = urlparse(url) - - if parsed.hostname is None: - # URLs don't always have hostnames, e.g. file:/// urls. - return True - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the hostname, both with and without the port. - no_proxy = (host for host in no_proxy.replace(" ", "").split(",") if host) - - if is_ipv4_address(parsed.hostname): - for proxy_ip in no_proxy: - if is_valid_cidr(proxy_ip): - if address_in_network(parsed.hostname, proxy_ip): - return True - elif parsed.hostname == proxy_ip: - # If no_proxy ip was defined in plain IP notation instead of cidr notation & - # matches the IP of the index - return True - else: - host_with_port = parsed.hostname - if parsed.port: - host_with_port += f":{parsed.port}" - - for host in no_proxy: - if parsed.hostname.endswith(host) or host_with_port.endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return True - - with set_environ("no_proxy", no_proxy_arg): - # parsed.hostname can be `None` in cases such as a file URI. - try: - bypass = proxy_bypass(parsed.hostname) - except (TypeError, socket.gaierror): - bypass = False - - if bypass: - return True - - return False - - -def get_environ_proxies(url, no_proxy=None): - """ - Return a dict of environment proxies. - - :rtype: dict - """ - if should_bypass_proxies(url, no_proxy=no_proxy): - return {} - else: - return getproxies() - - -def select_proxy(url, proxies): - """Select a proxy for the url, if applicable. - - :param url: The url being for the request - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - """ - proxies = proxies or {} - urlparts = urlparse(url) - if urlparts.hostname is None: - return proxies.get(urlparts.scheme, proxies.get("all")) - - proxy_keys = [ - urlparts.scheme + "://" + urlparts.hostname, - urlparts.scheme, - "all://" + urlparts.hostname, - "all", - ] - proxy = None - for proxy_key in proxy_keys: - if proxy_key in proxies: - proxy = proxies[proxy_key] - break - - return proxy - - -def resolve_proxies(request, proxies, trust_env=True): - """This method takes proxy information from a request and configuration - input to resolve a mapping of target proxies. This will consider settings - such a NO_PROXY to strip proxy configurations. - - :param request: Request or PreparedRequest - :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs - :param trust_env: Boolean declaring whether to trust environment configs - - :rtype: dict - """ - proxies = proxies if proxies is not None else {} - url = request.url - scheme = urlparse(url).scheme - no_proxy = proxies.get("no_proxy") - new_proxies = proxies.copy() - - if trust_env and not should_bypass_proxies(url, no_proxy=no_proxy): - environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) - - proxy = environ_proxies.get(scheme, environ_proxies.get("all")) - - if proxy: - new_proxies.setdefault(scheme, proxy) - return new_proxies - - -def default_user_agent(name="python-requests"): - """ - Return a string representing the default user agent. - - :rtype: str - """ - return f"{name}/{__version__}" - - -def default_headers(): - """ - :rtype: requests.structures.CaseInsensitiveDict - """ - return CaseInsensitiveDict( - { - "User-Agent": default_user_agent(), - "Accept-Encoding": DEFAULT_ACCEPT_ENCODING, - "Accept": "*/*", - "Connection": "keep-alive", - } - ) - - -def parse_header_links(value): - """Return a list of parsed link headers proxies. - - i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" - - :rtype: list - """ - - links = [] - - replace_chars = " '\"" - - value = value.strip(replace_chars) - if not value: - return links - - for val in re.split(", *<", value): - try: - url, params = val.split(";", 1) - except ValueError: - url, params = val, "" - - link = {"url": url.strip("<> '\"")} - - for param in params.split(";"): - try: - key, value = param.split("=") - except ValueError: - break - - link[key.strip(replace_chars)] = value.strip(replace_chars) - - links.append(link) - - return links - - -# Null bytes; no need to recreate these on each call to guess_json_utf -_null = "\x00".encode("ascii") # encoding to ASCII for Python 3 -_null2 = _null * 2 -_null3 = _null * 3 - - -def guess_json_utf(data): - """ - :rtype: str - """ - # JSON always starts with two ASCII characters, so detection is as - # easy as counting the nulls and from their location and count - # determine the encoding. Also detect a BOM, if present. - sample = data[:4] - if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): - return "utf-32" # BOM included - if sample[:3] == codecs.BOM_UTF8: - return "utf-8-sig" # BOM included, MS style (discouraged) - if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): - return "utf-16" # BOM included - nullcount = sample.count(_null) - if nullcount == 0: - return "utf-8" - if nullcount == 2: - if sample[::2] == _null2: # 1st and 3rd are null - return "utf-16-be" - if sample[1::2] == _null2: # 2nd and 4th are null - return "utf-16-le" - # Did not detect 2 valid UTF-16 ascii-range characters - if nullcount == 3: - if sample[:3] == _null3: - return "utf-32-be" - if sample[1:] == _null3: - return "utf-32-le" - # Did not detect a valid UTF-32 ascii-range character - return None - - -def prepend_scheme_if_needed(url, new_scheme): - """Given a URL that may or may not have a scheme, prepend the given scheme. - Does not replace a present scheme with the one provided as an argument. - - :rtype: str - """ - parsed = parse_url(url) - scheme, auth, host, port, path, query, fragment = parsed - - # A defect in urlparse determines that there isn't a netloc present in some - # urls. We previously assumed parsing was overly cautious, and swapped the - # netloc and path. Due to a lack of tests on the original defect, this is - # maintained with parse_url for backwards compatibility. - netloc = parsed.netloc - if not netloc: - netloc, path = path, netloc - - if auth: - # parse_url doesn't provide the netloc with auth - # so we'll add it ourselves. - netloc = "@".join([auth, netloc]) - if scheme is None: - scheme = new_scheme - if path is None: - path = "" - - return urlunparse((scheme, netloc, path, "", query, fragment)) - - -def get_auth_from_url(url): - """Given a url with authentication components, extract them into a tuple of - username,password. - - :rtype: (str,str) - """ - parsed = urlparse(url) - - try: - auth = (unquote(parsed.username), unquote(parsed.password)) - except (AttributeError, TypeError): - auth = ("", "") - - return auth - - -def check_header_validity(header): - """Verifies that header parts don't contain leading whitespace - reserved characters, or return characters. - - :param header: tuple, in the format (name, value). - """ - name, value = header - _validate_header_part(header, name, 0) - _validate_header_part(header, value, 1) - - -def _validate_header_part(header, header_part, header_validator_index): - if isinstance(header_part, str): - validator = _HEADER_VALIDATORS_STR[header_validator_index] - elif isinstance(header_part, bytes): - validator = _HEADER_VALIDATORS_BYTE[header_validator_index] - else: - raise InvalidHeader( - f"Header part ({header_part!r}) from {header} " - f"must be of type str or bytes, not {type(header_part)}" - ) - - if not validator.match(header_part): - header_kind = "name" if header_validator_index == 0 else "value" - raise InvalidHeader( - f"Invalid leading whitespace, reserved character(s), or return" - f"character(s) in header {header_kind}: {header_part!r}" - ) - - -def urldefragauth(url): - """ - Given a url remove the fragment and the authentication part. - - :rtype: str - """ - scheme, netloc, path, params, query, fragment = urlparse(url) - - # see func:`prepend_scheme_if_needed` - if not netloc: - netloc, path = path, netloc - - netloc = netloc.rsplit("@", 1)[-1] - - return urlunparse((scheme, netloc, path, params, query, "")) - - -def rewind_body(prepared_request): - """Move file pointer back to its recorded starting position - so it can be read again on redirect. - """ - body_seek = getattr(prepared_request.body, "seek", None) - if body_seek is not None and isinstance( - prepared_request._body_position, integer_types - ): - try: - body_seek(prepared_request._body_position) - except OSError: - raise UnrewindableBodyError( - "An error occurred when rewinding request body for redirect." - ) - else: - raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py deleted file mode 100644 index d92acc7..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -__all__ = [ - "__version__", - "AbstractProvider", - "AbstractResolver", - "BaseReporter", - "InconsistentCandidate", - "Resolver", - "RequirementsConflicted", - "ResolutionError", - "ResolutionImpossible", - "ResolutionTooDeep", -] - -__version__ = "1.0.1" - - -from .providers import AbstractProvider, AbstractResolver -from .reporters import BaseReporter -from .resolvers import ( - InconsistentCandidate, - RequirementsConflicted, - ResolutionError, - ResolutionImpossible, - ResolutionTooDeep, - Resolver, -) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index f1eb96b864962f50e7d44d46f5a0988b9ccc204f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 631 zcmaJ;J&zMH5Vd!c{m3R9pyQ;Yr3w-;IXZ+ua8R6t&?%y_gse?G+Q03 zXV&IsyP@5<2L5M%`+xf{=+b+lt2g9KOCax>1~}o+5C_)P=a!5bPz|ZXl+;UirqzSd z_=s5H;9gzM&dWJiQj41SPf=VOvK<@rj0q(iW21U`l|7Q0FDiI!_WiVQ3VYYXD#jT9 jjEW+E*uxrp&Q< diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc deleted file mode 100644 index 45554dc01a59aab03cdd46981e89a693c37eb985..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6848 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 HOSAP~RSqiJ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc deleted file mode 100644 index 653fe51fb78952264f7e0948ba9296194006ec71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2651 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 R(8xDMJ#~M@;mMZk{{Sx-R=xlL diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc deleted file mode 100644 index 10c41760bf75d7515ff3e14dd8659c41427bb164..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10503 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index ff7649e74930e706d33b371259c9be3a6bd3e689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197 zcmZ9FK?=e!5JeNKAVLq~!VcN%Tl4di*;!0uVkQZV=@G6Wpah8lJUUOUgCd{~(5Va1 z;2Wd&#dZfydE8K0wPlSCND+vLNn^pHGhM*MSEi@ZgAht9FGNAZv^?}i-a0(mMSRNR NxMV&V=iFw|{Qy3hHN5}; diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc deleted file mode 100644 index 83b9f2281a06287c4aa794eb4abb947ed5496943..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 417 zcmYk0Jx{|h5QgnIC8eRNgxD(tONYiPtOynu7+_&)mne;`G_4aG+fC`l#0nb=Lah82 zmacy=R=x?^sU&^ zu%u-~B9l%VE4kzQ0b{@= 3: - # Remove the state that triggered backtracking. - del self._states[-1] - - # Ensure to backtrack to a state that caused the incompatibility - incompatible_state = False - while not incompatible_state: - # Retrieve the last candidate pin and known incompatibilities. - try: - broken_state = self._states.pop() - name, candidate = broken_state.mapping.popitem() - except (IndexError, KeyError): - raise ResolutionImpossible(causes) - current_dependencies = { - self._p.identify(d) - for d in self._p.get_dependencies(candidate) - } - incompatible_state = not current_dependencies.isdisjoint( - incompatible_deps - ) - - incompatibilities_from_broken = [ - (k, list(v.incompatibilities)) - for k, v in broken_state.criteria.items() - ] - - # Also mark the newly known incompatibility. - incompatibilities_from_broken.append((name, [candidate])) - - # Create a new state from the last known-to-work one, and apply - # the previously gathered incompatibility information. - def _patch_criteria(): - for k, incompatibilities in incompatibilities_from_broken: - if not incompatibilities: - continue - try: - criterion = self.state.criteria[k] - except KeyError: - continue - matches = self._p.find_matches( - identifier=k, - requirements=IteratorMapping( - self.state.criteria, - operator.methodcaller("iter_requirement"), - ), - incompatibilities=IteratorMapping( - self.state.criteria, - operator.attrgetter("incompatibilities"), - {k: incompatibilities}, - ), - ) - candidates = build_iter_view(matches) - if not candidates: - return False - incompatibilities.extend(criterion.incompatibilities) - self.state.criteria[k] = Criterion( - candidates=candidates, - information=list(criterion.information), - incompatibilities=incompatibilities, - ) - return True - - self._push_new_state() - success = _patch_criteria() - - # It works! Let's work on this new state. - if success: - return True - - # State does not work after applying known incompatibilities. - # Try the still previous state. - - # No way to backtrack anymore. - return False - - def resolve(self, requirements, max_rounds): - if self._states: - raise RuntimeError("already resolved") - - self._r.starting() - - # Initialize the root state. - self._states = [ - State( - mapping=collections.OrderedDict(), - criteria={}, - backtrack_causes=[], - ) - ] - for r in requirements: - try: - self._add_to_criteria(self.state.criteria, r, parent=None) - except RequirementsConflicted as e: - raise ResolutionImpossible(e.criterion.information) - - # The root state is saved as a sentinel so the first ever pin can have - # something to backtrack to if it fails. The root state is basically - # pinning the virtual "root" package in the graph. - self._push_new_state() - - for round_index in range(max_rounds): - self._r.starting_round(index=round_index) - - unsatisfied_names = [ - key - for key, criterion in self.state.criteria.items() - if not self._is_current_pin_satisfying(key, criterion) - ] - - # All criteria are accounted for. Nothing more to pin, we are done! - if not unsatisfied_names: - self._r.ending(state=self.state) - return self.state - - # keep track of satisfied names to calculate diff after pinning - satisfied_names = set(self.state.criteria.keys()) - set( - unsatisfied_names - ) - - # Choose the most preferred unpinned criterion to try. - name = min(unsatisfied_names, key=self._get_preference) - failure_causes = self._attempt_to_pin_criterion(name) - - if failure_causes: - causes = [i for c in failure_causes for i in c.information] - # Backjump if pinning fails. The backjump process puts us in - # an unpinned state, so we can work on it in the next round. - self._r.resolving_conflicts(causes=causes) - success = self._backjump(causes) - self.state.backtrack_causes[:] = causes - - # Dead ends everywhere. Give up. - if not success: - raise ResolutionImpossible(self.state.backtrack_causes) - else: - # discard as information sources any invalidated names - # (unsatisfied names that were previously satisfied) - newly_unsatisfied_names = { - key - for key, criterion in self.state.criteria.items() - if key in satisfied_names - and not self._is_current_pin_satisfying(key, criterion) - } - self._remove_information_from_criteria( - self.state.criteria, newly_unsatisfied_names - ) - # Pinning was successful. Push a new state to do another pin. - self._push_new_state() - - self._r.ending_round(index=round_index, state=self.state) - - raise ResolutionTooDeep(max_rounds) - - -def _has_route_to_root(criteria, key, all_keys, connected): - if key in connected: - return True - if key not in criteria: - return False - for p in criteria[key].iter_parent(): - try: - pkey = all_keys[id(p)] - except KeyError: - continue - if pkey in connected: - connected.add(key) - return True - if _has_route_to_root(criteria, pkey, all_keys, connected): - connected.add(key) - return True - return False - - -Result = collections.namedtuple("Result", "mapping graph criteria") - - -def _build_result(state): - mapping = state.mapping - all_keys = {id(v): k for k, v in mapping.items()} - all_keys[id(None)] = None - - graph = DirectedGraph() - graph.add(None) # Sentinel as root dependencies' parent. - - connected = {None} - for key, criterion in state.criteria.items(): - if not _has_route_to_root(state.criteria, key, all_keys, connected): - continue - if key not in graph: - graph.add(key) - for p in criterion.iter_parent(): - try: - pkey = all_keys[id(p)] - except KeyError: - continue - if pkey not in graph: - graph.add(pkey) - graph.connect(pkey, key) - - return Result( - mapping={k: v for k, v in mapping.items() if k in connected}, - graph=graph, - criteria=state.criteria, - ) - - -class Resolver(AbstractResolver): - """The thing that performs the actual resolution work.""" - - base_exception = ResolverException - - def resolve(self, requirements, max_rounds=100): - """Take a collection of constraints, spit out the resolution result. - - The return value is a representation to the final resolution result. It - is a tuple subclass with three public members: - - * `mapping`: A dict of resolved candidates. Each key is an identifier - of a requirement (as returned by the provider's `identify` method), - and the value is the resolved candidate. - * `graph`: A `DirectedGraph` instance representing the dependency tree. - The vertices are keys of `mapping`, and each edge represents *why* - a particular package is included. A special vertex `None` is - included to represent parents of user-supplied requirements. - * `criteria`: A dict of "criteria" that hold detailed information on - how edges in the graph are derived. Each key is an identifier of a - requirement, and the value is a `Criterion` instance. - - The following exceptions may be raised if a resolution cannot be found: - - * `ResolutionImpossible`: A resolution cannot be found for the given - combination of requirements. The `causes` attribute of the - exception is a list of (requirement, parent), giving the - requirements that could not be satisfied. - * `ResolutionTooDeep`: The dependency tree is too deeply nested and - the resolver gave up. This is usually caused by a circular - dependency, but you can try to resolve this by increasing the - `max_rounds` argument. - """ - resolution = Resolution(self.provider, self.reporter) - state = resolution.resolve(requirements, max_rounds=max_rounds) - return _build_result(state) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py b/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py deleted file mode 100644 index 359a34f..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py +++ /dev/null @@ -1,170 +0,0 @@ -import itertools - -from .compat import collections_abc - - -class DirectedGraph(object): - """A graph structure with directed edges.""" - - def __init__(self): - self._vertices = set() - self._forwards = {} # -> Set[] - self._backwards = {} # -> Set[] - - def __iter__(self): - return iter(self._vertices) - - def __len__(self): - return len(self._vertices) - - def __contains__(self, key): - return key in self._vertices - - def copy(self): - """Return a shallow copy of this graph.""" - other = DirectedGraph() - other._vertices = set(self._vertices) - other._forwards = {k: set(v) for k, v in self._forwards.items()} - other._backwards = {k: set(v) for k, v in self._backwards.items()} - return other - - def add(self, key): - """Add a new vertex to the graph.""" - if key in self._vertices: - raise ValueError("vertex exists") - self._vertices.add(key) - self._forwards[key] = set() - self._backwards[key] = set() - - def remove(self, key): - """Remove a vertex from the graph, disconnecting all edges from/to it.""" - self._vertices.remove(key) - for f in self._forwards.pop(key): - self._backwards[f].remove(key) - for t in self._backwards.pop(key): - self._forwards[t].remove(key) - - def connected(self, f, t): - return f in self._backwards[t] and t in self._forwards[f] - - def connect(self, f, t): - """Connect two existing vertices. - - Nothing happens if the vertices are already connected. - """ - if t not in self._vertices: - raise KeyError(t) - self._forwards[f].add(t) - self._backwards[t].add(f) - - def iter_edges(self): - for f, children in self._forwards.items(): - for t in children: - yield f, t - - def iter_children(self, key): - return iter(self._forwards[key]) - - def iter_parents(self, key): - return iter(self._backwards[key]) - - -class IteratorMapping(collections_abc.Mapping): - def __init__(self, mapping, accessor, appends=None): - self._mapping = mapping - self._accessor = accessor - self._appends = appends or {} - - def __repr__(self): - return "IteratorMapping({!r}, {!r}, {!r})".format( - self._mapping, - self._accessor, - self._appends, - ) - - def __bool__(self): - return bool(self._mapping or self._appends) - - __nonzero__ = __bool__ # XXX: Python 2. - - def __contains__(self, key): - return key in self._mapping or key in self._appends - - def __getitem__(self, k): - try: - v = self._mapping[k] - except KeyError: - return iter(self._appends[k]) - return itertools.chain(self._accessor(v), self._appends.get(k, ())) - - def __iter__(self): - more = (k for k in self._appends if k not in self._mapping) - return itertools.chain(self._mapping, more) - - def __len__(self): - more = sum(1 for k in self._appends if k not in self._mapping) - return len(self._mapping) + more - - -class _FactoryIterableView(object): - """Wrap an iterator factory returned by `find_matches()`. - - Calling `iter()` on this class would invoke the underlying iterator - factory, making it a "collection with ordering" that can be iterated - through multiple times, but lacks random access methods presented in - built-in Python sequence types. - """ - - def __init__(self, factory): - self._factory = factory - self._iterable = None - - def __repr__(self): - return "{}({})".format(type(self).__name__, list(self)) - - def __bool__(self): - try: - next(iter(self)) - except StopIteration: - return False - return True - - __nonzero__ = __bool__ # XXX: Python 2. - - def __iter__(self): - iterable = ( - self._factory() if self._iterable is None else self._iterable - ) - self._iterable, current = itertools.tee(iterable) - return current - - -class _SequenceIterableView(object): - """Wrap an iterable returned by find_matches(). - - This is essentially just a proxy to the underlying sequence that provides - the same interface as `_FactoryIterableView`. - """ - - def __init__(self, sequence): - self._sequence = sequence - - def __repr__(self): - return "{}({})".format(type(self).__name__, self._sequence) - - def __bool__(self): - return bool(self._sequence) - - __nonzero__ = __bool__ # XXX: Python 2. - - def __iter__(self): - return iter(self._sequence) - - -def build_iter_view(matches): - """Build an iterable view from the value returned by `find_matches()`.""" - if callable(matches): - return _FactoryIterableView(matches) - if not isinstance(matches, collections_abc.Sequence): - matches = list(matches) - return _SequenceIterableView(matches) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py deleted file mode 100644 index 73f58d7..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py +++ /dev/null @@ -1,177 +0,0 @@ -"""Rich text and beautiful formatting in the terminal.""" - -import os -from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union - -from ._extension import load_ipython_extension # noqa: F401 - -__all__ = ["get_console", "reconfigure", "print", "inspect", "print_json"] - -if TYPE_CHECKING: - from .console import Console - -# Global console used by alternative print -_console: Optional["Console"] = None - -try: - _IMPORT_CWD = os.path.abspath(os.getcwd()) -except FileNotFoundError: - # Can happen if the cwd has been deleted - _IMPORT_CWD = "" - - -def get_console() -> "Console": - """Get a global :class:`~rich.console.Console` instance. This function is used when Rich requires a Console, - and hasn't been explicitly given one. - - Returns: - Console: A console instance. - """ - global _console - if _console is None: - from .console import Console - - _console = Console() - - return _console - - -def reconfigure(*args: Any, **kwargs: Any) -> None: - """Reconfigures the global console by replacing it with another. - - Args: - *args (Any): Positional arguments for the replacement :class:`~rich.console.Console`. - **kwargs (Any): Keyword arguments for the replacement :class:`~rich.console.Console`. - """ - from pip._vendor.rich.console import Console - - new_console = Console(*args, **kwargs) - _console = get_console() - _console.__dict__ = new_console.__dict__ - - -def print( - *objects: Any, - sep: str = " ", - end: str = "\n", - file: Optional[IO[str]] = None, - flush: bool = False, -) -> None: - r"""Print object(s) supplied via positional arguments. - This function has an identical signature to the built-in print. - For more advanced features, see the :class:`~rich.console.Console` class. - - Args: - sep (str, optional): Separator between printed objects. Defaults to " ". - end (str, optional): Character to write at end of output. Defaults to "\\n". - file (IO[str], optional): File to write to, or None for stdout. Defaults to None. - flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False. - - """ - from .console import Console - - write_console = get_console() if file is None else Console(file=file) - return write_console.print(*objects, sep=sep, end=end) - - -def print_json( - json: Optional[str] = None, - *, - data: Any = None, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, -) -> None: - """Pretty prints JSON. Output will be valid JSON. - - Args: - json (str): A string containing JSON. - data (Any): If json is not supplied, then encode this data. - indent (int, optional): Number of spaces to indent. Defaults to 2. - highlight (bool, optional): Enable highlighting of output: Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - - get_console().print_json( - json, - data=data, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - - -def inspect( - obj: Any, - *, - console: Optional["Console"] = None, - title: Optional[str] = None, - help: bool = False, - methods: bool = False, - docs: bool = True, - private: bool = False, - dunder: bool = False, - sort: bool = True, - all: bool = False, - value: bool = True, -) -> None: - """Inspect any Python object. - - * inspect() to see summarized info. - * inspect(, methods=True) to see methods. - * inspect(, help=True) to see full (non-abbreviated) help. - * inspect(, private=True) to see private attributes (single underscore). - * inspect(, dunder=True) to see attributes beginning with double underscore. - * inspect(, all=True) to see all attributes. - - Args: - obj (Any): An object to inspect. - title (str, optional): Title to display over inspect result, or None use type. Defaults to None. - help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. - methods (bool, optional): Enable inspection of callables. Defaults to False. - docs (bool, optional): Also render doc strings. Defaults to True. - private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. - dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. - all (bool, optional): Show all attributes. Defaults to False. - value (bool, optional): Pretty print value. Defaults to True. - """ - _console = console or get_console() - from pip._vendor.rich._inspect import Inspect - - # Special case for inspect(inspect) - is_inspect = obj is inspect - - _inspect = Inspect( - obj, - title=title, - help=is_inspect or help, - methods=is_inspect or methods, - docs=is_inspect or docs, - private=private, - dunder=dunder, - sort=sort, - all=all, - value=value, - ) - _console.print(_inspect) - - -if __name__ == "__main__": # pragma: no cover - print("Hello, **World**") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py deleted file mode 100644 index 270629f..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py +++ /dev/null @@ -1,274 +0,0 @@ -import colorsys -import io -from time import process_time - -from pip._vendor.rich import box -from pip._vendor.rich.color import Color -from pip._vendor.rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult -from pip._vendor.rich.markdown import Markdown -from pip._vendor.rich.measure import Measurement -from pip._vendor.rich.pretty import Pretty -from pip._vendor.rich.segment import Segment -from pip._vendor.rich.style import Style -from pip._vendor.rich.syntax import Syntax -from pip._vendor.rich.table import Table -from pip._vendor.rich.text import Text - - -class ColorBox: - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - for y in range(0, 5): - for x in range(options.max_width): - h = x / options.max_width - l = 0.1 + ((y / 5) * 0.7) - r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) - r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0) - bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) - color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) - yield Segment("â–„", Style(color=color, bgcolor=bgcolor)) - yield Segment.line() - - def __rich_measure__( - self, console: "Console", options: ConsoleOptions - ) -> Measurement: - return Measurement(1, options.max_width) - - -def make_test_card() -> Table: - """Get a renderable that demonstrates a number of features.""" - table = Table.grid(padding=1, pad_edge=True) - table.title = "Rich features" - table.add_column("Feature", no_wrap=True, justify="center", style="bold red") - table.add_column("Demonstration") - - color_table = Table( - box=None, - expand=False, - show_header=False, - show_edge=False, - pad_edge=False, - ) - color_table.add_row( - ( - "✓ [bold green]4-bit color[/]\n" - "✓ [bold blue]8-bit color[/]\n" - "✓ [bold magenta]Truecolor (16.7 million)[/]\n" - "✓ [bold yellow]Dumb terminals[/]\n" - "✓ [bold cyan]Automatic color conversion" - ), - ColorBox(), - ) - - table.add_row("Colors", color_table) - - table.add_row( - "Styles", - "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/italic], [underline]underline[/], [strike]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/].", - ) - - lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus." - lorem_table = Table.grid(padding=1, collapse_padding=True) - lorem_table.pad_edge = False - lorem_table.add_row( - Text(lorem, justify="left", style="green"), - Text(lorem, justify="center", style="yellow"), - Text(lorem, justify="right", style="blue"), - Text(lorem, justify="full", style="red"), - ) - table.add_row( - "Text", - Group( - Text.from_markup( - """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n""" - ), - lorem_table, - ), - ) - - def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table: - table = Table(show_header=False, pad_edge=False, box=None, expand=True) - table.add_column("1", ratio=1) - table.add_column("2", ratio=1) - table.add_row(renderable1, renderable2) - return table - - table.add_row( - "Asian\nlanguage\nsupport", - ":flag_for_china: 该库支æŒä¸­æ–‡ï¼Œæ—¥æ–‡å’ŒéŸ©æ–‡æ–‡æœ¬ï¼\n:flag_for_japan: ライブラリã¯ä¸­å›½èªžã€æ—¥æœ¬èªžã€éŸ“国語ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™\n:flag_for_south_korea: ì´ ë¼ì´ë¸ŒëŸ¬ë¦¬ëŠ” 중국어, ì¼ë³¸ì–´ ë° í•œêµ­ì–´ í…스트를 ì§€ì›í•©ë‹ˆë‹¤", - ) - - markup_example = ( - "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! " - ":+1: :apple: :ant: :bear: :baguette_bread: :bus: " - ) - table.add_row("Markup", markup_example) - - example_table = Table( - show_edge=False, - show_header=True, - expand=False, - row_styles=["none", "dim"], - box=box.SIMPLE, - ) - example_table.add_column("[green]Date", style="green", no_wrap=True) - example_table.add_column("[blue]Title", style="blue") - example_table.add_column( - "[cyan]Production Budget", - style="cyan", - justify="right", - no_wrap=True, - ) - example_table.add_column( - "[magenta]Box Office", - style="magenta", - justify="right", - no_wrap=True, - ) - example_table.add_row( - "Dec 20, 2019", - "Star Wars: The Rise of Skywalker", - "$275,000,000", - "$375,126,118", - ) - example_table.add_row( - "May 25, 2018", - "[b]Solo[/]: A Star Wars Story", - "$275,000,000", - "$393,151,347", - ) - example_table.add_row( - "Dec 15, 2017", - "Star Wars Ep. VIII: The Last Jedi", - "$262,000,000", - "[bold]$1,332,539,889[/bold]", - ) - example_table.add_row( - "May 19, 1999", - "Star Wars Ep. [b]I[/b]: [i]The phantom Menace", - "$115,000,000", - "$1,027,044,677", - ) - - table.add_row("Tables", example_table) - - code = '''\ -def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value''' - - pretty_data = { - "foo": [ - 3.1427, - ( - "Paul Atreides", - "Vladimir Harkonnen", - "Thufir Hawat", - ), - ], - "atomic": (False, True, None), - } - table.add_row( - "Syntax\nhighlighting\n&\npretty\nprinting", - comparison( - Syntax(code, "python3", line_numbers=True, indent_guides=True), - Pretty(pretty_data, indent_guides=True), - ), - ) - - markdown_example = """\ -# Markdown - -Supports much of the *markdown* __syntax__! - -- Headers -- Basic formatting: **bold**, *italic*, `code` -- Block quotes -- Lists, and more... - """ - table.add_row( - "Markdown", comparison("[cyan]" + markdown_example, Markdown(markdown_example)) - ) - - table.add_row( - "+more!", - """Progress bars, columns, styled logging handler, tracebacks, etc...""", - ) - return table - - -if __name__ == "__main__": # pragma: no cover - - console = Console( - file=io.StringIO(), - force_terminal=True, - ) - test_card = make_test_card() - - # Print once to warm cache - start = process_time() - console.print(test_card) - pre_cache_taken = round((process_time() - start) * 1000.0, 1) - - console.file = io.StringIO() - - start = process_time() - console.print(test_card) - taken = round((process_time() - start) * 1000.0, 1) - - c = Console(record=True) - c.print(test_card) - - print(f"rendered in {pre_cache_taken}ms (cold cache)") - print(f"rendered in {taken}ms (warm cache)") - - from pip._vendor.rich.panel import Panel - - console = Console() - - sponsor_message = Table.grid(padding=1) - sponsor_message.add_column(style="green", justify="right") - sponsor_message.add_column(no_wrap=True) - - sponsor_message.add_row( - "Textualize", - "[u blue link=https://github.com/textualize]https://github.com/textualize", - ) - sponsor_message.add_row( - "Twitter", - "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", - ) - - intro_message = Text.from_markup( - """\ -We hope you enjoy using Rich! - -Rich is maintained with [red]:heart:[/] by [link=https://www.textualize.io]Textualize.io[/] - -- Will McGugan""" - ) - - message = Table.grid(padding=2) - message.add_column() - message.add_column(no_wrap=True) - message.add_row(intro_message, sponsor_message) - - console.print( - Panel.fit( - message, - box=box.ROUNDED, - padding=(1, 2), - title="[b red]Thanks for trying out Rich!", - border_style="bright_blue", - ), - justify="center", - ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 28a44b319dc3daf9073da31eacb4ef8952f4b94d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7012 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc deleted file mode 100644 index ecee5185748e68c167a31e967ca3a62ccd6a77a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205973 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≀ZkqNU^lXo(?8VXDlAr+{^Z3MBSBLzBwyydw< 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc deleted file mode 100644 index 8b9914dfd145d5ad7cc1ec58e4fe82eb77050b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1726 zcmZ8hO>7%Q6rTNGJBgDxB~25OI%%O<<75LAs7llXRh4L~wjvQlv0AMh&&092_FA*+ zw22(ahe}O*fb@WpN|gu_60L$nInfgmXD&8DsyiG&LL7R+C6%ahK)kWNP046?-uHfX z-pn^|-%o9AK?Gys-;LC;jL;uk@kgKuwjTgkLl|MfMp+>)WW~6cmEw}XZK5s5Wh`OY zRqH=WN+8;tSl0uf2Z)vef724gqKJr`>Go6ZN~~-O4K35NYxU8b zh*hFtjYy4LSSLXYYtQL8cwLFNEs93V6CP|xOh1{h?Zm82m~t-RCFhxbA@8M~T*5y8 zgr_hBrkpx=;mql!!Qtb>m!_i=#_+^(crJ|?!zAlu(nXJ4^9*C+xWQx&Svw|kiGuA} z3kjM|VcM9m}M#@UV-M4lD}DyKrQ0>_75=KP;RI0E?UGg{!s{OjSTP5GH2Ql5+{ z^;iZV%P)bpfHB#;VSotnLv+Ery$aLk(i$qF%*%eT^0CHb&Y-ZezjwN`M}7wBpwYt zMdH3t4T)``=g(Bs(epPF0t3~q{-0a>YZAa6mlL{n@ICZ>%Lj_|qb$H|D3nveS}Y4_ zf+J=vi%9?}zda_o9yRoOwNc)>DDP}c_t~U<+{SlKc|)PR@?BnMiEexfJCET|XP;KL-;jVXe*W@xpQIbkG6r3t3ZS+N1DQqsP_t!t9II*KVESoou== zdyYVvV5TLVY(5Q5QG%XTKjnQy2YEtH!;U_lb#TEZC+HiX^8e7i2@_n7ApC}66%_jw z1^z?_YbpxwUv+QymO|Ce1M4Tsz0rFo%e`i$a||ru-u3gK_KiI_RPKAH5`MSTUJIhv zqt&6<#?aT%FQes=kG6)U9t~Zr3|)Mx?GuKp!M2(N^7mKz*ORv|*A&2zqcc+D-kOfo Lz_S3L`d0q~796a} diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc deleted file mode 100644 index 70a2d06b2b1040f49ec4926c8c4c0b158bac1ca8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2318 zcmc&$&2QT_6ql21%M5hrnxeb1TCv2KCAw+56`q_eO_Q!bz7S`{8lVsuiMEu`qDInR zF?`(LubW{rGj^@Joqxs=Naex4 z7f}*I*P)7_ARhjS-#m$ZR3bBdP=ii}pnZt+ApEz*hEu)aeR z#;eOu=?Qt!MNN`Ow8Im=Tn%_4IU};VyurI7rULEK{&KYgLYb0)+G}3GL%KH7-?4|y z#KT|)g2kC(aK}JHe*O^flD#$x;6&N5MI1zqqM{QggxRPU)BY1aXxKGWL!*8is%VTx z5sllC8rx{lVF_%CluGLu_xpXf|G?#%Gqi)QRz7BysV#e$#>2;I)Iq&1`n>WJ}x zuoWZMV&{OiyNn3CQZ;95y`psmC>Fj2VR9nffbnkF0)6TRyo1RJ8DJJ4OWXo`8e;sF zyXw|(pSN18SUWLm#5K!y1$-49qE_sD{@zVrZTXU6yE28wfM+nSqeMH$F3I{P*>&`= zR?8$%)*7exnu{l#h5v0Lw1xj63lp>dG6l!r<~0fUdL{uT1MaAs#6NYZABSTHs!GIz zYp=!RR#ef1C@$HNaPxrXG(r0L4NnJC9Tq3l$<{$j&#uxk<zDmKC9vhK^u`5(w5A5 zCtz{9Pk^Z6uwl<4tp!tx%(Q{x1Pv6@OlhN``I=y1Yr&>|MxQpyK%A9K2o>kXabZ21 z8@OfRapq(eOAra(p}C}ulz?|ab4*k+#&>z;4_y`pL0Y7oaq5uE@ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc deleted file mode 100644 index 77770c54826114cc80d63d6e5d804fc885d1a39b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmZWmJx{|h5VakX@>K*3MS`Vk24VpV1L9*uLfv7hLTp+?npn1phy)Tt`3*33Mf?~JRrMH(BC6TK1wXo+pZNxzQYXp!7Yq$vxNHHgl^vaPs zOaK#%2)e`%C3Y)n|d8R`x<94V(fh}|eO3USc zr&dR?IF918z|-!o-*wYgH^-dD39Z-bABU`+bp$)jbHN!GIkUo8b!J!y({h%`W2Oq* z&eDx=ZJilu#i|0{s3i=8v1}}gIZ>=BF04q6%+gR5Wi81f-jv_%e@A*2Mmtev5!^L; zrL0ePpXp3@|B24s91LL>o}u(@p=8?9PU)!U9_gyXGvGcZw>lX=PsFyKhtz$8Sphfj XFvfjU8~8q6xHAI;p=aM+7&U(ZlEH@` diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc deleted file mode 100644 index 7d43466f1852821a7bf89499e0b8be7fae8d70de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 852 zcmZWn&ubGw6n?XtZn9|$v3h7u9n@kL+AQitidc%j$fXe#p%Dq&-AS_T?#?nhNt+U( zf(NhSp?LG)LFqr>(YqJHi!ONbAcBWzdypQ)H=DK!zQg1D-n?J??Rz&lSp>Aj-!IxT zI=~l2j!YW?vR6T{10HxJfRHo@QCJJKP;cmAu8~7N=IM`fjj?{tGQO!Yi=^XD6mjWD zpGS$MrCP0?7Opx$;H(DBC8OS%A489`$=)plJ0OqW1~}2vcJWQwLoy(b3MObUAiJXw z+=0G!2IS$U0B1qy1XeJ*0h{^?Y!FM|`hJs1+VTSy@rp%Tf``<}_#Aaymv(hVf#t*k@Dso$bb&+#+a<|r<$l^z1Hh7&-Pf)mMoF+ zdSX|5Eb7^TziP*Q+2PT}>iG+H;!8FkJMOyEW{Dm9vE9Tpj|*G)ZpUtpmZ--4w1`U_ zQZa#}3^j8R-8Sq`LB)R6e^YsT?Zdg+_KlDE$@ls4P&3TwPbbUIEH)r*iWL96cazY*RR=!rhpGff_HAJTNR`IXMmXQ{l z%~lux0&6yfI<3@@{TMGm=ch P{t7eu#uO=u6BzshM8)J& diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc deleted file mode 100644 index 04a637c8f0cda8cc338d80e094ab4c9d484dcb6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12074 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc deleted file mode 100644 index e25416462a4b72570720e02aecfa19b0c292e3cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1882 zcmbW1UrZcD7{F(CX74ZD0i{(6g*CJ_2bHz{i#E^;{voXx65~-*j9w0Q?~mNwZfExn zP7gw;4`Cci;g1ivF)>CT^ldFXkj5Cl*@Z$PO|g^A>^I-{ z?aX}h`@Z?1zCM7UMgLhy{YVk|jZb!(Z(G>-6ohL?K?=^I93H_rVMNH05rUC`RH6u< zVb^nnDn!L9ZGovmK@wC^rAdL$c~4SBe2I()pblCEAzFbl^lPce}#sD|ZXs##$9vF%gyUlGKPI-ze&!!U?2 z#B1KQm(fmyQ`nD80xnJ~lum-EE0=m;2JENS0_!Y{xwt6-SskBK0=rm_O^oDBffnhqWk4>Ns@FYCa1NW zD!*MUs*0?rMcGshQy(|vo}!vB%Gu1Qte4ERmVdJ6^b@iHD?O$s#>NvV)sXd!F2})5 z(U{CKV`({_)ik|FFIfRD#GSLUM%c*%-M9e5A82a^{oZt>TKwqL%%Ck0G5m8wbM=k2 zhDR!*?LonCRjhQc(!=YGZMP8?TPxyv=umaIl3nv1{fmHNYtxJBTDUFzlP_e0D*U(6 z220P@_2CbLJ!rnU4}al5L%tUJ@C|&1d_(&1{`hC%uLr^JAcs<#f^yhJUM5q*l{$*{ zrojPI;8_>h0aGBG*v)`}7~?e^p$=&l0@(`bOf6=#g5e@(VNe=84}rJD8n}z!;lmeV z%`k7`9&s4vPDq4{6fot_BGnR zwHdq@rzmiG9L*nz;+nsg+z_JpTii>&BhhpkFTL1+OHbUT#|}ZTmgts_Lrw$*C%26*yjxmv2jD|s z?|^RPV7MQ^`o@`;oYEpY6o==AmP1{uzOMC#!@$*n=>@CpL&1h>b9H(-aAJ*~*xC&L z7w2)6v_r@rQ@;Y-Btz#$N`D zj%r%gc_^H8WIUurv;iY>^7W3dH>W9uta_I5O6PC2aTx}vevE%X-7Bd3R~oFmaQT%P zYFb4BZ0U6E z^~LFxlV>-$&OTa)PtKiNc=eM(8-aNJTy1#ishiC=FD>=0JbixU)XSS(&066c{{m+r B$!Y)q diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc deleted file mode 100644 index 65be7891215cbe5629a0a11737ecc3bccb74673c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3617 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc deleted file mode 100644 index 6739def36a239eb4e1ae71add14f0fecd3e9e13c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 723 zcmZWnL2DC16n?Xr-KI$+wFPTXa1J6y=nhp7iJ}yW2azhRr-Fn{c9N{w?5?w$#gwQ; zJQVd%Prdf0(m&vT@DlM77JBmJEt;Ns5Z`PPDEMIBd~f!>?|n0GzZD8OK)d(%pz(5z-9qH9n!qhSdW^j$x(CtGH!kGuy=5X@;4e7xeJk0{UBt5c2J{Ubx(+F$= zg$U)2?KL@^;7urL+g~3$wHAw-g4G=vM$GfQWn6+)ecxriWMds^hHGI$s?W^j7}~0A zgyj^e=-OC1yQ)e{Wwz>dnb&Dog=Bs`dG*R8vXxaW4%qV<%5|({Bs@ERKcEZ4vWGgi+86xfu&D z=B`uaK{smp-VJl*IuD&lEC*JtWi>>|11I1WOtXE-rBiG2N`TL22Hj*zi9rT=I+hG*`+_A>BU`rke~mazc^St|L);X$CG0N=H~bG_qY4> z+z4x7y+jiu>IRP2kZSl+O+V%T0y3}gEV`5IowjdxTya;P!B9;%yo7F;A%q;kg`rU( UOM5R4=*L$>K=}FcvD#9Cf8*7>r~m)} diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc deleted file mode 100644 index 3badf7e91f83e832f1b10ee01fc972c67f2e0594..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6576 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc deleted file mode 100644 index 5d6d0fed190e2c3de22c5bf13928a738d21abfad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13176 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 OT?LUVy{fnfJpTcYO5nQy diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc deleted file mode 100644 index 3b1c672c10a0b5b9f92c28f9fda22a1ea4b57da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28973 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 IGhO8W14|t~G5`Po diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc deleted file mode 100644 index d871fdcbcf900aa1a6d5c2779b0d4465fe51e0e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2487 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 Zd-0=pk9~|E1W$b`o^FJYxX<0le*jIXL#O}% diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-312.pyc deleted file mode 100644 index ac35c3d38d0c52b66f9f2f80314652f210a93571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1605 zcmZuwJ!~9B6rQ>Lxx3BzC;TWfAhRL`UMIOFAW~Q;$V3Vfg&iCtq)V~d+a2dNx3{y* z%$8Mm(AJJmZv4z$=Ukg!9h+3XlHmcyOI`wW% zy<6wo7qP?2dD?!pUv;d%k%~hzZT*v5K|!mK#`rK=g`dZSkp>MR=a4ouriUeFKrPH2 zJ=FL0DW7uRaLjCeD+*d$ED4$Ln=$h*L%QpU?KhzLjBh-coN~*T zzEZ*|Wm*tRfzL=HdE0)u<+gZ-xet0h7P=wpxr#}ZwxwI|v83n5QPWNPs>PEJ>et_Q zWu(}()DPPJeJ0&BN?i|NAr~%&cl~BiPy5J5cAI(ATb#E&Z|`mF->mBOvw#I;v<%`Q zIWfuNrGxI%<@W{)*PktH{`lojU;O;p;KR+QmCX?#$c9tF>=M7jAWzHlIy~&g_+Rt9 zueyFb)|5RjZdHzo1DjD9=!cP1O^v#DDXw)0=p@%f!HUU1H~pd$juvPcbmX0Jor z>f^T6v2Aq){KOLKsLG6d_A_htdh$3K-8sYIW#yxy@;Ak0u*IC@Hz0-@rSt`P^~9W~ zcj&?06N3Bj9irF1-Fv1jz0gr57&R!tKY32Y#-hnSgX(VE5-5i!})>r?sI+R lU!59r#{`8*s3j?B@vWF>P=auWXq%?Sr5vwWH~_`LlAdKf&xH#0m>o+ zwsNAWK*bqRu^mxyJf>zcV``*M)R|7J^e0Z@Y0~tgfZ!QITe*>&WTx&Mc(%9KPU@DhBjWTsN!=QDMcjTjsoTO;k!pW6%*o0;jN!wc zNR7WHQtPjcc>Uf;oxcvAnMHd&5aO?gnuF9D4AeeKbe^L`mt?=rs8sqJNv|7vtBQJ? zq-L@D6zq-seW2D8ZXq+Y`dfhlN~{SBkv4xDsn>?vBOU$@nleyQ+jVW}{!VDs-UbV%J|v)BS7jujyF+KpBnr#>f5&CoNnPxuHyhJCccjf@9F zQ6Hn&kA3->y@A2~dj}6bJ-kmbKOL9k;K{J0n2$`wLzB^9*k||%DgMX|8H_X?3L!}N zBit@%TLveivAB%bXoWv8Jv9T54~Nc>w(YPKj7`f@M2g07>``enMn-_#e5%rFtBbIT%OE^{TBQ62k@hnd%0h|tqCsTfXAs%%u_A{; zBC(=b;v^%ovS@*tiPWsX-Zp4iNQ=+c?4n`RB|6TT{8rH}*+vb(_^h9o?0~)DA?*J% z%+#nube%Kh+1v3)!|E==>inZ&tt!Im!u{3%Kmfe3D{iq`^oTWLE$md)s8OtgzUmo+ zuSwzdghOM|U>z_ZsR=VkkN$#HNBHQcMVq3Q-9vv7kKDYqbiH_Q+$g zour1XqQTvztmWG&>=8y(HY@_`%?}MCB|ZwV@3d{PKbO@(I!sKm!5;bd^+)R;Uu9Tf{i zotETyXe1aGx^-#&%5kl0Pk1a8RSErS$xJ$=kRMEz1~A%UKzML1s`zMYQDvyTR~V8; zgCKh`q-q#O6lj?WibD6v$;oiZY|lV1QcpHRcsUdw*IrgBs$=qW5vrF%BEWTrqVW=3 zAog)NG!n=66bF$fM2v+_OHn`!BLG+?L?Ln0F-Z_rV%4Xm6PD6GE}`alc*dhrT+p7u zYgSpHz(XbTjfUbltxj5{*$5{*8w|yyB9=TJ3{OjYWqDHGiTr!w1exW;2_X~{qLXp` zt>7L?XQrf)xFiavaZF6z`r%`sK+XEQR2X;-3P-j>F{-31)&j{gYCeS{b0{2PG`R)3 z!$X<4PEy1s0H+5)8C(Zjur#v~&ve*CDoj4`b6`NHN0C z5G)m;&#YJr{2;djZn*=qPRuI2Cm6uSr10o}12l%`H|ju4503SXPe!D^iPNVgu}_pv z_r*cBrcTBBdO?~__k}|z``{oSpNwwl-L$zc21ot|P_d_iV^XYdDm2v>05EY)E87bbAvb8SlPi;Mt?mR+Zznt=)Onq5ONuw#(SP5)nSCW0z znXPGn!m1Z_0<`Se>RKqwdS`7@lKqx#6=Ts_ZwJZbwt6vyWkd?II1O*;%EktgpS*&A;~8l zNoUfPq>^rMLD+NroDp!M@RlXHr?49$SNXl3p<_G^7E-14%>tLd39**94D)XNZAPs{ zIE^~h7wn=b4lxileFpVx(mqOyW}w*w^q^KPOL=-KJexDa7(718l02UhBopri4XbkG|SDYxLwJ@LCDpJ{_-Un?(+^LEDD&RGiI} zu<0{=#@w2wfVn$$>~ppfsvm);h-y1;4lWg4rBN6m9E4!Es!ETNPkl!8_RN(}|7D(zB&f#*ya)h!y;Mnbi(bk@@O zv|Rx`1#@YuuQX47M`{r_;erfs!dvhgf?pNk2-C2PhaWMv9?$|YXg(r6c-Dh?O8h^J zAp5KkRSQKWwFgfY#R5KMfY<@V8&P=a3LX>&2CaH4KRYin+RxDLm<#Q5T1nCMr?QQLqo0r;@D%rx}W|F z^(olK&c?-;Zaam0O>Li026xB8P`0(>@{xrj*@pJlhCk+@D`%#vyo+nT-Fk1}$sg_i zoBgkkEsiW5O1Esh+4X+yj-PifFj*YT77f1RZOFE?eb=HQvB0Aok4U<2yW8)1JCkCFER zW`zzY)|262^b}#i7)~n)XH|}~6+M_;_j$Zl1pK#vC59)X&Sjp3moCiQt#4VJezWNl zigtG`?8!ECW;~rAGthvS>#F}<42{okG_}$)8Wu8|OY$zreD$jEm?COOoVZDfDH1#r zicCi^;DV8E*@o}}WC{}rMHS=plnAndA_=iCluyMLn+k)EtxBC`Oo|6$<3WgxTVi@u z-i>e;Kph}~AR>&43W_mE8MQx=Z-s#vn|ef$=mPGWVk2S400|EHs)(~H_u~jWQB>N@ zDz%cRjvd4Y2XU-Zk9!2P*b}ct4mDk2$Gd~P;42o0h^SB0FvkJJ^CV__FhibE6$wVI zP6&ncBuVP)b(QOl+1kqQ_&gwq9Rj8Id!jTz4Ba)Ct(UAxF6;7Mc3yHWvF|vqI&XOw zoEg`i71z^g*VFKG>oPT)Gp;R3?rvS{N}VrV z=L6kQw{hN{vyH$-@7|i`@}6d<$3Dez3=k}e(kPX^t{## zD#cQr;~7iW_hLB;itnHKOH+F7j^AQEXQdij-(GiR-R*|{W$zDKuC*kc_iWCKyDscn z45XTOWS!L)=jP{@xZBRIY-{h$+H`CG0)JQNO0Vh9ta88gQEI6`0-MaJE@pS7T8Ggspx@5_CdhU3-GM=^A;xnEN zt0uOs>XIE)HjE!lH*H<8z*JXH-SlPF45W7-$?X1OMtJs;{llgWnWnzv;Ve+P^TN)o zr*Xy8mG*QkiSJBYoyd4LCHLNK>R4&&OE>l1wBMS}H0=f8YGK7J+%^jjV#u2F2b>24 z`WJQdffn``^+u?dIJhWoC|RrfA-hZ!lwPGUQUXIX6lYDsryFC+kScS(&W? zzypEEq&OYMIv)tUG#w0UPfUS;I5`5{YD_}C)sW$opk#EhmFna9OAm-Ts*e>G?;_;q z5ojF(F`z(Y^imYtNH`daMaU%%Ay$p=pd}=~h#BsxEMZ2%J$M9=J(HWUh8e=f&^tay zeQdCE=3FP$(wXh@8ie*9UnU=M^(;=H5URh^K&^jwyG$1{bDsRHlodWD63<&25Z}CZr5VR zDg^~hVsr!kH9a{~HD?96EGEYdU4$Hb1mtK$Xpng#Z1|W*BJ5am=tMZN<{RvDbwfPFpxPXg|OpXS=KULnVj%DTtZ$~}vBmBXIg83W5T5&$gmIh6M-p8Fh> zM4kw{jR3pllNPn5R!>4#`Q^3fgo|sqvX)qhBUjQ!xQK@9>vNpnC>kXbTtu7Udey97 z!D1=8L_73ZM2lz@Z6bWrAz5LJ1Nv-m4eM4Mx_k|ii}u-n)7x-68N@(;Ob8amjkT-S z=Yw*zaP@j@94@qo;Ni`d2;pvN1S}g-2u4LA5}XlE!X=>;nS=`oAru9CqtkE$CE+b) z48B9?6`q3&J#w&XSnw{m|{4P~ub||CromfwQ8f8H%Vz{Yn5MQeedrr>Pz4s=SYXwTx%Z&d-U<^>=Wrncid8hSiYf9L1b5qK>EoI)Oayv0JOOK0^vlNwn z2mDsQ4qJ|)V%?>v6nY@RLR@cIs(iJhJ0Pl~4?!F}x62ZYL<-6h1o|q3jv;JI>o`Tj z4JLnnvxT5?rQmTPU`xWU+?=rpzQRXd*EMP`*ntk*y0QepzgiNEME)&HmEh-02~!~$ zRiFk#A|gwIEM^GnnX&ySI0y)$Cqt6RLD&xV@=Yqi=wY7=pk(6tU^Rp}^I_;XU{w!RaPA^TEo8 zM`^*8jSy7nfS;8(q}E}1Cy@IE2)L0D3c7m4AtrvQswm1OkT}HXqrG8Jxwl{umbk&N z69qSTUJE6?%A-4sa}zZp?*lwOR-Nr>ocsW0PeG>HduLTQnD}S2TT7)Gw8*1kE=7K@ z0~QeL0*tC3e7B}yaocMzK%~Xqx1duJ2jimZ{$~?*O;( zd&=m{@lNVKi3M!310&dk6m}X z?Mshkyc<^d4Jm#@)>99!-qM&H%6c0w9!Va_RyBNcILAR3n3H_nV%u$7BMuqJcsH)_ z8`JzoSRUV$vrzWlPw(-Kp8}YD(}UP{*ywXZ?9dbRduDp*G4?%+1M6OT=yBtFbq!eG zOb_j1-`irs`r|a_yD%>~5s)#+nfAx@u2k6y0%~~#GEJ29D{Be59>pSgx2X}hLmov8 z#D6$}wK2$iygZKe5M~pYox&{d&5+|>p2R-%RzAlgkr4#5e}!M{3}on$n871y0Q>)A zlM&2G^gW;~HukY;M&H4LH5bioSAB==Ib%Jyi5R3<19ZJ6~v%?DsU3Mh5{2xfKH+i6fPc$LzoL=Z?i^#k|hzIx9HD_ zcJQqOk8mcYSTH0N2UjsBBNr*g_{ z4`F)MQ32@;e3*vzDj>!{Hu*4?1oaftg!*l)%p=l6m=W*Yq{YEiEr{kIacYYkXW}#C z;Z1yIIgGUkX6T8MmrpoKsVgQ3^?I*<13w3VO4CD+#|tk){u2bLeF$Udte?=o%`ML0yIH3s2H9rIfka`f26D*P>sK&wx+4A z_ZZ^}Q=Mk27f#=1n*WJy`3<}6H63UArSiRo^#0!_bY%L-#2x?~fX{(Txi)+^3+(P0{e-FM9PEbqQ}VE(|RuPyD)csFPGE!c5r{?L`iR2OLF?HRrw zdk)SYykc8AlBwI8;kQA^$%5Xt)17rRWgRv5-4?s?>|XfdiQ~^7e&ul1Y`@6Q^9#={ fed*?x-W~f{^vBU8pD{o8TgJc{b89J9jiCG&L74JO diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc deleted file mode 100644 index a4eae29893d72949eb880ab85f286a7a72bf38c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9103 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 A^8f$< diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-312.pyc deleted file mode 100644 index 0665bcbb7afcfe421f2c9073adeedc9e7fabf6d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4269 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-312.pyc deleted file mode 100644 index dea8cb0adaf0fbf6d3f06416e8028354a1bed44b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5615 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 JzKI5N{{b|^nZW=6 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color.cpython-312.pyc deleted file mode 100644 index 8e825cffb31eaec482a50bd2ca74b16548a33426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26567 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc deleted file mode 100644 index f398b1265e339a15819133b5b0c57bc3af97d948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1698 zcmah}%WoS+7@vLFj`J`HR0XN3rb&x%W4wt&nh+vhX;i304oz|~MH|OEezfb|Wp-?0 zlSoJjQn~q-psJF&CF-UB2N(C|?uAI4dNTwrIUv57-8wcBFe`oYy=L~C-}jsOd2}?6 zV0`pft9VsK=vQvM8d|8F-2~+jnaGqZRFSe$Mb63+lF=Px$_L0)i1btmaT> zk(B-TTCPIOjjC%AUlUV4NDE{nG|mn{IYb0yB@<=kP54h%Au7>Kc^M)@Na#wRu7-NV z)JU`-n~?+cX}DQ7MqYWNecmDAjgw*i6_mFi8`j18GDhk{$+$nV;#dydpk=6;HS~=V z!IYROT%?59DV(!Sylqtp&N~&?v5Cz*>=bYgY*?1|6-f3qk?gBH(T`BVs?^R)VSRk! zz;eLO-Ue}qcF}#X_M|;|Pcfxk$&??fyRwi9mrvAnlvEm1MZz$Hg2cZt3u?q=8?UUd zV~^D>l0KKFd}SuHbAnD(U-gJppi%e-jd3vq!hL%0o6A4U6^W<2Wmh*K&2*?v%lVQnN;1Nd(r(>X zN@S<;T0fX+@Qm>ara^p%x)F2*KaainNO`o`yxkd}XwEggX7XsYHFfksiyg1D9<&p) z?bz%Yq@w}&_=)}lzQ@4IU0Fy4r1B&R@Tm=(_cDMEAiHW#;FTlUrNq-qME3qvulUTuM@Y zZkhnmgP)Fr1#~HH{{toPyulMgl*R^8y41`!H;=9ztsX73uC;ErZXJ)e6VvV3G<_Ww z4WPsuEl>(>Z$HU^Vp3xmAs|^W1MRq7Pyi{p@zaW9*9c{B+#boxHgj;na&kcUZNk2R z+kj`pb(sA>0L8`sQmjn{TZGeBfGcMFb>Mf1mEekDoA<;jH;5^~uF}3DF2F6q*$_H) zKK@r^;};t>E)US~B5)P<@RA^aje|HRCYqZ+d<$G${qc+A_nzH2S#Bp5+OY+J@>+7# zj~RvyZ<}HGal@!MX4T^Qh+%wP%~@e2Y8a-I2e$&?`3b|w*|x)StnAnxcw;VgTtFG_ z3Q&wrKppfl7rb%4Ch(&CoeIv#`zuI8`LihmPxN*`e2-qJ@1G8h?0?o#Z+3>q_V0Go zR3|>V|9MB9KGjCMvZ7_0>%SwI&J+|G6OL|NXi+W2LokIQ(7F?0Xb~{DaeV2S)}EYy ze&rTVTNG)($)E{1L@8@Y)sL{cTegdolTI8Ws8n#jSN(ZxIe_a!dL8oktLSmQcNIyJ UenHp&h)hb0&80sPOk(@L0ZoIpHUIzs diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-312.pyc deleted file mode 100644 index ed91b635ff1f36c72aeca63b468105402b454559..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8584 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 E2ZMMVHUIzs diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/console.cpython-312.pyc deleted file mode 100644 index 5fc3645fe8dd8192a4caac225f3781d60003b47f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113790 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ðmExk%xAwOCd$d*x|P) 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 PC26{9q|aLDm7xCv=H5wJ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc deleted file mode 100644 index 700e29c976319e3dabb05f32d7c53867b961be48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2255 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 b&tKslI=Z;s>jbigXE}xAj($lnXRP^eDPOy$ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/control.cpython-312.pyc deleted file mode 100644 index 6987a72a601d5e96d16de615f50f073eccff88b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10926 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc deleted file mode 100644 index 3af6dfab91355ca292ee05b1b3d72882db0a6410..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10370 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc deleted file mode 100644 index a8191223c9fac3f8f922bbe4c083ec9c08e01938..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1484 zcmZux-ESL35Z}97pD%VkNNCd}0%{@%}eP>aYbN+00wfQLW>f^931fCt_z@#U3IME#0L6DZ4+)?tG=*f>A6zaZ1sXLS-$PZB z6lpZ=I=*Wm`a}&8ZPj!Pch%RbZKbw|bh3hx&+bG@x`QkRY%r$FwnwEt!6s4gy}50*w%^ZI>|VNbD46UcBPBCVmW|HIyW6iR4Ej-HtOaU ztyC^%%jffKI*PeV`NAxXi5=}9^` zKbtO2X0-WC`9g6vqveX(>~tZ!Hgsj-YQ|}p*mZ2g3YyoksV`XVK_e!y&|1v1bi&hr zZS+tWEhOU@vhTutiZCAXK_CwccnTLp4xCCCDe1=VYk zCD%EZ8hcUoO@hvNdUaW^Az$@OPt};4;bIk=)g{$1^_t`QDCIS&-0mVCWl!;S;cqdv z34ZH6{(-rfy$|DC*?oBIe&6Z4eP=eOxIDEFkGEiVzq~o!8Ud+^A7T?bb6ev#2eyZ= z4}UU#vI%TGKnL(TA(0|pb&gZvV8FX>*5g(85nRY8rJZcPfPte}r+jwrgXPWi} zIAEy&{4`^S%B!|(tXSxE`~nmCw(-w0){+E4xCgrKfxh3tGe3iw2jJ8L@ce;%LU^e) Z4q*4z+IQ0MPcZi0R7(PI1fOP?{sE0wc_{z@ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc deleted file mode 100644 index 49fd565a828b62e48a0b454b30b2f91f9eb55fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4206 zcmZ`+U2s#!72f+J=}ML*|KJ~)zl%+33y2IjP~tKqp5Oo`D5)`-;kKDOitgH$eD#yP z*T&K)Q-{*2lcB-wLot(PVEP0@Gfkh`$M&I5eX%heoSV|ncG4*iohq@XO?c?^oV~iX zF?2OLd-m+^+1<0>IeYFO>gz)U$_xL!G4}f)A%DY$R{}L=<=+A!SBXIk!6X{iqABD= zP0UG}l#?}CAckbfrZ4B${G9ihft;c#ocEi-Tu2LXK48}6!djT~idmnl*XjjANp_pJ z{i&_J^n-8JC>;k@K$&>Mxxf zeChP57oBq{g_bTTXbG z<_*e*sWoZZanbQ{g^p~~X*&&S)=KTN$Vvl!BdJQ_&Yg5ZEPFTH(DVm?^H8XGag1yEI`M$(~gS{4<_}OAAJ&_utR&Oy= z?A2kIQDD6+lOFHo`$`l`tQAyq(guv>19FKtvdYkrxcsrRgJbiu@)M}m&prk~|2drB z5Yc^qCTen!1i>u~KlK>_3X}#$MTCW+P=y9L7c_jMiV?cx(?Yb)sDqI~>Km1f@Fm#; zv=-(v5nNB!>T7%i_z3Fvenz7a1zEJ@i#Gux(Dq}bV5B&M^oUgmTDK&WFb#CY-Bi~+@I%S&FP?HXc2RFfkp($A>5Jx#pOM{FR821}Td3|8`)If6NtRsz4 z8xd(yb9B>m3-2DS#I|!4x}M2rY+Wx$IF1uuTZLY$1Z0L(caWCYtb94R+|mJ6Xt`|% zRN<;91;6>H*p7Mo+Sb|Qmxro;5^i3o+p!#OxH9zK(ERS}&t7}>UdP_Wj=eWed_26= zabz)k!RvoNsWdT`P&-dj(=4d{ zRxV@GQva^bbqEi0f8PWhP}i?MMXRe+t-U*zyB;_N#PQ82XJ|oqS){aSaqC%VJ@4uR zH5KK0_vUNO=V6Ey1u{ccw~&S%^TtxNYeDJa0Xn^AVi>Syegq>VSrC)5z-=xch=%x~ z1Q#JC%YmcZGU_AYSX|)9yd|(bFvCK{>zIVSu#K2>+k-f;1;`9pZfu|5ay@n}HeY|^ z+Y8a|1*QAR4Wdqtj}BlUXg+m&XUQ!g37f$~umeCgZUvr1xChut%|^B6NgNgi0vm}o zUn##^UQlB0`naA~Fz|N4eOQ4Z4ocw_Y0s zmT2|j#N+bQFw5!z@(=PAAjeOlt#iiJ?2ofIy6<)NEq3;OeEio#zZzQVd|@f_;*#>> z*E|qi>^md?K;=Ay(q!Dvj^K7N&0z>bhHnkqjid=kyn$iPz|h+nzGO}i?!zqD7Hkri zb|knghW2BaH!vAxVZPtj-FKMnMNwVaOj%ZrLhfR)1dcq2|l%?U&%&7dhmI(dTAPRzqa>p5;A>FM@5p=O08Gt3Ie9A~v+lot=MXPFsws z)c}eV($q1(Z?UnviX&lKD6&$A+(F`RtcpS3?)kndf$B!zmsqVxp1j&B_X&>2!g8Bhl{mBaTQ2h;*tY6JiF*<}1g3$xR3@+Mkjg@0YEI_z7GNJO zJ^~`hJRl$%k9j$olY{s$FfNEICy2vdS3Tvqri4j)(WmXi-<7l@aeWm1w5 zjB%OgJ%63~(IcV1EW)eIEesbgCie3vurV+_3LYJ!c{*KW$JooTrUrlO86X^4ca(EC z;&IZ8NaoIuw70ATp}=mab`{daw67Y;>KLDI})7`OxkclR~MP~e28 zD6`;m0v^=S0>cREY=<;BQA>jp?wUHh88naMtPN=AKu3(TV>mB3IGv_E331b94nV}d z)4ow7dSJpmpT!3LU$^`9;kOFRriLR=P%r>^J->U$SA<8)b|jPL9XZ9urktRanxgu+ zoijJN!6W6U`{8hmorkqBxLOZ@z-uiCpOVmL6|$M+$YMpTmGBno0GpR-zwj(EcG0{ ztDIYIi2?qj{+SctWxnta&%ASHuKTXs@kt;w+jr&2yGOqN_S{={0`1F6^qvx1RATd8 b*L$w@+&FM;?;n+KK$@b&s@sX&!QJP7ztP(p diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-312.pyc deleted file mode 100644 index 0472722a49dabe47ded99ea1a9dc56e6a8c648b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1842 zcmb7^%Wl&^6o$u6N^|X%OHk}&zw0wtJM+`zgK_19e&Xf`UNke z-_(s5{t)5<>F5n|&^dB6g1+a}SX+}+7c`fmx}I=89`@Lv>@r6pz|qOj29Y<_UH@YsolH`=Y+UG1hq8>wRJ~p z=VHB)8&qCXpHq+QF-F;0eb>hX6n1@Vs}W2C!mQAxezSF%9~4Z}w|c}h2PM<&QK#>L zu9)UY-|}uorcKkKwrO6XA#8vB!RXQ+F^-~$IEF(aBP2Wwj=9l{h#wiA+cAPT>{9<} z^YIgdyCHcLSoX1XNVpNWfnkbi4rK;&?XDsH@n#S+I3*e2BZqLF=V*}MW^m?`XUatB zAdE+OSWM@E1Lw^a%fq@w2y%xqsF_iK?fJ;Vs+s|VnLNx%4+pUyTBqtnmLT#eL|E zN~QL$b42VAtoSsnE>( zEIoPJGRyMgy)m89x!>cTUr^D_zqX$+IgY9#;iTt0y(kbF)*YtzH{JqNq?vv=Q1 zz`>Ew#+t1mJuBU77l&LdZXH;(}Z!sxv?=5uNBXOX4^RS(+2#LQaf} zIVmpXyeJvWH%HArTU`?2PD zU#!vbV39_ApW|dAB00k8x1HeRg?CPBC*C-D;>_uZQ;vAtEIQJgY0Lhcf>eY${^O>V z9ygMC-C!`4CXK5$jGhyD)5>R!WbNb{26H)7XJJ?(28mOh#08zkMO{E+49SptVNI8H zC8dDMQd}`Sy6o~(g6_Q`-LIWO;$Gcn$gt{5NqQT|w&{L8_rp8@^MD@GgD?g`#t(bj zfo?AMAqzG&7R6 zrCwoa+pttS4;zv-6Qho&PBFY$N5X>~g&FoVGbfUD-*TM=z&NkI322FwXo+Zi0Z~bS z8G4n&6oDDabFe)wGKD`jToX;7t%*>3T$8=*R2JW#7?^?0wjA72i zvgu2)LeajQH%Fs~4#zC;-nR;gS+bMmS~~qcr`6; zrfp4|?QGZ;b$MKgK~Um4Dfg=L(yjJ#Pah2a^3Z-5f{&hy+{w*LfARKLL5L(9j)e)* z{2KazfNLNb7+c{iME7jRDZ^G#p|qj%0EtE@>jKexl=Z-1;ZZ8v4cO^G6S(#utf48h z{Y}09Z?PMw#~Q!5rG@P24KxXQMGP{U(@Px;P_ol1GcbHMGL)fojeNl zEZ9re7O$<0uZJS5-bh`48_K{o{W15s{x8ADe!krTYBwx!wYCOrw-`bZY=%GBRku8Y zA=?6X$cKWv{u6qWWO%9FE;J`hkvXwM*~JpgU_7^g-ZN6n@o7Kp)UE@Ey$iAMJx1rZuh4pq zv0bpk@z=_xmQ9;RM0AAcw;c)TTFJn3RrNYA8c%)4rVP`#T3}Xb&o!P*~^bbSo+#RyMMZW zghtw(wzQQtEjwW*4Mzl5Iljqa!8plSo;i{YB-UFjJDSEYq#R!%!R)l1&YO;sC={Sf zJ5nZ}HXS*cH4=<=8I8Bt2=ct9afLgE_Yy~e z9$T2UEllQ%Y7J`TROU{Y4Yhb>F9=#+0|NUWg?g8VKNdGa!;d=qSD$c-K;3F|hpoyXSA8UpaS2`@~)w7~KdTDTjM-;e+FZojpyqe% z;YX!5!u!AU!Hy?wB;2)d!CFf8yrEWPZA(zn}_Dw|i@^`%Onkg8}E;7s{ zhE0~KxFA9bvzKxDT|}tjJ;FcA^O0fHapVWWDgwGe9!h5_k|ZBo@l^;64>}*5_}y+! z{(iEGoJxQw?G-_g`&SOHBtLo)Dwf<|6G_8k{!CJzC{a4RAYf|$hXBdX`X3O0{K^0T diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc deleted file mode 100644 index 5db96ceb818688fe2aa2659fda1926d6f12fe948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3079 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/json.cpython-312.pyc deleted file mode 100644 index 3449531f50fcbf013773d141fb63b3673eb1903a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6032 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-312.pyc deleted file mode 100644 index 9362d02181f81ff19f7b176a3119586bc987a4f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20217 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/live.cpython-312.pyc deleted file mode 100644 index fb7e99f9cecec8107d1ee3ae48b9f6fd4d621b8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19140 zcmeHvdvIIlmEXmScn~B&5+uR*<(uGJ5+&IZMZG9dPfC$!Cx)ZI5bvc33J>O9P!w6p zkyB4sPUTvPor>Og8#F<0O7Y`D2l5VFno%T}rp67d?@0|0U?|k~VMMX9a-`@YRbm1pEIqpADMEiqM5Hy7fyag<544Ok0uO(#lT0=IkEmY_& z4B5T*P?5JNRO~GdIlK6Tz+$nABr zur*i}s`gg1uq{{2qSn-}QmEJ1038fc1IPQjCs>kSb!FF#u^ETP9Vcd$RS#k+-ttAblY+q~OY zxH>ox+V0)X!ZpDip`G5H)O)e)z0{I;OA*^H)CzS%{hfyNSO$=~Q{aV0p(&lVL)oxLZ7cyo2IyEpNVnMgg!GE*xJ@9^bFwK!dMyF5XX;NjwxacRm^;_a zabLwM(9e6yd)oV@{1`2s5>I3F&El7Y!S5R3?qO@E7ly(*Veg%N+L~r?{(7&G69=dM zY-8)Fr+4a~ZcG<M{n-)D5 zMSt{^V%Q&^Q!EGl!Jz+qP*jX30&-NboSKdXB4K|JrNzrpfElTXVjTC&(a&gCqq@Qi zV$?St3Coe7=rJnhgKAJINd?Y`VL_Bwt;LxztH-9sk3=FDQ4y7lN|7Lf*296Icv^~F zo^5JoY;K9`1wpN8m#u=hX?ES1;(i20XWm5laY|vH+AWfDD(;9rM{>rN2f2!eZ9cqOMSt>`95I5WF)+;cgxm3IS>_l zrh&r#3!>aN9hmO(0ZfQUeNte263~~#-sw514Yki#=B`e!*0C~V%3W}NdzDML+}DiP zt%;_AYsNK8!>6vQ*GDMfQ%lh+=9tC3WL&nme`#rb2ykvZJ)?*aRc9;k6atukZVLYT zZz?^@nH+5muy?t4b)z1=)PhXKAdAs=by7RRGPT1?9!fUK(a7|C*}9=nB5^I*0SBY7 z*k7~0VtuXXm7-T2QYX@Kx=Luzx;lZ1|B$WkmZLEkm0}G5LawI0s~G^QdA@?R%*gnc2&4kY>X3rR!E7X|)7L93P8c zT5-#B({ro$X75tT(pbE8Fou7PgKMRG5+&ugs%}=@YPi|(fYTRsBr0oe&E1@fSGLD0 z+t(^R!2VlDZyt@iT4S!(HCOv%6M&KiuBMTD6kh3!7y*Ju2}RF2u_6C&eCHi3NmqioAceW*a% z4o4|Uk&1CK7z8cRNsz|Wnc2rShEzwO+v2lH4&Ddl%=_`c z-%{+MU1xGXE-;!p*cM@h$5Af*(T<|;;Tg71vY7*zahu8@z#hOR@K=Di`7Ntp5sjjW ziV9YQ3RuV{nuS9A?4m^|f?tfE13#x|#nHeh+AeUSNflWce5s(Hs1V9tHhT+2yHF~c zC-j2rWuu18-Xf#{UML3xDi+#>3e-hqj6&thCa**25ZuUdLddRyUm{eajZ(3U>Sp!V zAkJb!Ekdqzn--xC@Z~6955EF_1N=(X2WpSc>Vq5OZhT9J@tV@@7YI!+7kH~st{LU3 zg%+_!tW|5*Lg-^F^6KXFo=&L&9rFJdP!yGo%e+6#`)8t&o|$RE9}R>r@I=9RAs|l& z{d0U|0swRT1*C<+IyHHs*JcCj;P*=xLIir-pTJOqvnXbDgRrODN(y7}3ZX`{+#QyeJXQ zL<1pF<{^ymst85h(Z&|V`e)-C}={XNPw5 zdH(rx-FzBifVW?#i_t>{!LX4ymHD*PuBptIMR;tCKB<-^g(kY4i z>%Meft#?eCB#ZJmqNyK_W(A`XP27Ba9wHfq3w_`pTEq$99FnBurV!#e0D}{WB&MiVZUP`AT0dzk9K{xxp7YHH1Ry5EJIIP) zjZ#z;81k{AjKBEQleCJLgowz>#b(J(wGw(lv?Q9I8keV#ouZ^8l)aCf-xJH3L`$+n z>Qe>HHqxqht6Z{{b2csQUvac9TSk`KM^@oFS`#&`be?o4nmo%* z+i%YPBCxczvP)1(E(~ZCk?bjN2Px_J&n^(MIs3J|05$1>xvT1k`{n%_8Qb+JS1C?y~G>(`Q+Pv$&sWh3*WGtjr0+^~C z{S)d)6XFcK#BWk}nh%J`VpJ6TB6u%A((W&N*X_+2u z)G0S}(F(0Z3n!Jb8K5)Vx-V15H@R6(RdcLYf26h1#`%S_w5?ULph_Kdj!GS=QYSc~ zv$>}@O3_61jmMk)LCCkM>|9xEofthjcGy$O7>-JI_F*iF1)3JdC#2&PEv9IO(@7^N zu~43j%=*S>Bsn4}Wj>Ler!p)s5K)}dGxB7L)A%N#!Io$vD%L}n$3=F`RFxP9kf`b? zcnX~*7!#v(pdO53P_Z0}aUKctOv&BL04E6m*P%ox>|Al_Yu;D954Z|zPr_05+Ldoz zNjNJWn-EP>8YpB@$!jNGIT5!v#_WwtEo=7nL@j@9`1(l#U-;HSqPhK@!M6wF%|o%~ zp%0>~&BHg0Yfc_)K`qu2v$rfgvu5vNjDlioc48W8t|w;q+(t^@Cyt7w-cnLcx}y^} zPrNajbb>a=9sG)e|FnJkUEzb__~6;t;MvvoF>0VCfm~-x%-IrmcE+5YYtHV+JzB4S z`>2|8H-63)lvIPll~<8A>W$+GS5>kINlzZvXn;?chUeAd;cbQ=9H@Z%;cn+}x&Ehx z`*nzXR9-XOZ~Ca;K;dns;X!kb{*#CgBaGh!>G;D5qx^RyjG2w|dy&N+5P-B~ik_#w zmm2e@Po-s34HCN9RFHTU2xeMdX0mLWbfdmJgpL>lBV=hZlc`s3%U@ATi_f-#2`<>{?d zvq^1@>#9OD!x$OaZrTVT?L}>QT9LPH(n{;bIsi#h@Vf7dPAoZNB<1Y7@1=IsnXk7r z_B`-YJ?kn!G=nJ{1($qm4mJOOe9MCg|4-ms$Nx@zn}q; zX0p-fVa0qYAO}c&?WtTZ#n{G4`KZbQ4Xr(P=N0KaWNehB|1|{=g2t-hiR?ovR-k&}^anq&6nHG6BK zwvi;8`;IbI@Stn2r(>;8FSj1b5;r_Cr)SOCm1yr`g2?^W-fP1+S<$Un?akT;oU^Du zsdtq0Cu$nvHC-z;U3Z6nc;fvN@qyzj1IH8Y+V9!lw7*q+-{p?GdSb4gHCJCs=!v`f zW3K)+*Var);}7lc+vEL5R{D>mO2*xunA@}F?n)Qxj=8#Tk5RG88r;FHRJNxu~xcQCc z%B^>!KYa0@zeoifZ#v@co|wDmm+rpDjTq(QN^L5Co8%#8{a-vD9Fm_ptiy1hJZ`|q z*djj3jPHp|So&)5iS33T?C*j5VTtZUhv~zzts{fRpPGi-5c#;vf{c#`hdn1+&A(_h zAn6w!rW0GOzv!WiUu-v>7|InONgQATByBh*K;}^-fWQEo*M9;xqr0QaW`|6PfSZ1j z|8W*L507aQ)^8ZHmcaD`3_*PJ#VPeuD*k6EBlB?7tAE=ow#5Npa10ncuw1kAnr+SU z6r}!Zg-lZbt@Gt^Uz7}Z%oKvziBiCl&W~pcI@EhM$`%AR8)b&+&T$f~sh|X6JKJMa zPc>ghk|dEM!_mwO;#qNMm{UoM4@;!IuK$OptRD z4piB)cCQQTojDm7IqaTRqV7qj$RR|KMhTemNE3dVQhMQJS$RlgxHa!q_xMJY!}|pN z4jgdGLdR=^uMEZun^y{(m!j`1yuA=_A6jW2!fuZ{T2>q_cf5aT_>t{j**-eD)-(EP zd*?gzZ_hLC_i0_@QpcU6cZDAY-w%Ft@Z)1YIkwt;YPIh48-_P*f2ZQ#u_aAh?u-U$q+A`Nd%mfFp>%a8sQjP4(x+o%@qn1oswDgWjCvsBz zx;FB_0Tt9gI7}P%`{qTuG$L|38 zrJcuu+WC#^NNdQ}aSVaq#UY?L&&v^|!i+uQLYgz4g#{zKQJ5XUmFl{yb!JV8Ti^3y zmJU%AR5K7#8J=M#l3CUuYNBQ^LRKKVcq|iHmB2h9a|@ce7xoy`o6Zv$nnZd5$qOe( zL3acRsauLn4IdE{omj!Uin)sFczH*xykoVz^O`Nu>WQ~*UuoTb{nCx8RY&8p<)(X@=Qpo^v@3k^FrJ+!6OJE$%7WoDVJNgkYMw*on;q6NJ~ z3Y_1eTv~6Rys17|Kfn46nfQo*@Y3ef4{PhX-qHv5J)`1m*7A}a0n8sVt4w&YxqkVK zYTCm3h^_eGoBBidMM{Bc z8#7i*S^~b9E?^dr?4PHBz(9Tc> zYeS;JLtDKTs#=_eZrN|z-za`;M#f_f&I58(>%9-E_tzMHQe)cRk}L0~<*fgNE^bDz zH@``mO4CbpJ@o;X^2k)#a&bO-olg-eEi!eFK3EVkU(u0@6R(BvI_L_n=+H_YY36FZ zo?A#8C4hpbr8lG#mC92lr)PQcQ=`w5lTXPcnC=wh)R<=vPUTT-qHpP)ugxTGc)oBZ znQ@{~qZ2wV{4Y^UzV`S`jao=LwFzvK29fdQr}M+6W+q>Yc}5sbs~feGMP{BhjN~+0 zY|HdO3(3Ps@6ciyUw-QUbPw0}c+R+`mlta<9@)@^o^de0s7=y)E3=4*-d}?EJ zW?r7-u5aH={dE0+R)6k0k?W)R)8~w8y2mo#mPMgc)Q?%y!MciQQpz~0m)V=(Ie<9@ zLoWkP%|xeXqV!5Y+JgC??_h#4%(I$c?x9+H$W6>vEA^&>$76x%h!pjdt5j0eCee*t zhO=fFa7>_5#c}jBdkD~*YFPRvrIJBOss-uqBSFzBe1Cu9Y-*;1GZ_lgtxF9CLhX(gCMHyG+2;z5M8Q!cfvw)QQAa!YmSsg0Sx!z6MyYG znKV=ClgHIsvrit|GQo6pPh=9cUmYB2H~hqAKisANNyQF?KeX?+A8s)H)V*Ja*hf_@ zBM#F?dwLN5tIn2@8q?2;EeQXt!F0I8`m+`@g}drU?52;cdW1hN)KS=Ops>R<;UxGH}yr%E))jIWis0+YZCFtYjnCg+8lx-0A*T=q*i zIxC>1eAkY(NYBHSW#ReB)DJ?}G_4B*&Fl}6v=|z_&fHGUJ}S z#;e(s0sFKRxqxiBcN9ixhcR}hHdiIZV$d39{p}x*g1oA9kexn=<|syb7NtN#k0(zs z@=e(!WRaqjIQc38o6v|D%@rui&^UEBi=xUYB}1N^|AuPhAH%^h#=`Y&i}w!4dWWwW z$2-dT3iIY=d#qt?HZA54eJ&5h4`sT2-I@$iS7?s%8NoMe(Z6SXF1d zYFDgk7lc$8GL=-|nxAi7u0Oo=_u$+ejt?A)4ID!7M&aWkR+*b~)+}49p-Dg+Mc*!3 z65a`aKYYJ>_u}#8>fN_panG)pXBUFkj^B4w1M+cIcDW}qscioBe*1wT!-qqrgBEj2 zOLH0mv&Q}#21Nlfb6k~ zV!<@R$UHhHeVNim$T?3=A34+H(56v}4)|p;V;(}nn>0fX?OlnE_bR8mN}&OAXa`D! z+|uiC-sRK-BOMc1$C=ZNn0yEH;$`lEzQ|-rHgWv}NmHB2hV^UfOjOn;>KYR*t%>S} z1m8mc28I&*4}D$*2oTT3ui-L6123&!Y>$;RC9PE2hKWxWQpnC#)+CE4RLs>iB^?xU zaxQnWghHiUb$zmoLM{rGQ>cQg-I}bVkejP&Tyo!Tx*cBb#A~EIG51iCnod@8w&I61 z6gsWr3W}3@y{T?-_;U{4LxYx(v=o^5rQ(Miya&!&Q_td9l7n|!cu3yE!8%j_!y&!N zMS!mR=>Nb{QLLsnR@#>|A%%EX^6^e;`b6n{Z<`2YCfgca6h=@hDq< z#WXfEjWlHL4+bvaJu5>;cvPB_Py53ny_q$h!SgEk1!w2NQU7Ji8YA;`|BFBlL4;*y z1h;&6b{Xw}=6^<%ckxGYt3V*nkDc@IJwsV>YV&#ZS;^SBbL#7wrluxV0Ec&?Z5Kq` z3erj5&qoPdeahiyk2si!M@{jpsa_Pd;e^ZM)uu%E4rrapDq+dE%-8mkbU!_*O*6QEOdyT9i|M z-q1TRL0ke~a<5{5mRT`Ds$g&2VNy7U-9ILgCK=B~*z0pFBYT*wn%$E!1|5J3RF;VM zCVuBb96#w1DBk}i_N#1`8Gkjw`J zyFAD4K@_uQhd{PBN+IECN+MD1_Zd^&Pvx1?m83$ch8(iDQrR7GX*`1m@ri_h9C+QO zScx9s5l~Q;-Xyp`Cg-~ZXYv!dl-{BQ^{MSN5lZP#DAOo`R!aYbf(0@om(urGA%?ip z5{1ovLGVeDS;eJolWYl!E>jua%8FIP3t6$TVX2k;2$e`Ll0!lRUM=|iVLTsXYmArg zkkts66jJ~~sPUC?vMvrX-_{astNF-4)z zH1Hob7%z&rf3i`}$0Na+P#D!m#SmRdF^t0#eIS}rq&2`WS-ML7D;Q^&%F-?BaVI$> zXFRbCs_%A(r2mX4u$q(q9gZJKgHEUWl(YSs>x^-o_qc{%b4TLbkyY-<-*8pG=8ms& z$M12q_qay<`!%=w9#?&jt9Vr4)OFl=_7Ml~QCq;EtGPC~SpA5jQ1UBg&S<|jziO!Z zm9gYkM#nv4!>^4UF=NNy7;Ent`FqBudlaa?XRJryH^t@uFmQF`H$`Phz0KMLfx}vY z)99m`;^Km zTD3f#u(T&EMF~q=qNIAcWguqRp0Jc9EXAK#?8`-Us}=|~g|!9CM)!ki&RM=(?pbwo zUOn=;(N$7#_2`362oX0ftXUxqG@5oUbtZQ2fi$`}yi~p<-#)l>`R#_gt;>x&W3^~% z&u_}B7q`9ceaO{YcV0V`sBgb*df#yO=)WkAbqvMo_g*`7zZU<;Kuyuk8_&Ehv! z%6b#7+Jv+EhVho|rfqTC8;(R-e;;i|cH{O0kujZ0to z(_%7EIdCXZ-gM*HTjy?`d)>Dr$I3fz`(v)Y2L}B?UFkBOs+_v}m1UR!JNG^);9Ql< zm7dkI&Ueq=t$OckANXTEdsoW#CR}ZCS7*%C`R>4S|ABb_NUVQkwg2d9*Rh{(iFKV^ zbB%uDuETt-xwqdi-FKG9oqWv6FE?&ob8bsyqC3}|Po<+v4QtLV_jewR?>rUTd1`g% zmp-Gz{_L*gE+#vaK(;5@!+59Cn++y|a2`Q&h2bE{J`*`b zB=;pEd2X4ElO;n%F6OElW9u1 z&l$2^$>$5Al2WypS+}0Z=hVC+>z*cKtflIn8967xvXM@2sxV%o zc?I@&Hd!{#IxEj-abZIYZsk|v2u@^)eeO-Lr$Eb*Wtvur^N%-JOCB_U~L?I@ci+a+_-CJC~A z&Lr7^cQkni@J`7oyCj$FhBnWf1+;5UdW)8rS9hGvEX&5HuGCLZIi<;JG!><7Wkj`w zlorjViqQ*lbg3Z004eTpM4?R5dG!e6Q0kbn*I2Nn%h-|VWUkmbAb(*|PHXY@Ton}; z-P_jR{%F2wVm7xeMU8=4KAI{NlwuSZZ9(o>IUYSJ&!xa(D)xd4S_@v=QILDw}|ROsvrX}&8n=-b#<$F5Y+8=$;3iFD<>A0mt`p- z$;$~alUBH>CgRI-ZaJZ3E+h&?Z6TjK7=PhFLWK+PTp^Xdn3|W>L?Kg1h%ijb(*(_= z7hv?VEE*b#7mB(~6f?PuCWGt=7(AM295V~~-SK72vnw2$xTTXtj(})JV@WXdP3|qD>8GTBa z?T==1X=O>uKMZU%FZPu(_H6>C#*7ODw!nH3d~;-2>BiNndO&cmTaH$R&&u=6605XbqegA zHascR5;z;Ur&+jy(ex5k^AyDk@_Z(jLv!Wlq6pTe(VK1uQ82@9YKQm1#->{aZ`0l) zlT)=+E-mlyVg;JXF)xObu-r$ZQx-lfbP#z6s)Txh=-v~PGc%_rPfdw4Q|I5DnbzG? zGn2DZ;^}Ge?CI$#-G1WDnb~tQ;+t=L$}<@0oTytCMJiyJi18%w%90beJtVR}~rrRzL z&S8b$9{6qPaBE*9+!H~#%9pss&Y3U?3qaFsaGms4(^0RQVHWPuRUo*VN@j_>ZMxN* zy((y}yp1eA26`o-y{4sPVeZ?yYAe}FrbSoR;vg=f%jqf?PlECO0O$2}b$|$&IvAKH zN&+MrPrYJW>O?Ckt?3h`1iP&bNYvnnBaHn zd?6)K)EVtTf{t*7kH_P>B@HhRnd)T4jd3#GdSyU9X=|so*2N`N%ghyZ9&$joV9dvI z9o;?;`3*~ljeT53awRI6oUBp=U2_QLsF0y%R%E&lPk^~A#iUNRKq3yy>SiUQYM4Re zBZ|dPY|6oBv=^L=<`V0X|OJ^%^)ksJ?I2>;ugBQb$(HUhm>xE6p@_^mW7ub zJq}}3G!ul^?P3I4pD1FUD>mH-B)0t>k+!>Y23I-_xBnmH-{9kHBp6u}uZd+x-Pc$1 z4Oe}`>!UX&u1{?Eo+}HiZM5neT~FTW`;+j+;fil`!}p`Iu-P6ww&B}b7Vh%7$@w?9Px;Iesj#a&5H-mS*iF#C_d_k`<%d+GzD^-!c9i9K>!hId_cH$222TytG>{pS4o_>K7W_?^Lxk>eYK zuYBd3+_~LVp&smq4Bz=}AhLG!+R=}Xm2I1mJ?m2&k%@PE;iX$*O7#ZAt z8fDm5q+agdkCS1TF6jA|6aknV!-S23r|!Y)1{#9;4@>4I`~O4Wz+y9QPOE_=b$!<1IBl zP~`(xm+$g}e>D&N-F*0;7QzjFL(XiFGhdT|Z%7R2*Cco^9IXr=tA>wPNbp~lcQ|hM JLxPm;_g_u9Ww8JN diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-312.pyc deleted file mode 100644 index 52c7e820bae6df58dded4e188cbd7824383bc790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13551 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-312.pyc deleted file mode 100644 index b620b71edd5a4d69b992df5d432366c6cb02dd7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9295 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�Sp^DmZX#)#0nA-n3yrrOrBX zSG*@nz)xcT(!g@l^0kM$kE0K#ABmp^lkJ14<}<14p$*iZJwXy|W2UGq)4A)JDMFGC z%oi2bAtqZK=i^l=OHGzREii@Eku~6=5iC#QOsd$G#iL-Qdh><_cSUprZC!{w)>S^I z^)`L%#D6;ortOz>=dXcdMPmQ*#V3|MvHta$U4@VD{{UUK%X$C+ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-312.pyc deleted file mode 100644 index e4b33ca62cb7a2716ca44a3ef6c6c94a434f498b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6373 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-312.pyc deleted file mode 100644 index cf7302ec2cb7bb719a1fb80b33e819c1c1f0a779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7131 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 D2YqA; diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-312.pyc deleted file mode 100644 index 68f268a9e3a121954c2cf60815ccf5468bb11739..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1817 zcmZux&2Jk;6rc5ec>Nvvku=bt4N)5#gq;+DL{)*(6y+8nr5x(ZYP~Z_oa~30**L7# zLy&Sv#3ALB9CM@!|3uGRfPg3#Rf{aF^*@CCcz|+7QVioW^O2tMJ2@7Fiip&xrZ9-l5z#HnmknfRAsZxB7 zW|dS|p1VEYEm{o`aLW!{7OeWTB7xcq?Ic{p)I{jN4V!(!NL`|&o}yA+W(rL)mC96E zR;aqI3{tCWp;FPh>ZjHU)PYp>kkchB_-ZjrlmF5%@-f8MG-{ zjukRm9o|`dNFJuTieSz%*CDdNoDAdiZf(_fS#7P|X0%3GyB07JwAMwf+Gbw6<}@3% zRtP=x-mA{usEKC4-fda-I#eoZt!Arcf*JLBjW_MpTHJtE2yvjGPBv;(75BrCUy?oq zCY5woH%-rSnQ3;jrs?{0!@+&tG(X?4oa7{Jn$)*VlVh{GGStdTu;V!-BS?x!(gT8z zDy{+9Cci3^&(w>(l&a<%51`d*^jtg-cM~*3 z-Rx>+bkMnQrjBZ?yM(q^fNYW9O5+F9$ECM^DV2XHmA@G~F3o#_*uUiWn9tuYv}3%l8Z>NQhpf;Vk!>wf6zm(90}eR?*KvQ&Gr;Y zy>Vdo2(UxDkF2Mq)Cq(lu){ki$YKEEZJY+zYI>&m9J>QQtfFhJGZUxLv@MRmurv(0 z@Evv+_L>Mnhl#~Xu`62*n`4vXA<=@c)$~^4w4=d@QjE%b6Riv&(LV}(@kvzSFB#y# zn_lqBXr1b};?ewwPlFNWCfY!HvLs1Q$k8Rg~yqZy@}n41G+PDoSAw7ohd)oOM8Xg!q?vM==GoU>6bF- fuyf^Jjwr9c%nrm;fmnT18k?JuAI+$9AEy5S(OHj9 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-312.pyc deleted file mode 100644 index 0124e8ba11d77190d0b4810a0ea0d7686b183fbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5311 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-312.pyc deleted file mode 100644 index 617d3bd937aef94424cb5307f8b80333388b2d6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12094 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 F{{~k}bin`s diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc deleted file mode 100644 index e359141bc5d82d5f53b70abf563c3336628a152f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40053 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-312.pyc deleted file mode 100644 index 02edd34410dd90b80d458e6bb3c9fa1ed46f6c69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75075 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 X3GWL_$LVd`w?5;rz3tGRsjK;4sFBd% diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc deleted file mode 100644 index fb41ff7bc77e0234edc2911df9e3277d777729ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10386 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc deleted file mode 100644 index af5f2fc645b765f509d704968dea5665b70b1421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14778 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc deleted file mode 100644 index 104ec77540acb3016e7cd209e0df813185db036e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1789 zcmZux&1)M+6ra_u*V3-!&%`lq8ny{;BRiH-f3(GzHjXigDTHDhN=3`E-W^LTuXdN2 zu~HcseCWZ4QVc!BhaL>=AtBcu`aksIAcwkxLtC0lZz6UtIh4LxNtOs6q?z|--h2B# ze((L7N@)nzC;uJfgD!;r7EEg?P2%)RARZwHIg*D;Qcfzxa>nf=^ zRYF)HD)6$`U5e-8@TTMvP8XIO6>IB?)BTN-)15d@I;xWZUIRW=(bLI)#HZ2$NmwrDQgUtIWf>A}6U#JgQ;dlscnB;K=(eFqb3&BLpe5c3JkEj+}; zEly6&OioREMe6wB)bs`ooOL&R7+|=BU(ur*MQ5ES?E%eJ#-u2{FiFV^twr9dF4u-eRq{6_l2@#utPyhP!T9 zzR~c=C|MO_4I3m15 zyI@g^F_M;u4z5uVh4K3HY#}J&Y_VL%PS(NYEW?zA8#J3KW51mB+_h|2VTHh-%Dg|B zr7pu0p=EDac}%mR8)i)qa{`hTo@7H3u)q$yOjzM5mzoWqMPbM#_?kc%orG-%ovA1> zxHtFHU@boS3dIsLC;GtN+`&jqzx7H6_N8DC--sIJ#AK+<~yZX)G0#bTuW!EhK{h- z(po{Rw|(3G#o36 zo?UL)sY>8)6S;suW$XC@^jrt}SYTL9?1?%G^x2l@xqjYg!B4<7B$#5KWi-uzHBa(% zHlhUAE}C((f$8+DF>izc0}U69RXRl)5)C`cQ7?9wYCO&ws|C>zbkk!-unv^HNvK=K zVChZgGLaiZgh=9I>wzt;^I-sQrU~AR0B@$*JVewVItDW`Aml}Axn|y5x_ftVd1>W7 zR|pQFoAQ{6ZsH0PGe@=@hln|m?jl1%Ewa)V^=BD6kzvOKlUx@g%`9Q)D2Mm9Gh+%X zR16J~F@uPL^F*XBG{|+}#U1?)wjK2E0P6ba<@M1YM-P=tCtCmB*naUyOaJ`dFJniO zi=ugEf7m+G$4&;X>}$2b8;8joCqr-V7axz+hGus4-!B{Af3>Tfj9lB_s*Q~8_8#ja zhu1RC^vrRx|2RJUTm0&?_|<*$C_ZsEh`?Ig{PW4hvmuo1+v_>dYWn!0GEM}T9;AD? z3NZjKh!~YoE{KSSsIbAf_Gt+7HA*KL7WX1UWJEkFYeC>e6N0Oa3P}YjWmDB^dj^KE#oQk79 Va7DVc|85<@aX312CeG*!{{zfozlHz+ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/region.cpython-312.pyc deleted file mode 100644 index 481ce5aaa24bc0d1b53b1dc81da735ed38d2d750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmX|;&ubJh6vvbKwPkH>6)zryISGTfLB)#{y@-Os9>iYe65`}_CU!P6O|qlowH5pi zdi5lTe~SM=4G4lKZ^G)O2Qiu1Hjwu|FYlX|yyWZF))cw%=-hqXo_}Mge+?cyNq(2>44l>hhqEviO$|GHj=FwgCQe+15~u`O&V$X!XFwCkRlE zIm&}QS3D0Pf|v)pE;CSgLD2=pp86!4*yIJ2qLJ@zJ%)WDL8mNLP#7l5WzCdhpG}+n z)Krk_LIKE`#cwU{ZTv=XQ`w{fQC4Q2C3b^S=`KvEol?4J__FrAN$KH|)$7cJQr;A9 zITX^^ZAzJxjbX+eqbdE2R=&ftJyJCbAg{X)IN{I{1KP9)n#?+o9jV1D()Olmmuo5(BMN6oY@kS9Pii(U)%-UZ0&lpVPKwo#}J^B{i|1p^!JvklBrOQXp zPB*uYpQ|h9+Ibe*#PqF@rScCyR@w11Xs$Xs+t?lZeW<1eN|Yb~ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-312.pyc deleted file mode 100644 index 03503327ccfe8ebf47c10f667b6b889c5292a247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6623 zcmcgQTWniLc5@$miju4+^`K;05683}(XwPaYg^t`BwO(#QexS0LbN5Wd9NhOeC6IN z%VMdml2uW)@rS$%tYz3il&yhMh>Mlc7E!+HHYt!kfRdIBac{kVgYHN3M_UH6b&I0s z%;hC%MQ%1f9pKKKnK^UjoHH}$asRor)J~xM@P8IZhbjp9ckCFYGzVB<%1x!lk}ahOk5` z5&2ITowBb?GD{ALmuwPW4@1zFOZ*61fT71>Z-mYxXY5$iW$ZN*PRVK=c+svAG{ZI1kI zW9OMkU1? z3&y;DKog^~R}Kcoyp)sJl#CM6$_apCf@+p%{872q7}vN!NYTu)q)y0@fT0!VKw@GSQsi{CLK+B)A0e=d~wV5^T{N zXu)sEV>0hmB$xylcNimu){o~#OM(m&k9APv6)7~LOKjW|oJVR@VzA;M@hF*Q63jSV z`Fu6as(24*fj#plZH$4-Wkl9+$>f-xuqj`c&+F!^3oZKC}9<#;q0@mS?H>{#im2Nva*kqtMFae_RmahIei z&2(7^O@Lz)r4eBwq$+sd+_|C~UK<)-YA51*5bQV_iUx#`a;!t7!yzFc6~^+&dw`H) z0?ENjx3tZ@mZ@pF?!V@rJMkM=>tg?U+rf0(!4=!R1FNo+a|0P?Xo*!0iKTRi1~=hJ~)5U0Lk>>GZGans2F#eM#oy6E_nN>h?bJ?oZY2UEmhZ zFJ8zrHZL6cm8<1;chdCdM;^GmUv1x+Jha@oba7cRzW2pFyt8&UISXuQ}2BR-U^O^k8nsgcSXNqq&@<9QcS7%MV4e?`de z!CuoWm?v(W=062IgkW?FV@jWYxms@Ef-7PT6ZLcUIs*oyH;&Q7rm~6KKL%=BVEyiNw&rn!%W30pcrwMd61Bl# zqm9VbVC*rXp+#g8{7v#9Yn-RZzR!y6H2-6Ml9?n|xOd1T^OxKt{t04L&GP}og5nMJ>wr5JoAp+0kUZ| z#iM8ar;opLVd!kX=Ewm$=3&G%VaPkB@fg5rw&Pa<5{<)YeCaV!gC=8sArDY&$_6aL z@R^35)N<)|t4udVMvxQVhy8+~da>~`R`kOb$_7;bL4G?!vi!DE*F#t9y6fe%>*b{Q z%kWZo)pc~&(!QH!blvW(iQ85Cgm4YDSu1hv z_^9VbPxAOLPcNOm-+1U@iznH(Z2HuG*S^|vWYu-#QOiqzvHRoQcSe`RmE(VV>a$a; z9Rpw1{A<%cHl++MX3@`yzpFy``jY%+R#jYGeLMn^NBl@xG5nq^E-&;!c&;3-AC zcY5SXotK9%idHcnl}|&ZVDN>fuOGg>aJ=!l7aja=T&F+If~xxqC@OUB(X*SF?qdgSuX+19M} z8K--WyXwf4RHjOrGrPQVed~^odhUbz#+0onmvX^S zQ7)y~@)?Fa3{zw96=hV=qs4G}G^5&r>gEg$Nl|)X1h&r5kQSxa4ZwA9oHLGsYlWOC zA14kMx!goPPKF4N9i*wDhoSoQu!SQ~&@<=m8RbK-U{FD3;4YbSTCG|bSSxQ!S=)Y7 zUNztM!BomxM-_?}IxGYu5VgUAd@(%!2D+i*e+Cja0-j)&_wiF4Wd7WVX!P4j3u>+v zz72f2dORUAKWESri>%0v5|RG}6J$o%+?YvkrwH{a=0S}ciAFW1+EY)puVZbbn15{!cp#?&1&)&@<{J;<2_;JV|v zp!SattpzG-Uo(}?KRXT8!tVP!Urp8br7HXGJNhz}o>hnEKk4g!zq*zggolD5u8hHg zT!q!^SfS<76MFjF0sk1tZyVJ#01BF$S+L@qZTI5Arvw`P2_hE$8tRKilxRqbmkvXe zEef(ot<~2@^=Z>&P*lgh#siK!di5U-6ycoye0RwBA5OE4Ohf`IJY0poT+OUbp&n&C z92rwT83QyK6FmCLWsJ@Amyb!EjDePn>6>l{&LD*HX=P`@n4X1LU$>I-YdC{pl>YqR zM2J2NsvIi057*VfZ<~(XZ<`K$jvWDAPFcWdORfib1pGhJOfkq~R9%^FB#8&As|hvw z%z9M+(R54>K^Gsc@(Z}NS&m_teRmT{$(p3H+?Twvw0))h9(Ql}%hr3P>BEDmy1{hiP}=s!j5$-`oGE*1W|*FN+fxD! zI6~H*Wf{ggH#V;>^j@1xmu=6&jCHX;S@H3}69hLn1Bs$%Ts!FS{5c(QY?)tv^R6X1 zwbHio?q@HhyuIn2uWnvwC(SKc?nex>FY}}RCpuuOm~WeZ_u5NoTSIQjduWAU`mx@5 zWU|k7&oh5|X#TYYak2Bp=)yZmKKbU7CDr6jSMN)e>`R+EH%v$}dxAAMoPTAZf3f1m zK)R}pa+j=53QNw-+@RE%9XsjpLJskj<#Q`L?p|0vxuV|d{cJMTeImW*Tk`8-n3?*_ z!6Q#NY@ZVX2fSTbocJBt2h40G;T?1F`y8yXeZ%sm-B|(^Xx$7)1JGj!DJlD)eWvf% z{JyWsYCZ_g3_RjX{^ZPiXXdxB@jEgAzy99q^Q~)qEsj%o;q1)oYrH!@m+KqrnsLtE eHq*Dx*QEKHHNGjo^1G-!;N95+gm0jC_^V_G0%w&OP_s^SbArJO2_4`U#Yi|Fd%OX_S!v#DP=9T4(D!93eM}LKH4f z3S5fgh~iTCysN;cc-9y4LP1Q41$WBL#$w)6@TR;4U&>eTr~C}&&IbxoN@9IaK3E8) zLagu2hYOKZg!O&-Xd#x0al}QwLKOcyLOKOt0Jg1AAUd*djsMh)O83PFEmUK?l z6qTM+_1U}uB&D(0nR!E{_eYW1VvQbKM@pv@_SIC*@gPRqCuGUF3BS-T(OU)g7dDG^X6g zYiYu>${9mOj5Owu` z{Fd8BN(z>L+W?lxG-mN2i6t^lERnH6n}G_AW7UGyKBz1=RgGDyot>;5b0Po~!zOOI z^>T}=Y%A&&0aWuSRRw#>q>r%v@@(u;S;>slL z>coXcG{!L}ruHsjM~!8dPMcXH|I$ti=?1L{_iN zsNnBP1C!S5DfekbLw?F7lOBq^TK;b!ku#JQDQyKnBXcC(mY}Qosn12wkrbX}S$;Y( zI9)8LgSojmRT)&&xj{qKjhRdO;J}=!%?;+WZw*42oGxlZ14sXKP|q6b^D~*rOPPzR zJ~)$|8B7D3Qlx`4J2^eb9BXFY@}|>SEo-FHr64;~&JdkNFF3RQ_K7^=F76kTf_G6O?66`NQ)e_?In&9yhby%zb-F0_`8Md643 zO8Wt5!j*VC8#T2+<7K12_HV(4WU}slFsQrc2^heQ4la~Kq&)>(4csYLcdqSenBjja zPLQNnsr3tLBwtE3WbSu$>x zZj_d^m5~+WXWxDAyK9HOd_TGtKECEXP7_GRQw!#n#}1PEWZmgu8s+PS|JGfw^lO9z z8OyFl5-#unZy+Dt4|3NJ4p6FHw@xmh!wskf8n0Ur44<>2EI5aE0ghmftN-k`sdv$!Avcd#IjT*dC{0=O49Lxi^<`3v2&LQ&R zj-h*__j}hnUS9NXcv~yp*rvD3^mc7{<;Pu#cXPLLtFJ!ndf`^|e$Qg)QQQ9Iudj%! zAya;7z3tdy=wHK~4H;@~T|WQr8@JxrXg&m-2g28fuMID^t_ON5Qp={)ZA#rMq5JJ? zQul^5T50cozi)MTv;Vl+e|$Z0!fZeBAZoUaERH>D+PCaq$=&;^dFam`aOR;?X6wj$ z)9J<0iWIp%er7O`NJb-+v)Y@(Zw?rDSG|vwX@47Hl)6a6yKEgo6>&ZK6NX#+G}<` zziNC?x?S3khPNkEyHF=qUi{hd_l}#L1NVe~^#6nZ*V6GyFnT?8Ew%j8!(c;+>)Y(1 zv>^ey!$NBH#d}}g96Dpdum6nM`O1gFul&CR@)HjEV-JIgMhe|UVt8}t6%&5_uY4Fa z`^U`A*FHS|tJE)H=Qp1^u6)e zcr!NA-)X5w4-pxX85ZTOCW=PJjt6%OypTBL4}cRP19Qs#F&hxrL|+hsq2lWrE?cDyaW1lSbA6MX@yq+rLWx(et?fa=IMh71-g zCzcQfJ&1N00U2RNXot>DBPg80Il@m6IttTNf-1@H3A#Ei zcSNzAxL2^h5blk8b#M_D>6nYc^VUrw9m_|TGwWe_%_}n=;a(!iCVT;EnSz>5!`+fD z6cxN)(w3A?zdf7D*JeEFv{IaeaEp9cJlrp~MKCf`eBDt@rs)B!Fg2n0x}uPf5IO>t z#b-5xS%Bg*ioOEXZNiwaje|^5tWbL0gz6pgsmm*RtF5H>U{#EZ9T2HIArD9de4pt?%ZtB@=dkI3IF(!2sd{FGwxQ^g{E z4tfB)nR1JUROVGYuedPt8kggRq|5f;&eT97rg5-mu#m~ax zZ7V^()t|EOXcXVo~_iO~Nfd$X@+QMF{-W z_+O6SIIw(vBbL|@djCBX-vwWq{ZaqQ*RPKMS~y(oAVT}^!8N3o-+>bV#m?^wz?#_g ZRL5-Z=dtieg8U-k89BoLqMw8Me*r-#mnr}N diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-312.pyc deleted file mode 100644 index f74202cd882cf76fab5207cf791585be3b703e5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3827 zcma)9O>7j&6|SD??&<0I@r*sTu??nKF!As+76i=SvMgfx*|qQz)*F=BphkkWMmQff_&je2dBG6#BFu*|uSX0iFL|<{M-4eId$Op5?CIELfU%Q$gIz)9SJQ$!%?K5z}ENd|YquM1|ny_w9K z)Qx*eN!)u)%=eI9yy4O?LUb6s?$b9Iefd5Pg%IgmY;6#}(@*;G0Q|bKToUodYkYnH zGzRb{Jh&M0)n0w4CfDTb=BI2i%ej%WYNeu?$ z+m#LVN6iAsjO~ z9501%BJg4^4sjcJCf93ropGc6QK$_c?UqJdd2s{wzY%N+7kL z^+=rqbaG3n#nw4~fU;@z*RU-=HI+)unX*h}Mx`1{Q(MtYMODh$3^5fi=W?>FKs!#$ z_F+$ABX30+4$yU2Ij$H!(v+fQI;v(u(ykd*Ow|C(s)=DruM#`AX2`>XGVG@z!(7JEWvmb;nj5OBuIJ(l)S$BxQKgvh-cbIx8nlwk3tBFn6qyqB+E{Up6;E ztLx0YgvQsK^wm^G9*U3LmyMoMb$gxFHmH?h&2(OJ@~nDAGpdH-gPu9riXfr3GD%7n zC5k#ZNy&@`-!sebGWBAhz>;EG>lQ7u9T#>=ua6pY$Y+-S$Dx*H%Nd7O&EhMrz_DP> zX3>5*4*pqrr+waIqjfp-Ulhr*h^`T)VogqyqT}x<8={c1h%yQ}1&kZ1s2DR|6v>qe z#?-*Pk?E@KXr-FVv$LiQt!w1RaKVU;(ZnjC8_H+hhd4JEs&mt8L|h5%bBY1D>;ccuVWs$Q8=CyApKRb8*; z+)$wady;KOrH*}B1L_xa>oSy`Fx?2&-7r)Nmn+!p>u{{!PK-=h1{s;2nIU)tlbI2R z*iPk=J(2^|&Wz~V=8Ip|sL1@Suax&8B_hu(w<*T(i-&DTri9IXWBnC&-Vh@O>!a zv8i@Zex=?8x|0@#k_(|@h0%@sLrC_TPUr^aLz+gJ53KUIe3@$4l_8l5MN6+5CS`@p z4MWCLMz=1{NW~S|#tCGZ7af{lE0Sv4#DI*ajDg(+%RnRb;yEtqg$C?+=q^TWON@)vHEF0 zhwdtRkwaZ?JnY49Z2U|{qsMNXy19Sh$gLwkKYDliv-q9| zC;v3|hp|7Ny?V0IGw>WG1^K!RS@GfHuHJ>Cw~jUvse4_Y4Bj97E&nKcbft6X!I9s3CPVl3k7Nt&LRAi>MG6n@A8uI>bUE6$%EFB0v{h)+%t1a^OrX%MDMe zw8;1*Xzb7#xK@7z-2y7Zo%&;-1RTO)kok`}ER;i7#F0DvT)2H-YTuHaR&8$60hVxd zNnUIbMnEDQs-bLbJS%xj_LTYXl&OqAW#xI|)NJew(RE9?U{M{PkX-j>p!0zbEA6>?c2Y1 z&%T3);H}6ElohC2u4oV_{20_#sv5Q%((r8bBkiIOb>P@`$^w=~!8j%y{k6e$)>`PY<|EX3EB0hP;gVgy}1_m z<{0;SVReO)ZmE7i?jvtkUYx#_-ZU&+)yZ4*0$5~K$XpP0a`! zN+^|SMwuj|%!X!+NpY0!yWMpw(M+&WG8i#4%@h**R?|$XaEOo3&;Bjk_k`d6H6Oip vy2(qzd)&>TCSuRq#DCu7SH1DG3=*RAy*IZ%;`_efqdz&_+=BRiZ_EDymZIIb diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-312.pyc deleted file mode 100644 index 6c38cb0167875eceb540143d9ace3bb20f5c5ee9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2481 zcmZt|TWB0r^v>+O_mPdUO}dH6#HO(u+g)qXLMuKRD9t z+V9BZ`B0g0{hDK!tuTG)nJ4!elaKA4-2eFWzTY{NbD?~Y&eo~z1F0VL7cF{d(WS^( zj^i3u+4J*aC{H@J=U6n%w29cL7p4wS+obFO_2w-<%*0&zaBL+M_c3SQt;BA{SZy;a zPXlp=P*UPdQsSS2$dnQ$PX#ma07y*16iw+J-jw0)3Kgle30GAro0=&cQOx8?sidf+ z`)8)j)JdVFE(-ZfC>^XYO6}v{J)*P7L3By?t7Tt5QnM@%NMI?e*B~&u7b)vy+te$} zaXp>BP@$ez&@>(35jN}Xjws~TnA`f_+va!clhvAKu2CthZu2m*`qtF|Z_}N2T3}lz zL;B%z<>)Mg3>=9z6!a;2qzsV-haG*|v1x3Pr63rg*7arjQOL9y?FqAG*R^VuGG^VV zJ0=a2T}6-e!d7-0?w1(#=b2r>LO{UsNx&n+v+^(?C|J(qv0#^=KzR}fLE=>s5Tjja zgajOLxF>>u2d-1{WRc_((+pMf982R%3*Fw_PKV7ZRoWn5zfODuY({F2ix41JLM@|n2P}IA~>C8uoV_aUI#-2M?GyQ5PRcURu>WAb|o{!2kOt@te>K?o8 zIIpGiNvP%8aT*KNS?U{cw@UM_S@vm|ihI#SmiVt=E86%H&~N1L6Qm`PP5Qg3w^OIm4Y9G%+;QKhxleMh%h$7`m$ReG zWA9JAH*qby{o?Hnu?dR9Zx4S!FFbm7`0A#~My8qVzn&etoE>YXvaijYnz@o1Jd#~muZjyvLa_Wi3)azr-{=wH~8Z%*Ee{(nqp&A>@KZy}vB zjOXXeR$C$)hUrvbxyLZdw(a=Q-1Z>iI5ikHYA76b9E;%xkZl9>Az?YB(L2`DL0JBt z3Fu{VgBL}ml_9;OR|UPLk@1P<==e=l6L3lYn{6)8B&&D2O>xZ%z|EOSC!%-E+ zHxUi|RS}i%n&?G=!nOQQ5A0rb~xW8BD10w}WeFX=!_LjV8( diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-312.pyc deleted file mode 100644 index 31f630755c27b5dec09600fe657d446a85f966e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28158 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc deleted file mode 100644 index 791acd8807a070d3db261ed0d73e6b99bc197419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6061 zcmd5ATWl29_0G=BK4u{e{k%S%?K2tBx>`wVALdhR6Xa;&aCY? zUsa{v)!uvV>)dnC`_A9|elLNt``?p;^8rFW$BtF}Wng}qBjhSkh{B~vnu~I2N7Rw# zqkLM33TZJaazt?`e9D=2MO_RQQtq@T>S3^$@}_-JAA_AKDeaH?Iid=*7WTMORq5(z zbvh6Yq-&xz>Dp*5Tjx&IrGwERM;zn;Q9Kuk;=SoGsfpIB4T|q{Cn0nMD3Vf*=}2Ng6;HuP$baS+s!PTjjbZfK~v8iGBuY|vAXpeQxN_(>m-h}&N=_QxRfMXE; zKMoTziu>yeSo`7MRv^|oB`{rM(KlUdL025(%>wKlB}$!AHyymmn^>dmu)7uh&1$<+ zuQW_IS~E&$y2;x8G>Nu&@T`y$w$9I$2>t3gJt7#co@_?Trc|S<446k~hICBL zC@MXsYQrhrs4{!Fxj&yn1fJu1-s}vROfhSz+?jt9fU86$QBEOIhr&g94^cu2uLz2G z-Jv*DL2)T=#iNRfw+YrNKGms63ZL*Q{)?c69#Z)!O-k)WA?jADlxiiQ)F_hbNjQ}{ z81pJYw$GgqlzQm

7I8F^z`rpbX* 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 W_ytd%AMH6FIvMc(E+Cz3_x~49;C7$@ diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/style.cpython-312.pyc deleted file mode 100644 index 56f5b3bef4032b1067ede72979656028ad3c5fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33511 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

{code}
- - -""" - -CONSOLE_SVG_FORMAT = """\ - - - - - - - - - {lines} - - - {chrome} - - {backgrounds} - - {matrix} - - - -""" - -_SVG_FONT_FAMILY = "Rich Fira Code" -_SVG_CLASSES_PREFIX = "rich-svg" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py deleted file mode 100644 index cbd6da9..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py +++ /dev/null @@ -1,10 +0,0 @@ -from typing import Any - - -def load_ipython_extension(ip: Any) -> None: # pragma: no cover - # prevent circular import - from pip._vendor.rich.pretty import install - from pip._vendor.rich.traceback import install as tr_install - - install() - tr_install() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py deleted file mode 100644 index b17ee65..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -from typing import IO, Callable - - -def get_fileno(file_like: IO[str]) -> int | None: - """Get fileno() from a file, accounting for poorly implemented file-like objects. - - Args: - file_like (IO): A file-like object. - - Returns: - int | None: The result of fileno if available, or None if operation failed. - """ - fileno: Callable[[], int] | None = getattr(file_like, "fileno", None) - if fileno is not None: - try: - return fileno() - except Exception: - # `fileno` is documented as potentially raising a OSError - # Alas, from the issues, there are so many poorly implemented file-like objects, - # that `fileno()` can raise just about anything. - return None - return None diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py deleted file mode 100644 index 30446ce..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py +++ /dev/null @@ -1,270 +0,0 @@ -from __future__ import absolute_import - -import inspect -from inspect import cleandoc, getdoc, getfile, isclass, ismodule, signature -from typing import Any, Collection, Iterable, Optional, Tuple, Type, Union - -from .console import Group, RenderableType -from .control import escape_control_codes -from .highlighter import ReprHighlighter -from .jupyter import JupyterMixin -from .panel import Panel -from .pretty import Pretty -from .table import Table -from .text import Text, TextType - - -def _first_paragraph(doc: str) -> str: - """Get the first paragraph from a docstring.""" - paragraph, _, _ = doc.partition("\n\n") - return paragraph - - -class Inspect(JupyterMixin): - """A renderable to inspect any Python Object. - - Args: - obj (Any): An object to inspect. - title (str, optional): Title to display over inspect result, or None use type. Defaults to None. - help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. - methods (bool, optional): Enable inspection of callables. Defaults to False. - docs (bool, optional): Also render doc strings. Defaults to True. - private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. - dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. - sort (bool, optional): Sort attributes alphabetically. Defaults to True. - all (bool, optional): Show all attributes. Defaults to False. - value (bool, optional): Pretty print value of object. Defaults to True. - """ - - def __init__( - self, - obj: Any, - *, - title: Optional[TextType] = None, - help: bool = False, - methods: bool = False, - docs: bool = True, - private: bool = False, - dunder: bool = False, - sort: bool = True, - all: bool = True, - value: bool = True, - ) -> None: - self.highlighter = ReprHighlighter() - self.obj = obj - self.title = title or self._make_title(obj) - if all: - methods = private = dunder = True - self.help = help - self.methods = methods - self.docs = docs or help - self.private = private or dunder - self.dunder = dunder - self.sort = sort - self.value = value - - def _make_title(self, obj: Any) -> Text: - """Make a default title.""" - title_str = ( - str(obj) - if (isclass(obj) or callable(obj) or ismodule(obj)) - else str(type(obj)) - ) - title_text = self.highlighter(title_str) - return title_text - - def __rich__(self) -> Panel: - return Panel.fit( - Group(*self._render()), - title=self.title, - border_style="scope.border", - padding=(0, 1), - ) - - def _get_signature(self, name: str, obj: Any) -> Optional[Text]: - """Get a signature for a callable.""" - try: - _signature = str(signature(obj)) + ":" - except ValueError: - _signature = "(...)" - except TypeError: - return None - - source_filename: Optional[str] = None - try: - source_filename = getfile(obj) - except (OSError, TypeError): - # OSError is raised if obj has no source file, e.g. when defined in REPL. - pass - - callable_name = Text(name, style="inspect.callable") - if source_filename: - callable_name.stylize(f"link file://{source_filename}") - signature_text = self.highlighter(_signature) - - qualname = name or getattr(obj, "__qualname__", name) - - # If obj is a module, there may be classes (which are callable) to display - if inspect.isclass(obj): - prefix = "class" - elif inspect.iscoroutinefunction(obj): - prefix = "async def" - else: - prefix = "def" - - qual_signature = Text.assemble( - (f"{prefix} ", f"inspect.{prefix.replace(' ', '_')}"), - (qualname, "inspect.callable"), - signature_text, - ) - - return qual_signature - - def _render(self) -> Iterable[RenderableType]: - """Render object.""" - - def sort_items(item: Tuple[str, Any]) -> Tuple[bool, str]: - key, (_error, value) = item - return (callable(value), key.strip("_").lower()) - - def safe_getattr(attr_name: str) -> Tuple[Any, Any]: - """Get attribute or any exception.""" - try: - return (None, getattr(obj, attr_name)) - except Exception as error: - return (error, None) - - obj = self.obj - keys = dir(obj) - total_items = len(keys) - if not self.dunder: - keys = [key for key in keys if not key.startswith("__")] - if not self.private: - keys = [key for key in keys if not key.startswith("_")] - not_shown_count = total_items - len(keys) - items = [(key, safe_getattr(key)) for key in keys] - if self.sort: - items.sort(key=sort_items) - - items_table = Table.grid(padding=(0, 1), expand=False) - items_table.add_column(justify="right") - add_row = items_table.add_row - highlighter = self.highlighter - - if callable(obj): - signature = self._get_signature("", obj) - if signature is not None: - yield signature - yield "" - - if self.docs: - _doc = self._get_formatted_doc(obj) - if _doc is not None: - doc_text = Text(_doc, style="inspect.help") - doc_text = highlighter(doc_text) - yield doc_text - yield "" - - if self.value and not (isclass(obj) or callable(obj) or ismodule(obj)): - yield Panel( - Pretty(obj, indent_guides=True, max_length=10, max_string=60), - border_style="inspect.value.border", - ) - yield "" - - for key, (error, value) in items: - key_text = Text.assemble( - ( - key, - "inspect.attr.dunder" if key.startswith("__") else "inspect.attr", - ), - (" =", "inspect.equals"), - ) - if error is not None: - warning = key_text.copy() - warning.stylize("inspect.error") - add_row(warning, highlighter(repr(error))) - continue - - if callable(value): - if not self.methods: - continue - - _signature_text = self._get_signature(key, value) - if _signature_text is None: - add_row(key_text, Pretty(value, highlighter=highlighter)) - else: - if self.docs: - docs = self._get_formatted_doc(value) - if docs is not None: - _signature_text.append("\n" if "\n" in docs else " ") - doc = highlighter(docs) - doc.stylize("inspect.doc") - _signature_text.append(doc) - - add_row(key_text, _signature_text) - else: - add_row(key_text, Pretty(value, highlighter=highlighter)) - if items_table.row_count: - yield items_table - elif not_shown_count: - yield Text.from_markup( - f"[b cyan]{not_shown_count}[/][i] attribute(s) not shown.[/i] " - f"Run [b][magenta]inspect[/]([not b]inspect[/])[/b] for options." - ) - - def _get_formatted_doc(self, object_: Any) -> Optional[str]: - """ - Extract the docstring of an object, process it and returns it. - The processing consists in cleaning up the doctring's indentation, - taking only its 1st paragraph if `self.help` is not True, - and escape its control codes. - - Args: - object_ (Any): the object to get the docstring from. - - Returns: - Optional[str]: the processed docstring, or None if no docstring was found. - """ - docs = getdoc(object_) - if docs is None: - return None - docs = cleandoc(docs).strip() - if not self.help: - docs = _first_paragraph(docs) - return escape_control_codes(docs) - - -def get_object_types_mro(obj: Union[object, Type[Any]]) -> Tuple[type, ...]: - """Returns the MRO of an object's class, or of the object itself if it's a class.""" - if not hasattr(obj, "__mro__"): - # N.B. we cannot use `if type(obj) is type` here because it doesn't work with - # some types of classes, such as the ones that use abc.ABCMeta. - obj = type(obj) - return getattr(obj, "__mro__", ()) - - -def get_object_types_mro_as_strings(obj: object) -> Collection[str]: - """ - Returns the MRO of an object's class as full qualified names, or of the object itself if it's a class. - - Examples: - `object_types_mro_as_strings(JSONDecoder)` will return `['json.decoder.JSONDecoder', 'builtins.object']` - """ - return [ - f'{getattr(type_, "__module__", "")}.{getattr(type_, "__qualname__", "")}' - for type_ in get_object_types_mro(obj) - ] - - -def is_object_one_of_types( - obj: object, fully_qualified_types_names: Collection[str] -) -> bool: - """ - Returns `True` if the given object's class (or the object itself, if it's a class) has one of the - fully qualified names in its MRO. - """ - for type_name in get_object_types_mro_as_strings(obj): - if type_name in fully_qualified_types_names: - return True - return False diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py deleted file mode 100644 index fc16c84..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py +++ /dev/null @@ -1,94 +0,0 @@ -from datetime import datetime -from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable - - -from .text import Text, TextType - -if TYPE_CHECKING: - from .console import Console, ConsoleRenderable, RenderableType - from .table import Table - -FormatTimeCallable = Callable[[datetime], Text] - - -class LogRender: - def __init__( - self, - show_time: bool = True, - show_level: bool = False, - show_path: bool = True, - time_format: Union[str, FormatTimeCallable] = "[%x %X]", - omit_repeated_times: bool = True, - level_width: Optional[int] = 8, - ) -> None: - self.show_time = show_time - self.show_level = show_level - self.show_path = show_path - self.time_format = time_format - self.omit_repeated_times = omit_repeated_times - self.level_width = level_width - self._last_time: Optional[Text] = None - - def __call__( - self, - console: "Console", - renderables: Iterable["ConsoleRenderable"], - log_time: Optional[datetime] = None, - time_format: Optional[Union[str, FormatTimeCallable]] = None, - level: TextType = "", - path: Optional[str] = None, - line_no: Optional[int] = None, - link_path: Optional[str] = None, - ) -> "Table": - from .containers import Renderables - from .table import Table - - output = Table.grid(padding=(0, 1)) - output.expand = True - if self.show_time: - output.add_column(style="log.time") - if self.show_level: - output.add_column(style="log.level", width=self.level_width) - output.add_column(ratio=1, style="log.message", overflow="fold") - if self.show_path and path: - output.add_column(style="log.path") - row: List["RenderableType"] = [] - if self.show_time: - log_time = log_time or console.get_datetime() - time_format = time_format or self.time_format - if callable(time_format): - log_time_display = time_format(log_time) - else: - log_time_display = Text(log_time.strftime(time_format)) - if log_time_display == self._last_time and self.omit_repeated_times: - row.append(Text(" " * len(log_time_display))) - else: - row.append(log_time_display) - self._last_time = log_time_display - if self.show_level: - row.append(level) - - row.append(Renderables(renderables)) - if self.show_path and path: - path_text = Text() - path_text.append( - path, style=f"link file://{link_path}" if link_path else "" - ) - if line_no: - path_text.append(":") - path_text.append( - f"{line_no}", - style=f"link file://{link_path}#{line_no}" if link_path else "", - ) - row.append(path_text) - - output.add_row(*row) - return output - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console - - c = Console() - c.print("[on blue]Hello", justify="right") - c.log("[on blue]hello", justify="right") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py deleted file mode 100644 index 01c6caf..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import Iterable, Tuple, TypeVar - -T = TypeVar("T") - - -def loop_first(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for first value.""" - iter_values = iter(values) - try: - value = next(iter_values) - except StopIteration: - return - yield True, value - for value in iter_values: - yield False, value - - -def loop_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: - """Iterate and generate a tuple with a flag for last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - for value in iter_values: - yield False, previous_value - previous_value = value - yield True, previous_value - - -def loop_first_last(values: Iterable[T]) -> Iterable[Tuple[bool, bool, T]]: - """Iterate and generate a tuple with a flag for first and last value.""" - iter_values = iter(values) - try: - previous_value = next(iter_values) - except StopIteration: - return - first = True - for value in iter_values: - yield first, False, previous_value - first = False - previous_value = value - yield first, True, previous_value diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py deleted file mode 100644 index b659673..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py +++ /dev/null @@ -1,69 +0,0 @@ -from types import TracebackType -from typing import IO, Iterable, Iterator, List, Optional, Type - - -class NullFile(IO[str]): - def close(self) -> None: - pass - - def isatty(self) -> bool: - return False - - def read(self, __n: int = 1) -> str: - return "" - - def readable(self) -> bool: - return False - - def readline(self, __limit: int = 1) -> str: - return "" - - def readlines(self, __hint: int = 1) -> List[str]: - return [] - - def seek(self, __offset: int, __whence: int = 1) -> int: - return 0 - - def seekable(self) -> bool: - return False - - def tell(self) -> int: - return 0 - - def truncate(self, __size: Optional[int] = 1) -> int: - return 0 - - def writable(self) -> bool: - return False - - def writelines(self, __lines: Iterable[str]) -> None: - pass - - def __next__(self) -> str: - return "" - - def __iter__(self) -> Iterator[str]: - return iter([""]) - - def __enter__(self) -> IO[str]: - pass - - def __exit__( - self, - __t: Optional[Type[BaseException]], - __value: Optional[BaseException], - __traceback: Optional[TracebackType], - ) -> None: - pass - - def write(self, text: str) -> int: - return 0 - - def flush(self) -> None: - pass - - def fileno(self) -> int: - return -1 - - -NULL_FILE = NullFile() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py deleted file mode 100644 index 3c748d3..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py +++ /dev/null @@ -1,309 +0,0 @@ -from .palette import Palette - - -# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column) -WINDOWS_PALETTE = Palette( - [ - (12, 12, 12), - (197, 15, 31), - (19, 161, 14), - (193, 156, 0), - (0, 55, 218), - (136, 23, 152), - (58, 150, 221), - (204, 204, 204), - (118, 118, 118), - (231, 72, 86), - (22, 198, 12), - (249, 241, 165), - (59, 120, 255), - (180, 0, 158), - (97, 214, 214), - (242, 242, 242), - ] -) - -# # The standard ansi colors (including bright variants) -STANDARD_PALETTE = Palette( - [ - (0, 0, 0), - (170, 0, 0), - (0, 170, 0), - (170, 85, 0), - (0, 0, 170), - (170, 0, 170), - (0, 170, 170), - (170, 170, 170), - (85, 85, 85), - (255, 85, 85), - (85, 255, 85), - (255, 255, 85), - (85, 85, 255), - (255, 85, 255), - (85, 255, 255), - (255, 255, 255), - ] -) - - -# The 256 color palette -EIGHT_BIT_PALETTE = Palette( - [ - (0, 0, 0), - (128, 0, 0), - (0, 128, 0), - (128, 128, 0), - (0, 0, 128), - (128, 0, 128), - (0, 128, 128), - (192, 192, 192), - (128, 128, 128), - (255, 0, 0), - (0, 255, 0), - (255, 255, 0), - (0, 0, 255), - (255, 0, 255), - (0, 255, 255), - (255, 255, 255), - (0, 0, 0), - (0, 0, 95), - (0, 0, 135), - (0, 0, 175), - (0, 0, 215), - (0, 0, 255), - (0, 95, 0), - (0, 95, 95), - (0, 95, 135), - (0, 95, 175), - (0, 95, 215), - (0, 95, 255), - (0, 135, 0), - (0, 135, 95), - (0, 135, 135), - (0, 135, 175), - (0, 135, 215), - (0, 135, 255), - (0, 175, 0), - (0, 175, 95), - (0, 175, 135), - (0, 175, 175), - (0, 175, 215), - (0, 175, 255), - (0, 215, 0), - (0, 215, 95), - (0, 215, 135), - (0, 215, 175), - (0, 215, 215), - (0, 215, 255), - (0, 255, 0), - (0, 255, 95), - (0, 255, 135), - (0, 255, 175), - (0, 255, 215), - (0, 255, 255), - (95, 0, 0), - (95, 0, 95), - (95, 0, 135), - (95, 0, 175), - (95, 0, 215), - (95, 0, 255), - (95, 95, 0), - (95, 95, 95), - (95, 95, 135), - (95, 95, 175), - (95, 95, 215), - (95, 95, 255), - (95, 135, 0), - (95, 135, 95), - (95, 135, 135), - (95, 135, 175), - (95, 135, 215), - (95, 135, 255), - (95, 175, 0), - (95, 175, 95), - (95, 175, 135), - (95, 175, 175), - (95, 175, 215), - (95, 175, 255), - (95, 215, 0), - (95, 215, 95), - (95, 215, 135), - (95, 215, 175), - (95, 215, 215), - (95, 215, 255), - (95, 255, 0), - (95, 255, 95), - (95, 255, 135), - (95, 255, 175), - (95, 255, 215), - (95, 255, 255), - (135, 0, 0), - (135, 0, 95), - (135, 0, 135), - (135, 0, 175), - (135, 0, 215), - (135, 0, 255), - (135, 95, 0), - (135, 95, 95), - (135, 95, 135), - (135, 95, 175), - (135, 95, 215), - (135, 95, 255), - (135, 135, 0), - (135, 135, 95), - (135, 135, 135), - (135, 135, 175), - (135, 135, 215), - (135, 135, 255), - (135, 175, 0), - (135, 175, 95), - (135, 175, 135), - (135, 175, 175), - (135, 175, 215), - (135, 175, 255), - (135, 215, 0), - (135, 215, 95), - (135, 215, 135), - (135, 215, 175), - (135, 215, 215), - (135, 215, 255), - (135, 255, 0), - (135, 255, 95), - (135, 255, 135), - (135, 255, 175), - (135, 255, 215), - (135, 255, 255), - (175, 0, 0), - (175, 0, 95), - (175, 0, 135), - (175, 0, 175), - (175, 0, 215), - (175, 0, 255), - (175, 95, 0), - (175, 95, 95), - (175, 95, 135), - (175, 95, 175), - (175, 95, 215), - (175, 95, 255), - (175, 135, 0), - (175, 135, 95), - (175, 135, 135), - (175, 135, 175), - (175, 135, 215), - (175, 135, 255), - (175, 175, 0), - (175, 175, 95), - (175, 175, 135), - (175, 175, 175), - (175, 175, 215), - (175, 175, 255), - (175, 215, 0), - (175, 215, 95), - (175, 215, 135), - (175, 215, 175), - (175, 215, 215), - (175, 215, 255), - (175, 255, 0), - (175, 255, 95), - (175, 255, 135), - (175, 255, 175), - (175, 255, 215), - (175, 255, 255), - (215, 0, 0), - (215, 0, 95), - (215, 0, 135), - (215, 0, 175), - (215, 0, 215), - (215, 0, 255), - (215, 95, 0), - (215, 95, 95), - (215, 95, 135), - (215, 95, 175), - (215, 95, 215), - (215, 95, 255), - (215, 135, 0), - (215, 135, 95), - (215, 135, 135), - (215, 135, 175), - (215, 135, 215), - (215, 135, 255), - (215, 175, 0), - (215, 175, 95), - (215, 175, 135), - (215, 175, 175), - (215, 175, 215), - (215, 175, 255), - (215, 215, 0), - (215, 215, 95), - (215, 215, 135), - (215, 215, 175), - (215, 215, 215), - (215, 215, 255), - (215, 255, 0), - (215, 255, 95), - (215, 255, 135), - (215, 255, 175), - (215, 255, 215), - (215, 255, 255), - (255, 0, 0), - (255, 0, 95), - (255, 0, 135), - (255, 0, 175), - (255, 0, 215), - (255, 0, 255), - (255, 95, 0), - (255, 95, 95), - (255, 95, 135), - (255, 95, 175), - (255, 95, 215), - (255, 95, 255), - (255, 135, 0), - (255, 135, 95), - (255, 135, 135), - (255, 135, 175), - (255, 135, 215), - (255, 135, 255), - (255, 175, 0), - (255, 175, 95), - (255, 175, 135), - (255, 175, 175), - (255, 175, 215), - (255, 175, 255), - (255, 215, 0), - (255, 215, 95), - (255, 215, 135), - (255, 215, 175), - (255, 215, 215), - (255, 215, 255), - (255, 255, 0), - (255, 255, 95), - (255, 255, 135), - (255, 255, 175), - (255, 255, 215), - (255, 255, 255), - (8, 8, 8), - (18, 18, 18), - (28, 28, 28), - (38, 38, 38), - (48, 48, 48), - (58, 58, 58), - (68, 68, 68), - (78, 78, 78), - (88, 88, 88), - (98, 98, 98), - (108, 108, 108), - (118, 118, 118), - (128, 128, 128), - (138, 138, 138), - (148, 148, 148), - (158, 158, 158), - (168, 168, 168), - (178, 178, 178), - (188, 188, 188), - (198, 198, 198), - (208, 208, 208), - (218, 218, 218), - (228, 228, 228), - (238, 238, 238), - ] -) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py deleted file mode 100644 index 4f6d8b2..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py +++ /dev/null @@ -1,17 +0,0 @@ -from typing import Optional - - -def pick_bool(*values: Optional[bool]) -> bool: - """Pick the first non-none bool or return the last value. - - Args: - *values (bool): Any number of boolean or None values. - - Returns: - bool: First non-none boolean. - """ - assert values, "1 or more values required" - for value in values: - if value is not None: - return value - return bool(value) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py deleted file mode 100644 index e8a3a67..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py +++ /dev/null @@ -1,160 +0,0 @@ -import sys -from fractions import Fraction -from math import ceil -from typing import cast, List, Optional, Sequence - -if sys.version_info >= (3, 8): - from typing import Protocol -else: - from pip._vendor.typing_extensions import Protocol # pragma: no cover - - -class Edge(Protocol): - """Any object that defines an edge (such as Layout).""" - - size: Optional[int] = None - ratio: int = 1 - minimum_size: int = 1 - - -def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: - """Divide total space to satisfy size, ratio, and minimum_size, constraints. - - The returned list of integers should add up to total in most cases, unless it is - impossible to satisfy all the constraints. For instance, if there are two edges - with a minimum size of 20 each and `total` is 30 then the returned list will be - greater than total. In practice, this would mean that a Layout object would - clip the rows that would overflow the screen height. - - Args: - total (int): Total number of characters. - edges (List[Edge]): Edges within total space. - - Returns: - List[int]: Number of characters for each edge. - """ - # Size of edge or None for yet to be determined - sizes = [(edge.size or None) for edge in edges] - - _Fraction = Fraction - - # While any edges haven't been calculated - while None in sizes: - # Get flexible edges and index to map these back on to sizes list - flexible_edges = [ - (index, edge) - for index, (size, edge) in enumerate(zip(sizes, edges)) - if size is None - ] - # Remaining space in total - remaining = total - sum(size or 0 for size in sizes) - if remaining <= 0: - # No room for flexible edges - return [ - ((edge.minimum_size or 1) if size is None else size) - for size, edge in zip(sizes, edges) - ] - # Calculate number of characters in a ratio portion - portion = _Fraction( - remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) - ) - - # If any edges will be less than their minimum, replace size with the minimum - for index, edge in flexible_edges: - if portion * edge.ratio <= edge.minimum_size: - sizes[index] = edge.minimum_size - # New fixed size will invalidate calculations, so we need to repeat the process - break - else: - # Distribute flexible space and compensate for rounding error - # Since edge sizes can only be integers we need to add the remainder - # to the following line - remainder = _Fraction(0) - for index, edge in flexible_edges: - size, remainder = divmod(portion * edge.ratio + remainder, 1) - sizes[index] = size - break - # Sizes now contains integers only - return cast(List[int], sizes) - - -def ratio_reduce( - total: int, ratios: List[int], maximums: List[int], values: List[int] -) -> List[int]: - """Divide an integer total in to parts based on ratios. - - Args: - total (int): The total to divide. - ratios (List[int]): A list of integer ratios. - maximums (List[int]): List of maximums values for each slot. - values (List[int]): List of values - - Returns: - List[int]: A list of integers guaranteed to sum to total. - """ - ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)] - total_ratio = sum(ratios) - if not total_ratio: - return values[:] - total_remaining = total - result: List[int] = [] - append = result.append - for ratio, maximum, value in zip(ratios, maximums, values): - if ratio and total_ratio > 0: - distributed = min(maximum, round(ratio * total_remaining / total_ratio)) - append(value - distributed) - total_remaining -= distributed - total_ratio -= ratio - else: - append(value) - return result - - -def ratio_distribute( - total: int, ratios: List[int], minimums: Optional[List[int]] = None -) -> List[int]: - """Distribute an integer total in to parts based on ratios. - - Args: - total (int): The total to divide. - ratios (List[int]): A list of integer ratios. - minimums (List[int]): List of minimum values for each slot. - - Returns: - List[int]: A list of integers guaranteed to sum to total. - """ - if minimums: - ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)] - total_ratio = sum(ratios) - assert total_ratio > 0, "Sum of ratios must be > 0" - - total_remaining = total - distributed_total: List[int] = [] - append = distributed_total.append - if minimums is None: - _minimums = [0] * len(ratios) - else: - _minimums = minimums - for ratio, minimum in zip(ratios, _minimums): - if total_ratio > 0: - distributed = max(minimum, ceil(ratio * total_remaining / total_ratio)) - else: - distributed = total_remaining - append(distributed) - total_ratio -= ratio - total_remaining -= distributed - return distributed_total - - -if __name__ == "__main__": - from dataclasses import dataclass - - @dataclass - class E: - - size: Optional[int] = None - ratio: int = 1 - minimum_size: int = 1 - - resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) - print(sum(resolved)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py deleted file mode 100644 index d0bb1fe..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py +++ /dev/null @@ -1,482 +0,0 @@ -""" -Spinners are from: -* cli-spinners: - MIT License - Copyright (c) Sindre Sorhus (sindresorhus.com) - 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. -""" - -SPINNERS = { - "dots": { - "interval": 80, - "frames": "⠋⠙⠹⠸⠼⠴⠦⠧⠇â ", - }, - "dots2": {"interval": 80, "frames": "⣾⣽⣻⢿⡿⣟⣯⣷"}, - "dots3": { - "interval": 80, - "frames": "⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓", - }, - "dots4": { - "interval": 80, - "frames": "⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆", - }, - "dots5": { - "interval": 80, - "frames": "⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒â â â ’â “â ‹", - }, - "dots6": { - "interval": 80, - "frames": "â â ‰â ™â šâ ’⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉â ", - }, - "dots7": { - "interval": 80, - "frames": "⠈⠉⠋⠓⠒â â â ’⠖⠦⠤⠠⠠⠤⠦⠖⠒â â â ’⠓⠋⠉⠈", - }, - "dots8": { - "interval": 80, - "frames": "â â â ‰â ™â šâ ’⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒â â â ’⠓⠋⠉⠈⠈", - }, - "dots9": {"interval": 80, "frames": "⢹⢺⢼⣸⣇⡧⡗â¡"}, - "dots10": {"interval": 80, "frames": "⢄⢂â¢â¡â¡ˆâ¡â¡ "}, - "dots11": {"interval": 100, "frames": "â â ‚⠄⡀⢀⠠â â ˆ"}, - "dots12": { - "interval": 80, - "frames": [ - "⢀⠀", - "⡀⠀", - "â „â €", - "⢂⠀", - "â¡‚â €", - "â …â €", - "⢃⠀", - "⡃⠀", - "â â €", - "⢋⠀", - "â¡‹â €", - "â â ", - "⢋â ", - "â¡‹â ", - "â â ‰", - "â ‹â ‰", - "â ‹â ‰", - "⠉⠙", - "⠉⠙", - "⠉⠩", - "⠈⢙", - "⠈⡙", - "⢈⠩", - "⡀⢙", - "â „â¡™", - "⢂⠩", - "⡂⢘", - "⠅⡘", - "⢃⠨", - "⡃â¢", - "â â¡", - "⢋⠠", - "⡋⢀", - "â â¡", - "⢋â ", - "â¡‹â ", - "â â ‰", - "â ‹â ‰", - "â ‹â ‰", - "⠉⠙", - "⠉⠙", - "⠉⠩", - "⠈⢙", - "⠈⡙", - "⠈⠩", - "⠀⢙", - "⠀⡙", - "⠀⠩", - "⠀⢘", - "⠀⡘", - "⠀⠨", - "â €â¢", - "â €â¡", - "⠀⠠", - "⠀⢀", - "⠀⡀", - ], - }, - "dots8Bit": { - "interval": 80, - "frames": "â €â â ‚⠃⠄⠅⠆⠇⡀â¡â¡‚⡃⡄⡅⡆⡇⠈⠉⠊⠋⠌â â Žâ â¡ˆâ¡‰â¡Šâ¡‹â¡Œâ¡â¡Žâ¡â â ‘⠒⠓⠔⠕⠖⠗â¡â¡‘⡒⡓⡔⡕⡖⡗⠘⠙⠚⠛⠜â â žâ Ÿâ¡˜â¡™" - "⡚⡛⡜â¡â¡žâ¡Ÿâ  â ¡â ¢â £â ¤â ¥â ¦â §â¡ â¡¡â¡¢â¡£â¡¤â¡¥â¡¦â¡§â ¨â ©â ªâ «â ¬â ­â ®â ¯â¡¨â¡©â¡ªâ¡«â¡¬â¡­â¡®â¡¯â °â ±â ²â ³â ´â µâ ¶â ·â¡°â¡±â¡²â¡³â¡´â¡µâ¡¶â¡·â ¸â ¹â ºâ »" - "⠼⠽⠾⠿⡸⡹⡺⡻⡼⡽⡾⡿⢀â¢â¢‚⢃⢄⢅⢆⢇⣀â£â£‚⣃⣄⣅⣆⣇⢈⢉⢊⢋⢌â¢â¢Žâ¢â£ˆâ£‰â£Šâ£‹â£Œâ£â£Žâ£â¢â¢‘⢒⢓⢔⢕⢖⢗â£â£‘⣒⣓⣔⣕" - "⣖⣗⢘⢙⢚⢛⢜â¢â¢žâ¢Ÿâ£˜â£™â£šâ£›â£œâ£â£žâ£Ÿâ¢ â¢¡â¢¢â¢£â¢¤â¢¥â¢¦â¢§â£ â£¡â£¢â££â£¤â£¥â£¦â£§â¢¨â¢©â¢ªâ¢«â¢¬â¢­â¢®â¢¯â£¨â£©â£ªâ£«â£¬â£­â£®â£¯â¢°â¢±â¢²â¢³â¢´â¢µâ¢¶â¢·" - "⣰⣱⣲⣳⣴⣵⣶⣷⢸⢹⢺⢻⢼⢽⢾⢿⣸⣹⣺⣻⣼⣽⣾⣿", - }, - "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]}, - "line2": {"interval": 100, "frames": "â ‚-–—–-"}, - "pipe": {"interval": 100, "frames": "┤┘┴└├┌┬â”"}, - "simpleDots": {"interval": 400, "frames": [". ", ".. ", "...", " "]}, - "simpleDotsScrolling": { - "interval": 200, - "frames": [". ", ".. ", "...", " ..", " .", " "], - }, - "star": {"interval": 70, "frames": "✶✸✹✺✹✷"}, - "star2": {"interval": 80, "frames": "+x*"}, - "flip": { - "interval": 70, - "frames": "___-``'´-___", - }, - "hamburger": {"interval": 100, "frames": "☱☲☴"}, - "growVertical": { - "interval": 120, - "frames": "â–▃▄▅▆▇▆▅▄▃", - }, - "growHorizontal": { - "interval": 120, - "frames": "â–â–Žâ–▌▋▊▉▊▋▌â–â–Ž", - }, - "balloon": {"interval": 140, "frames": " .oO@* "}, - "balloon2": {"interval": 120, "frames": ".oO°Oo."}, - "noise": {"interval": 100, "frames": "â–“â–’â–‘"}, - "bounce": {"interval": 120, "frames": "â â ‚â „â ‚"}, - "boxBounce": {"interval": 120, "frames": "â––â–˜â–â–—"}, - "boxBounce2": {"interval": 100, "frames": "▌▀â–â–„"}, - "triangle": {"interval": 50, "frames": "◢◣◤◥"}, - "arc": {"interval": 100, "frames": "◜◠â—â—žâ—¡â—Ÿ"}, - "circle": {"interval": 120, "frames": "◡⊙◠"}, - "squareCorners": {"interval": 180, "frames": "◰◳◲◱"}, - "circleQuarters": {"interval": 120, "frames": "â—´â—·â—¶â—µ"}, - "circleHalves": {"interval": 50, "frames": "â—â—“â—‘â—’"}, - "squish": {"interval": 100, "frames": "╫╪"}, - "toggle": {"interval": 250, "frames": "⊶⊷"}, - "toggle2": {"interval": 80, "frames": "â–«â–ª"}, - "toggle3": {"interval": 120, "frames": "â–¡â– "}, - "toggle4": {"interval": 100, "frames": "■□▪▫"}, - "toggle5": {"interval": 100, "frames": "▮▯"}, - "toggle6": {"interval": 300, "frames": "á€á€"}, - "toggle7": {"interval": 80, "frames": "⦾⦿"}, - "toggle8": {"interval": 100, "frames": "â—â—Œ"}, - "toggle9": {"interval": 100, "frames": "◉◎"}, - "toggle10": {"interval": 100, "frames": "㊂㊀ãŠ"}, - "toggle11": {"interval": 50, "frames": "⧇⧆"}, - "toggle12": {"interval": 120, "frames": "☗☖"}, - "toggle13": {"interval": 80, "frames": "=*-"}, - "arrow": {"interval": 100, "frames": "â†â†–↑↗→↘↓↙"}, - "arrow2": { - "interval": 80, - "frames": ["â¬†ï¸ ", "â†—ï¸ ", "âž¡ï¸ ", "â†˜ï¸ ", "â¬‡ï¸ ", "â†™ï¸ ", "â¬…ï¸ ", "â†–ï¸ "], - }, - "arrow3": { - "interval": 120, - "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"], - }, - "bouncingBar": { - "interval": 80, - "frames": [ - "[ ]", - "[= ]", - "[== ]", - "[=== ]", - "[ ===]", - "[ ==]", - "[ =]", - "[ ]", - "[ =]", - "[ ==]", - "[ ===]", - "[====]", - "[=== ]", - "[== ]", - "[= ]", - ], - }, - "bouncingBall": { - "interval": 80, - "frames": [ - "( â— )", - "( â— )", - "( â— )", - "( â— )", - "( â—)", - "( â— )", - "( â— )", - "( â— )", - "( â— )", - "(â— )", - ], - }, - "smiley": {"interval": 200, "frames": ["😄 ", "😠"]}, - "monkey": {"interval": 300, "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]}, - "hearts": {"interval": 100, "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "â¤ï¸ "]}, - "clock": { - "interval": 100, - "frames": [ - "🕛 ", - "🕠", - "🕑 ", - "🕒 ", - "🕓 ", - "🕔 ", - "🕕 ", - "🕖 ", - "🕗 ", - "🕘 ", - "🕙 ", - "🕚 ", - ], - }, - "earth": {"interval": 180, "frames": ["🌠", "🌎 ", "🌠"]}, - "material": { - "interval": 17, - "frames": [ - "â–ˆâ–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - "██â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - "███â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - "████â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - "██████â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - "██████â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - "███████â–â–â–â–â–â–â–â–â–â–â–â–â–", - "████████â–â–â–â–â–â–â–â–â–â–â–â–", - "█████████â–â–â–â–â–â–â–â–â–â–â–", - "█████████â–â–â–â–â–â–â–â–â–â–â–", - "██████████â–â–â–â–â–â–â–â–â–â–", - "███████████â–â–â–â–â–â–â–â–â–", - "█████████████â–â–â–â–â–â–â–", - "██████████████â–â–â–â–â–â–", - "██████████████â–â–â–â–â–â–", - "â–██████████████â–â–â–â–â–", - "â–██████████████â–â–â–â–â–", - "â–██████████████â–â–â–â–â–", - "â–â–██████████████â–â–â–â–", - "â–â–â–██████████████â–â–â–", - "â–â–â–â–█████████████â–â–â–", - "â–â–â–â–██████████████â–â–", - "â–â–â–â–██████████████â–â–", - "â–â–â–â–â–██████████████â–", - "â–â–â–â–â–██████████████â–", - "â–â–â–â–â–██████████████â–", - "â–â–â–â–â–â–██████████████", - "â–â–â–â–â–â–██████████████", - "â–â–â–â–â–â–â–█████████████", - "â–â–â–â–â–â–â–█████████████", - "â–â–â–â–â–â–â–â–████████████", - "â–â–â–â–â–â–â–â–████████████", - "â–â–â–â–â–â–â–â–â–███████████", - "â–â–â–â–â–â–â–â–â–███████████", - "â–â–â–â–â–â–â–â–â–â–██████████", - "â–â–â–â–â–â–â–â–â–â–██████████", - "â–â–â–â–â–â–â–â–â–â–â–â–████████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–███████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–██████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–█████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–█████", - "â–ˆâ–â–â–â–â–â–â–â–â–â–â–â–â–â–â–████", - "██â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", - "██â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", - "███â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", - "████â–â–â–â–â–â–â–â–â–â–â–â–â–â–██", - "█████â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", - "█████â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", - "██████â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", - "████████â–â–â–â–â–â–â–â–â–â–â–â–", - "█████████â–â–â–â–â–â–â–â–â–â–â–", - "█████████â–â–â–â–â–â–â–â–â–â–â–", - "█████████â–â–â–â–â–â–â–â–â–â–â–", - "█████████â–â–â–â–â–â–â–â–â–â–â–", - "███████████â–â–â–â–â–â–â–â–â–", - "████████████â–â–â–â–â–â–â–â–", - "████████████â–â–â–â–â–â–â–â–", - "██████████████â–â–â–â–â–â–", - "██████████████â–â–â–â–â–â–", - "â–██████████████â–â–â–â–â–", - "â–██████████████â–â–â–â–â–", - "â–â–â–█████████████â–â–â–â–", - "â–â–â–â–â–████████████â–â–â–", - "â–â–â–â–â–████████████â–â–â–", - "â–â–â–â–â–â–███████████â–â–â–", - "â–â–â–â–â–â–â–â–█████████â–â–â–", - "â–â–â–â–â–â–â–â–█████████â–â–â–", - "â–â–â–â–â–â–â–â–â–█████████â–â–", - "â–â–â–â–â–â–â–â–â–█████████â–â–", - "â–â–â–â–â–â–â–â–â–â–█████████â–", - "â–â–â–â–â–â–â–â–â–â–â–████████â–", - "â–â–â–â–â–â–â–â–â–â–â–████████â–", - "â–â–â–â–â–â–â–â–â–â–â–â–███████â–", - "â–â–â–â–â–â–â–â–â–â–â–â–███████â–", - "â–â–â–â–â–â–â–â–â–â–â–â–â–███████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–███████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–█████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–████", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–███", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–██", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–██", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–██", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–ˆ", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - "â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–â–", - ], - }, - "moon": { - "interval": 80, - "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "], - }, - "runner": {"interval": 140, "frames": ["🚶 ", "🃠"]}, - "pong": { - "interval": 80, - "frames": [ - "â–â ‚ â–Œ", - "â–â ˆ â–Œ", - "â– â ‚ â–Œ", - "â– â   â–Œ", - "â– â¡€ â–Œ", - "â– â   â–Œ", - "â– â ‚ â–Œ", - "â– â ˆ â–Œ", - "â– â ‚ â–Œ", - "â– â   â–Œ", - "â– â¡€ â–Œ", - "â– â   â–Œ", - "â– â ‚ â–Œ", - "â– â ˆ â–Œ", - "â– â ‚â–Œ", - "â– â  â–Œ", - "■⡀▌", - "â– â   â–Œ", - "â– â ‚ â–Œ", - "â– â ˆ â–Œ", - "â– â ‚ â–Œ", - "â– â   â–Œ", - "â– â¡€ â–Œ", - "â– â   â–Œ", - "â– â ‚ â–Œ", - "â– â ˆ â–Œ", - "â– â ‚ â–Œ", - "â– â   â–Œ", - "â– â¡€ â–Œ", - "â–â   â–Œ", - ], - }, - "shark": { - "interval": 120, - "frames": [ - "â–|\\____________â–Œ", - "â–_|\\___________â–Œ", - "â–__|\\__________â–Œ", - "â–___|\\_________â–Œ", - "â–____|\\________â–Œ", - "â–_____|\\_______â–Œ", - "â–______|\\______â–Œ", - "â–_______|\\_____â–Œ", - "â–________|\\____â–Œ", - "â–_________|\\___â–Œ", - "â–__________|\\__â–Œ", - "â–___________|\\_â–Œ", - "â–____________|\\â–Œ", - "â–____________/|â–Œ", - "â–___________/|_â–Œ", - "â–__________/|__â–Œ", - "â–_________/|___â–Œ", - "â–________/|____â–Œ", - "â–_______/|_____â–Œ", - "â–______/|______â–Œ", - "â–_____/|_______â–Œ", - "â–____/|________â–Œ", - "â–___/|_________â–Œ", - "â–__/|__________â–Œ", - "â–_/|___________â–Œ", - "â–/|____________â–Œ", - ], - }, - "dqpb": {"interval": 100, "frames": "dqpb"}, - "weather": { - "interval": 100, - "frames": [ - "â˜€ï¸ ", - "â˜€ï¸ ", - "â˜€ï¸ ", - "🌤 ", - "â›…ï¸ ", - "🌥 ", - "â˜ï¸ ", - "🌧 ", - "🌨 ", - "🌧 ", - "🌨 ", - "🌧 ", - "🌨 ", - "⛈ ", - "🌨 ", - "🌧 ", - "🌨 ", - "â˜ï¸ ", - "🌥 ", - "â›…ï¸ ", - "🌤 ", - "â˜€ï¸ ", - "â˜€ï¸ ", - ], - }, - "christmas": {"interval": 400, "frames": "🌲🎄"}, - "grenade": { - "interval": 80, - "frames": [ - "ØŒ ", - "′ ", - " ´ ", - " ‾ ", - " ⸌", - " ⸊", - " |", - " âŽ", - " â•", - " à·´ ", - " â“", - " ", - " ", - " ", - ], - }, - "point": {"interval": 125, "frames": ["∙∙∙", "â—∙∙", "∙â—∙", "∙∙â—", "∙∙∙"]}, - "layer": {"interval": 150, "frames": "-=≡"}, - "betaWave": { - "interval": 80, - "frames": [ - "Ïββββββ", - "βÏβββββ", - "ββÏββββ", - "βββÏβββ", - "ββββÏββ", - "βββββÏβ", - "ββββββÏ", - ], - }, - "aesthetic": { - "interval": 80, - "frames": [ - "▰▱▱▱▱▱▱", - "▰▰▱▱▱▱▱", - "▰▰▰▱▱▱▱", - "▰▰▰▰▱▱▱", - "▰▰▰▰▰▱▱", - "â–°â–°â–°â–°â–°â–°â–±", - "â–°â–°â–°â–°â–°â–°â–°", - "▰▱▱▱▱▱▱", - ], - }, -} diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py deleted file mode 100644 index 194564e..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import List, TypeVar - -T = TypeVar("T") - - -class Stack(List[T]): - """A small shim over builtin list.""" - - @property - def top(self) -> T: - """Get top of stack.""" - return self[-1] - - def push(self, item: T) -> None: - """Push an item on to the stack (append in stack nomenclature).""" - self.append(item) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py deleted file mode 100644 index a2ca6be..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Timer context manager, only used in debug. - -""" - -from time import time - -import contextlib -from typing import Generator - - -@contextlib.contextmanager -def timer(subject: str = "time") -> Generator[None, None, None]: - """print the elapsed time. (only used in debugging)""" - start = time() - yield - elapsed = time() - start - elapsed_ms = elapsed * 1000 - print(f"{subject} elapsed {elapsed_ms:.1f}ms") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py deleted file mode 100644 index 81b1082..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py +++ /dev/null @@ -1,662 +0,0 @@ -"""Light wrapper around the Win32 Console API - this module should only be imported on Windows - -The API that this module wraps is documented at https://docs.microsoft.com/en-us/windows/console/console-functions -""" -import ctypes -import sys -from typing import Any - -windll: Any = None -if sys.platform == "win32": - windll = ctypes.LibraryLoader(ctypes.WinDLL) -else: - raise ImportError(f"{__name__} can only be imported on Windows") - -import time -from ctypes import Structure, byref, wintypes -from typing import IO, NamedTuple, Type, cast - -from pip._vendor.rich.color import ColorSystem -from pip._vendor.rich.style import Style - -STDOUT = -11 -ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4 - -COORD = wintypes._COORD - - -class LegacyWindowsError(Exception): - pass - - -class WindowsCoordinates(NamedTuple): - """Coordinates in the Windows Console API are (y, x), not (x, y). - This class is intended to prevent that confusion. - Rows and columns are indexed from 0. - This class can be used in place of wintypes._COORD in arguments and argtypes. - """ - - row: int - col: int - - @classmethod - def from_param(cls, value: "WindowsCoordinates") -> COORD: - """Converts a WindowsCoordinates into a wintypes _COORD structure. - This classmethod is internally called by ctypes to perform the conversion. - - Args: - value (WindowsCoordinates): The input coordinates to convert. - - Returns: - wintypes._COORD: The converted coordinates struct. - """ - return COORD(value.col, value.row) - - -class CONSOLE_SCREEN_BUFFER_INFO(Structure): - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", wintypes.WORD), - ("srWindow", wintypes.SMALL_RECT), - ("dwMaximumWindowSize", COORD), - ] - - -class CONSOLE_CURSOR_INFO(ctypes.Structure): - _fields_ = [("dwSize", wintypes.DWORD), ("bVisible", wintypes.BOOL)] - - -_GetStdHandle = windll.kernel32.GetStdHandle -_GetStdHandle.argtypes = [ - wintypes.DWORD, -] -_GetStdHandle.restype = wintypes.HANDLE - - -def GetStdHandle(handle: int = STDOUT) -> wintypes.HANDLE: - """Retrieves a handle to the specified standard device (standard input, standard output, or standard error). - - Args: - handle (int): Integer identifier for the handle. Defaults to -11 (stdout). - - Returns: - wintypes.HANDLE: The handle - """ - return cast(wintypes.HANDLE, _GetStdHandle(handle)) - - -_GetConsoleMode = windll.kernel32.GetConsoleMode -_GetConsoleMode.argtypes = [wintypes.HANDLE, wintypes.LPDWORD] -_GetConsoleMode.restype = wintypes.BOOL - - -def GetConsoleMode(std_handle: wintypes.HANDLE) -> int: - """Retrieves the current input mode of a console's input buffer - or the current output mode of a console screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - - Raises: - LegacyWindowsError: If any error occurs while calling the Windows console API. - - Returns: - int: Value representing the current console mode as documented at - https://docs.microsoft.com/en-us/windows/console/getconsolemode#parameters - """ - - console_mode = wintypes.DWORD() - success = bool(_GetConsoleMode(std_handle, console_mode)) - if not success: - raise LegacyWindowsError("Unable to get legacy Windows Console Mode") - return console_mode.value - - -_FillConsoleOutputCharacterW = windll.kernel32.FillConsoleOutputCharacterW -_FillConsoleOutputCharacterW.argtypes = [ - wintypes.HANDLE, - ctypes.c_char, - wintypes.DWORD, - cast(Type[COORD], WindowsCoordinates), - ctypes.POINTER(wintypes.DWORD), -] -_FillConsoleOutputCharacterW.restype = wintypes.BOOL - - -def FillConsoleOutputCharacter( - std_handle: wintypes.HANDLE, - char: str, - length: int, - start: WindowsCoordinates, -) -> int: - """Writes a character to the console screen buffer a specified number of times, beginning at the specified coordinates. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - char (str): The character to write. Must be a string of length 1. - length (int): The number of times to write the character. - start (WindowsCoordinates): The coordinates to start writing at. - - Returns: - int: The number of characters written. - """ - character = ctypes.c_char(char.encode()) - num_characters = wintypes.DWORD(length) - num_written = wintypes.DWORD(0) - _FillConsoleOutputCharacterW( - std_handle, - character, - num_characters, - start, - byref(num_written), - ) - return num_written.value - - -_FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute -_FillConsoleOutputAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, - wintypes.DWORD, - cast(Type[COORD], WindowsCoordinates), - ctypes.POINTER(wintypes.DWORD), -] -_FillConsoleOutputAttribute.restype = wintypes.BOOL - - -def FillConsoleOutputAttribute( - std_handle: wintypes.HANDLE, - attributes: int, - length: int, - start: WindowsCoordinates, -) -> int: - """Sets the character attributes for a specified number of character cells, - beginning at the specified coordinates in a screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - attributes (int): Integer value representing the foreground and background colours of the cells. - length (int): The number of cells to set the output attribute of. - start (WindowsCoordinates): The coordinates of the first cell whose attributes are to be set. - - Returns: - int: The number of cells whose attributes were actually set. - """ - num_cells = wintypes.DWORD(length) - style_attrs = wintypes.WORD(attributes) - num_written = wintypes.DWORD(0) - _FillConsoleOutputAttribute( - std_handle, style_attrs, num_cells, start, byref(num_written) - ) - return num_written.value - - -_SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute -_SetConsoleTextAttribute.argtypes = [ - wintypes.HANDLE, - wintypes.WORD, -] -_SetConsoleTextAttribute.restype = wintypes.BOOL - - -def SetConsoleTextAttribute( - std_handle: wintypes.HANDLE, attributes: wintypes.WORD -) -> bool: - """Set the colour attributes for all text written after this function is called. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - attributes (int): Integer value representing the foreground and background colours. - - - Returns: - bool: True if the attribute was set successfully, otherwise False. - """ - return bool(_SetConsoleTextAttribute(std_handle, attributes)) - - -_GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo -_GetConsoleScreenBufferInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_SCREEN_BUFFER_INFO), -] -_GetConsoleScreenBufferInfo.restype = wintypes.BOOL - - -def GetConsoleScreenBufferInfo( - std_handle: wintypes.HANDLE, -) -> CONSOLE_SCREEN_BUFFER_INFO: - """Retrieves information about the specified console screen buffer. - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - - Returns: - CONSOLE_SCREEN_BUFFER_INFO: A CONSOLE_SCREEN_BUFFER_INFO ctype struct contain information about - screen size, cursor position, colour attributes, and more.""" - console_screen_buffer_info = CONSOLE_SCREEN_BUFFER_INFO() - _GetConsoleScreenBufferInfo(std_handle, byref(console_screen_buffer_info)) - return console_screen_buffer_info - - -_SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition -_SetConsoleCursorPosition.argtypes = [ - wintypes.HANDLE, - cast(Type[COORD], WindowsCoordinates), -] -_SetConsoleCursorPosition.restype = wintypes.BOOL - - -def SetConsoleCursorPosition( - std_handle: wintypes.HANDLE, coords: WindowsCoordinates -) -> bool: - """Set the position of the cursor in the console screen - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - coords (WindowsCoordinates): The coordinates to move the cursor to. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleCursorPosition(std_handle, coords)) - - -_GetConsoleCursorInfo = windll.kernel32.GetConsoleCursorInfo -_GetConsoleCursorInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_CURSOR_INFO), -] -_GetConsoleCursorInfo.restype = wintypes.BOOL - - -def GetConsoleCursorInfo( - std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO -) -> bool: - """Get the cursor info - used to get cursor visibility and width - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct that receives information - about the console's cursor. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_GetConsoleCursorInfo(std_handle, byref(cursor_info))) - - -_SetConsoleCursorInfo = windll.kernel32.SetConsoleCursorInfo -_SetConsoleCursorInfo.argtypes = [ - wintypes.HANDLE, - ctypes.POINTER(CONSOLE_CURSOR_INFO), -] -_SetConsoleCursorInfo.restype = wintypes.BOOL - - -def SetConsoleCursorInfo( - std_handle: wintypes.HANDLE, cursor_info: CONSOLE_CURSOR_INFO -) -> bool: - """Set the cursor info - used for adjusting cursor visibility and width - - Args: - std_handle (wintypes.HANDLE): A handle to the console input buffer or the console screen buffer. - cursor_info (CONSOLE_CURSOR_INFO): CONSOLE_CURSOR_INFO ctype struct containing the new cursor info. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleCursorInfo(std_handle, byref(cursor_info))) - - -_SetConsoleTitle = windll.kernel32.SetConsoleTitleW -_SetConsoleTitle.argtypes = [wintypes.LPCWSTR] -_SetConsoleTitle.restype = wintypes.BOOL - - -def SetConsoleTitle(title: str) -> bool: - """Sets the title of the current console window - - Args: - title (str): The new title of the console window. - - Returns: - bool: True if the function succeeds, otherwise False. - """ - return bool(_SetConsoleTitle(title)) - - -class LegacyWindowsTerm: - """This class allows interaction with the legacy Windows Console API. It should only be used in the context - of environments where virtual terminal processing is not available. However, if it is used in a Windows environment, - the entire API should work. - - Args: - file (IO[str]): The file which the Windows Console API HANDLE is retrieved from, defaults to sys.stdout. - """ - - BRIGHT_BIT = 8 - - # Indices are ANSI color numbers, values are the corresponding Windows Console API color numbers - ANSI_TO_WINDOWS = [ - 0, # black The Windows colours are defined in wincon.h as follows: - 4, # red define FOREGROUND_BLUE 0x0001 -- 0000 0001 - 2, # green define FOREGROUND_GREEN 0x0002 -- 0000 0010 - 6, # yellow define FOREGROUND_RED 0x0004 -- 0000 0100 - 1, # blue define FOREGROUND_INTENSITY 0x0008 -- 0000 1000 - 5, # magenta define BACKGROUND_BLUE 0x0010 -- 0001 0000 - 3, # cyan define BACKGROUND_GREEN 0x0020 -- 0010 0000 - 7, # white define BACKGROUND_RED 0x0040 -- 0100 0000 - 8, # bright black (grey) define BACKGROUND_INTENSITY 0x0080 -- 1000 0000 - 12, # bright red - 10, # bright green - 14, # bright yellow - 9, # bright blue - 13, # bright magenta - 11, # bright cyan - 15, # bright white - ] - - def __init__(self, file: "IO[str]") -> None: - handle = GetStdHandle(STDOUT) - self._handle = handle - default_text = GetConsoleScreenBufferInfo(handle).wAttributes - self._default_text = default_text - - self._default_fore = default_text & 7 - self._default_back = (default_text >> 4) & 7 - self._default_attrs = self._default_fore | (self._default_back << 4) - - self._file = file - self.write = file.write - self.flush = file.flush - - @property - def cursor_position(self) -> WindowsCoordinates: - """Returns the current position of the cursor (0-based) - - Returns: - WindowsCoordinates: The current cursor position. - """ - coord: COORD = GetConsoleScreenBufferInfo(self._handle).dwCursorPosition - return WindowsCoordinates(row=cast(int, coord.Y), col=cast(int, coord.X)) - - @property - def screen_size(self) -> WindowsCoordinates: - """Returns the current size of the console screen buffer, in character columns and rows - - Returns: - WindowsCoordinates: The width and height of the screen as WindowsCoordinates. - """ - screen_size: COORD = GetConsoleScreenBufferInfo(self._handle).dwSize - return WindowsCoordinates( - row=cast(int, screen_size.Y), col=cast(int, screen_size.X) - ) - - def write_text(self, text: str) -> None: - """Write text directly to the terminal without any modification of styles - - Args: - text (str): The text to write to the console - """ - self.write(text) - self.flush() - - def write_styled(self, text: str, style: Style) -> None: - """Write styled text to the terminal. - - Args: - text (str): The text to write - style (Style): The style of the text - """ - color = style.color - bgcolor = style.bgcolor - if style.reverse: - color, bgcolor = bgcolor, color - - if color: - fore = color.downgrade(ColorSystem.WINDOWS).number - fore = fore if fore is not None else 7 # Default to ANSI 7: White - if style.bold: - fore = fore | self.BRIGHT_BIT - if style.dim: - fore = fore & ~self.BRIGHT_BIT - fore = self.ANSI_TO_WINDOWS[fore] - else: - fore = self._default_fore - - if bgcolor: - back = bgcolor.downgrade(ColorSystem.WINDOWS).number - back = back if back is not None else 0 # Default to ANSI 0: Black - back = self.ANSI_TO_WINDOWS[back] - else: - back = self._default_back - - assert fore is not None - assert back is not None - - SetConsoleTextAttribute( - self._handle, attributes=ctypes.c_ushort(fore | (back << 4)) - ) - self.write_text(text) - SetConsoleTextAttribute(self._handle, attributes=self._default_text) - - def move_cursor_to(self, new_position: WindowsCoordinates) -> None: - """Set the position of the cursor - - Args: - new_position (WindowsCoordinates): The WindowsCoordinates representing the new position of the cursor. - """ - if new_position.col < 0 or new_position.row < 0: - return - SetConsoleCursorPosition(self._handle, coords=new_position) - - def erase_line(self) -> None: - """Erase all content on the line the cursor is currently located at""" - screen_size = self.screen_size - cursor_position = self.cursor_position - cells_to_erase = screen_size.col - start_coordinates = WindowsCoordinates(row=cursor_position.row, col=0) - FillConsoleOutputCharacter( - self._handle, " ", length=cells_to_erase, start=start_coordinates - ) - FillConsoleOutputAttribute( - self._handle, - self._default_attrs, - length=cells_to_erase, - start=start_coordinates, - ) - - def erase_end_of_line(self) -> None: - """Erase all content from the cursor position to the end of that line""" - cursor_position = self.cursor_position - cells_to_erase = self.screen_size.col - cursor_position.col - FillConsoleOutputCharacter( - self._handle, " ", length=cells_to_erase, start=cursor_position - ) - FillConsoleOutputAttribute( - self._handle, - self._default_attrs, - length=cells_to_erase, - start=cursor_position, - ) - - def erase_start_of_line(self) -> None: - """Erase all content from the cursor position to the start of that line""" - row, col = self.cursor_position - start = WindowsCoordinates(row, 0) - FillConsoleOutputCharacter(self._handle, " ", length=col, start=start) - FillConsoleOutputAttribute( - self._handle, self._default_attrs, length=col, start=start - ) - - def move_cursor_up(self) -> None: - """Move the cursor up a single cell""" - cursor_position = self.cursor_position - SetConsoleCursorPosition( - self._handle, - coords=WindowsCoordinates( - row=cursor_position.row - 1, col=cursor_position.col - ), - ) - - def move_cursor_down(self) -> None: - """Move the cursor down a single cell""" - cursor_position = self.cursor_position - SetConsoleCursorPosition( - self._handle, - coords=WindowsCoordinates( - row=cursor_position.row + 1, - col=cursor_position.col, - ), - ) - - def move_cursor_forward(self) -> None: - """Move the cursor forward a single cell. Wrap to the next line if required.""" - row, col = self.cursor_position - if col == self.screen_size.col - 1: - row += 1 - col = 0 - else: - col += 1 - SetConsoleCursorPosition( - self._handle, coords=WindowsCoordinates(row=row, col=col) - ) - - def move_cursor_to_column(self, column: int) -> None: - """Move cursor to the column specified by the zero-based column index, staying on the same row - - Args: - column (int): The zero-based column index to move the cursor to. - """ - row, _ = self.cursor_position - SetConsoleCursorPosition(self._handle, coords=WindowsCoordinates(row, column)) - - def move_cursor_backward(self) -> None: - """Move the cursor backward a single cell. Wrap to the previous line if required.""" - row, col = self.cursor_position - if col == 0: - row -= 1 - col = self.screen_size.col - 1 - else: - col -= 1 - SetConsoleCursorPosition( - self._handle, coords=WindowsCoordinates(row=row, col=col) - ) - - def hide_cursor(self) -> None: - """Hide the cursor""" - current_cursor_size = self._get_cursor_size() - invisible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=0) - SetConsoleCursorInfo(self._handle, cursor_info=invisible_cursor) - - def show_cursor(self) -> None: - """Show the cursor""" - current_cursor_size = self._get_cursor_size() - visible_cursor = CONSOLE_CURSOR_INFO(dwSize=current_cursor_size, bVisible=1) - SetConsoleCursorInfo(self._handle, cursor_info=visible_cursor) - - def set_title(self, title: str) -> None: - """Set the title of the terminal window - - Args: - title (str): The new title of the console window - """ - assert len(title) < 255, "Console title must be less than 255 characters" - SetConsoleTitle(title) - - def _get_cursor_size(self) -> int: - """Get the percentage of the character cell that is filled by the cursor""" - cursor_info = CONSOLE_CURSOR_INFO() - GetConsoleCursorInfo(self._handle, cursor_info=cursor_info) - return int(cursor_info.dwSize) - - -if __name__ == "__main__": - handle = GetStdHandle() - - from pip._vendor.rich.console import Console - - console = Console() - - term = LegacyWindowsTerm(sys.stdout) - term.set_title("Win32 Console Examples") - - style = Style(color="black", bgcolor="red") - - heading = Style.parse("black on green") - - # Check colour output - console.rule("Checking colour output") - console.print("[on red]on red!") - console.print("[blue]blue!") - console.print("[yellow]yellow!") - console.print("[bold yellow]bold yellow!") - console.print("[bright_yellow]bright_yellow!") - console.print("[dim bright_yellow]dim bright_yellow!") - console.print("[italic cyan]italic cyan!") - console.print("[bold white on blue]bold white on blue!") - console.print("[reverse bold white on blue]reverse bold white on blue!") - console.print("[bold black on cyan]bold black on cyan!") - console.print("[black on green]black on green!") - console.print("[blue on green]blue on green!") - console.print("[white on black]white on black!") - console.print("[black on white]black on white!") - console.print("[#1BB152 on #DA812D]#1BB152 on #DA812D!") - - # Check cursor movement - console.rule("Checking cursor movement") - console.print() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("went back and wrapped to prev line") - time.sleep(1) - term.move_cursor_up() - term.write_text("we go up") - time.sleep(1) - term.move_cursor_down() - term.write_text("and down") - time.sleep(1) - term.move_cursor_up() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("we went up and back 2") - time.sleep(1) - term.move_cursor_down() - term.move_cursor_backward() - term.move_cursor_backward() - term.write_text("we went down and back 2") - time.sleep(1) - - # Check erasing of lines - term.hide_cursor() - console.print() - console.rule("Checking line erasing") - console.print("\n...Deleting to the start of the line...") - term.write_text("The red arrow shows the cursor location, and direction of erase") - time.sleep(1) - term.move_cursor_to_column(16) - term.write_styled("<", Style.parse("black on red")) - term.move_cursor_backward() - time.sleep(1) - term.erase_start_of_line() - time.sleep(1) - - console.print("\n\n...And to the end of the line...") - term.write_text("The red arrow shows the cursor location, and direction of erase") - time.sleep(1) - - term.move_cursor_to_column(16) - term.write_styled(">", Style.parse("black on red")) - time.sleep(1) - term.erase_end_of_line() - time.sleep(1) - - console.print("\n\n...Now the whole line will be erased...") - term.write_styled("I'm going to disappear!", style=Style.parse("black on cyan")) - time.sleep(1) - term.erase_line() - - term.show_cursor() - print("\n") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py deleted file mode 100644 index 10fc0d7..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py +++ /dev/null @@ -1,72 +0,0 @@ -import sys -from dataclasses import dataclass - - -@dataclass -class WindowsConsoleFeatures: - """Windows features available.""" - - vt: bool = False - """The console supports VT codes.""" - truecolor: bool = False - """The console supports truecolor.""" - - -try: - import ctypes - from ctypes import LibraryLoader - - if sys.platform == "win32": - windll = LibraryLoader(ctypes.WinDLL) - else: - windll = None - raise ImportError("Not windows") - - from pip._vendor.rich._win32_console import ( - ENABLE_VIRTUAL_TERMINAL_PROCESSING, - GetConsoleMode, - GetStdHandle, - LegacyWindowsError, - ) - -except (AttributeError, ImportError, ValueError): - - # Fallback if we can't load the Windows DLL - def get_windows_console_features() -> WindowsConsoleFeatures: - features = WindowsConsoleFeatures() - return features - -else: - - def get_windows_console_features() -> WindowsConsoleFeatures: - """Get windows console features. - - Returns: - WindowsConsoleFeatures: An instance of WindowsConsoleFeatures. - """ - handle = GetStdHandle() - try: - console_mode = GetConsoleMode(handle) - success = True - except LegacyWindowsError: - console_mode = 0 - success = False - vt = bool(success and console_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) - truecolor = False - if vt: - win_version = sys.getwindowsversion() - truecolor = win_version.major > 10 or ( - win_version.major == 10 and win_version.build >= 15063 - ) - features = WindowsConsoleFeatures(vt=vt, truecolor=truecolor) - return features - - -if __name__ == "__main__": - import platform - - features = get_windows_console_features() - from pip._vendor.rich import print - - print(f'platform="{platform.system()}"') - print(repr(features)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py deleted file mode 100644 index 5ece056..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py +++ /dev/null @@ -1,56 +0,0 @@ -from typing import Iterable, Sequence, Tuple, cast - -from pip._vendor.rich._win32_console import LegacyWindowsTerm, WindowsCoordinates -from pip._vendor.rich.segment import ControlCode, ControlType, Segment - - -def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: - """Makes appropriate Windows Console API calls based on the segments in the buffer. - - Args: - buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. - term (LegacyWindowsTerm): Used to call the Windows Console API. - """ - for text, style, control in buffer: - if not control: - if style: - term.write_styled(text, style) - else: - term.write_text(text) - else: - control_codes: Sequence[ControlCode] = control - for control_code in control_codes: - control_type = control_code[0] - if control_type == ControlType.CURSOR_MOVE_TO: - _, x, y = cast(Tuple[ControlType, int, int], control_code) - term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) - elif control_type == ControlType.CARRIAGE_RETURN: - term.write_text("\r") - elif control_type == ControlType.HOME: - term.move_cursor_to(WindowsCoordinates(0, 0)) - elif control_type == ControlType.CURSOR_UP: - term.move_cursor_up() - elif control_type == ControlType.CURSOR_DOWN: - term.move_cursor_down() - elif control_type == ControlType.CURSOR_FORWARD: - term.move_cursor_forward() - elif control_type == ControlType.CURSOR_BACKWARD: - term.move_cursor_backward() - elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: - _, column = cast(Tuple[ControlType, int], control_code) - term.move_cursor_to_column(column - 1) - elif control_type == ControlType.HIDE_CURSOR: - term.hide_cursor() - elif control_type == ControlType.SHOW_CURSOR: - term.show_cursor() - elif control_type == ControlType.ERASE_IN_LINE: - _, mode = cast(Tuple[ControlType, int], control_code) - if mode == 0: - term.erase_end_of_line() - elif mode == 1: - term.erase_start_of_line() - elif mode == 2: - term.erase_line() - elif control_type == ControlType.SET_WINDOW_TITLE: - _, title = cast(Tuple[ControlType, str], control_code) - term.set_title(title) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py deleted file mode 100644 index c45f193..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py +++ /dev/null @@ -1,56 +0,0 @@ -import re -from typing import Iterable, List, Tuple - -from ._loop import loop_last -from .cells import cell_len, chop_cells - -re_word = re.compile(r"\s*\S+\s*") - - -def words(text: str) -> Iterable[Tuple[int, int, str]]: - position = 0 - word_match = re_word.match(text, position) - while word_match is not None: - start, end = word_match.span() - word = word_match.group(0) - yield start, end, word - word_match = re_word.match(text, end) - - -def divide_line(text: str, width: int, fold: bool = True) -> List[int]: - divides: List[int] = [] - append = divides.append - line_position = 0 - _cell_len = cell_len - for start, _end, word in words(text): - word_length = _cell_len(word.rstrip()) - if line_position + word_length > width: - if word_length > width: - if fold: - chopped_words = chop_cells(word, max_size=width, position=0) - for last, line in loop_last(chopped_words): - if start: - append(start) - - if last: - line_position = _cell_len(line) - else: - start += len(line) - else: - if start: - append(start) - line_position = _cell_len(word) - elif line_position and start: - append(start) - line_position = _cell_len(word) - else: - line_position += _cell_len(word) - return divides - - -if __name__ == "__main__": # pragma: no cover - from .console import Console - - console = Console(width=10) - console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345") - print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10, position=2)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py deleted file mode 100644 index e6e498e..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py +++ /dev/null @@ -1,33 +0,0 @@ -from abc import ABC - - -class RichRenderable(ABC): - """An abstract base class for Rich renderables. - - Note that there is no need to extend this class, the intended use is to check if an - object supports the Rich renderable protocol. For example:: - - if isinstance(my_object, RichRenderable): - console.print(my_object) - - """ - - @classmethod - def __subclasshook__(cls, other: type) -> bool: - """Check if this class supports the rich render protocol.""" - return hasattr(other, "__rich_console__") or hasattr(other, "__rich__") - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.text import Text - - t = Text() - print(isinstance(Text, RichRenderable)) - print(isinstance(t, RichRenderable)) - - class Foo: - pass - - f = Foo() - print(isinstance(f, RichRenderable)) - print(isinstance("", RichRenderable)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py deleted file mode 100644 index c310b66..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py +++ /dev/null @@ -1,311 +0,0 @@ -import sys -from itertools import chain -from typing import TYPE_CHECKING, Iterable, Optional - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from pip._vendor.typing_extensions import Literal # pragma: no cover - -from .constrain import Constrain -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import StyleType - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - -AlignMethod = Literal["left", "center", "right"] -VerticalAlignMethod = Literal["top", "middle", "bottom"] - - -class Align(JupyterMixin): - """Align a renderable by adding spaces if necessary. - - Args: - renderable (RenderableType): A console renderable. - align (AlignMethod): One of "left", "center", or "right"" - style (StyleType, optional): An optional style to apply to the background. - vertical (Optional[VerticalAlginMethod], optional): Optional vertical align, one of "top", "middle", or "bottom". Defaults to None. - pad (bool, optional): Pad the right with spaces. Defaults to True. - width (int, optional): Restrict contents to given width, or None to use default width. Defaults to None. - height (int, optional): Set height of align renderable, or None to fit to contents. Defaults to None. - - Raises: - ValueError: if ``align`` is not one of the expected values. - """ - - def __init__( - self, - renderable: "RenderableType", - align: AlignMethod = "left", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> None: - if align not in ("left", "center", "right"): - raise ValueError( - f'invalid value for align, expected "left", "center", or "right" (not {align!r})' - ) - if vertical is not None and vertical not in ("top", "middle", "bottom"): - raise ValueError( - f'invalid value for vertical, expected "top", "middle", or "bottom" (not {vertical!r})' - ) - self.renderable = renderable - self.align = align - self.style = style - self.vertical = vertical - self.pad = pad - self.width = width - self.height = height - - def __repr__(self) -> str: - return f"Align({self.renderable!r}, {self.align!r})" - - @classmethod - def left( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the left.""" - return cls( - renderable, - "left", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - @classmethod - def center( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the center.""" - return cls( - renderable, - "center", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - @classmethod - def right( - cls, - renderable: "RenderableType", - style: Optional[StyleType] = None, - *, - vertical: Optional[VerticalAlignMethod] = None, - pad: bool = True, - width: Optional[int] = None, - height: Optional[int] = None, - ) -> "Align": - """Align a renderable to the right.""" - return cls( - renderable, - "right", - style=style, - vertical=vertical, - pad=pad, - width=width, - height=height, - ) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - align = self.align - width = console.measure(self.renderable, options=options).maximum - rendered = console.render( - Constrain( - self.renderable, width if self.width is None else min(width, self.width) - ), - options.update(height=None), - ) - lines = list(Segment.split_lines(rendered)) - width, height = Segment.get_shape(lines) - lines = Segment.set_shape(lines, width, height) - new_line = Segment.line() - excess_space = options.max_width - width - style = console.get_style(self.style) if self.style is not None else None - - def generate_segments() -> Iterable[Segment]: - if excess_space <= 0: - # Exact fit - for line in lines: - yield from line - yield new_line - - elif align == "left": - # Pad on the right - pad = Segment(" " * excess_space, style) if self.pad else None - for line in lines: - yield from line - if pad: - yield pad - yield new_line - - elif align == "center": - # Pad left and right - left = excess_space // 2 - pad = Segment(" " * left, style) - pad_right = ( - Segment(" " * (excess_space - left), style) if self.pad else None - ) - for line in lines: - if left: - yield pad - yield from line - if pad_right: - yield pad_right - yield new_line - - elif align == "right": - # Padding on left - pad = Segment(" " * excess_space, style) - for line in lines: - yield pad - yield from line - yield new_line - - blank_line = ( - Segment(f"{' ' * (self.width or options.max_width)}\n", style) - if self.pad - else Segment("\n") - ) - - def blank_lines(count: int) -> Iterable[Segment]: - if count > 0: - for _ in range(count): - yield blank_line - - vertical_height = self.height or options.height - iter_segments: Iterable[Segment] - if self.vertical and vertical_height is not None: - if self.vertical == "top": - bottom_space = vertical_height - height - iter_segments = chain(generate_segments(), blank_lines(bottom_space)) - elif self.vertical == "middle": - top_space = (vertical_height - height) // 2 - bottom_space = vertical_height - top_space - height - iter_segments = chain( - blank_lines(top_space), - generate_segments(), - blank_lines(bottom_space), - ) - else: # self.vertical == "bottom": - top_space = vertical_height - height - iter_segments = chain(blank_lines(top_space), generate_segments()) - else: - iter_segments = generate_segments() - if self.style: - style = console.get_style(self.style) - iter_segments = Segment.apply_style(iter_segments, style) - yield from iter_segments - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - measurement = Measurement.get(console, options, self.renderable) - return measurement - - -class VerticalCenter(JupyterMixin): - """Vertically aligns a renderable. - - Warn: - This class is deprecated and may be removed in a future version. Use Align class with - `vertical="middle"`. - - Args: - renderable (RenderableType): A renderable object. - """ - - def __init__( - self, - renderable: "RenderableType", - style: Optional[StyleType] = None, - ) -> None: - self.renderable = renderable - self.style = style - - def __repr__(self) -> str: - return f"VerticalCenter({self.renderable!r})" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - style = console.get_style(self.style) if self.style is not None else None - lines = console.render_lines( - self.renderable, options.update(height=None), pad=False - ) - width, _height = Segment.get_shape(lines) - new_line = Segment.line() - height = options.height or options.size.height - top_space = (height - len(lines)) // 2 - bottom_space = height - top_space - len(lines) - blank_line = Segment(f"{' ' * width}", style) - - def blank_lines(count: int) -> Iterable[Segment]: - for _ in range(count): - yield blank_line - yield new_line - - if top_space > 0: - yield from blank_lines(top_space) - for line in lines: - yield from line - yield new_line - if bottom_space > 0: - yield from blank_lines(bottom_space) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> Measurement: - measurement = Measurement.get(console, options, self.renderable) - return measurement - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console, Group - from pip._vendor.rich.highlighter import ReprHighlighter - from pip._vendor.rich.panel import Panel - - highlighter = ReprHighlighter() - console = Console() - - panel = Panel( - Group( - Align.left(highlighter("align='left'")), - Align.center(highlighter("align='center'")), - Align.right(highlighter("align='right'")), - ), - width=60, - style="on dark_blue", - title="Align", - ) - - console.print( - Align.center(panel, vertical="middle", style="on red", height=console.height) - ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py deleted file mode 100644 index 66365e6..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py +++ /dev/null @@ -1,240 +0,0 @@ -import re -import sys -from contextlib import suppress -from typing import Iterable, NamedTuple, Optional - -from .color import Color -from .style import Style -from .text import Text - -re_ansi = re.compile( - r""" -(?:\x1b\](.*?)\x1b\\)| -(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) -""", - re.VERBOSE, -) - - -class _AnsiToken(NamedTuple): - """Result of ansi tokenized string.""" - - plain: str = "" - sgr: Optional[str] = "" - osc: Optional[str] = "" - - -def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: - """Tokenize a string in to plain text and ANSI codes. - - Args: - ansi_text (str): A String containing ANSI codes. - - Yields: - AnsiToken: A named tuple of (plain, sgr, osc) - """ - - position = 0 - sgr: Optional[str] - osc: Optional[str] - for match in re_ansi.finditer(ansi_text): - start, end = match.span(0) - osc, sgr = match.groups() - if start > position: - yield _AnsiToken(ansi_text[position:start]) - if sgr: - if sgr == "(": - position = end + 1 - continue - if sgr.endswith("m"): - yield _AnsiToken("", sgr[1:-1], osc) - else: - yield _AnsiToken("", sgr, osc) - position = end - if position < len(ansi_text): - yield _AnsiToken(ansi_text[position:]) - - -SGR_STYLE_MAP = { - 1: "bold", - 2: "dim", - 3: "italic", - 4: "underline", - 5: "blink", - 6: "blink2", - 7: "reverse", - 8: "conceal", - 9: "strike", - 21: "underline2", - 22: "not dim not bold", - 23: "not italic", - 24: "not underline", - 25: "not blink", - 26: "not blink2", - 27: "not reverse", - 28: "not conceal", - 29: "not strike", - 30: "color(0)", - 31: "color(1)", - 32: "color(2)", - 33: "color(3)", - 34: "color(4)", - 35: "color(5)", - 36: "color(6)", - 37: "color(7)", - 39: "default", - 40: "on color(0)", - 41: "on color(1)", - 42: "on color(2)", - 43: "on color(3)", - 44: "on color(4)", - 45: "on color(5)", - 46: "on color(6)", - 47: "on color(7)", - 49: "on default", - 51: "frame", - 52: "encircle", - 53: "overline", - 54: "not frame not encircle", - 55: "not overline", - 90: "color(8)", - 91: "color(9)", - 92: "color(10)", - 93: "color(11)", - 94: "color(12)", - 95: "color(13)", - 96: "color(14)", - 97: "color(15)", - 100: "on color(8)", - 101: "on color(9)", - 102: "on color(10)", - 103: "on color(11)", - 104: "on color(12)", - 105: "on color(13)", - 106: "on color(14)", - 107: "on color(15)", -} - - -class AnsiDecoder: - """Translate ANSI code in to styled Text.""" - - def __init__(self) -> None: - self.style = Style.null() - - def decode(self, terminal_text: str) -> Iterable[Text]: - """Decode ANSI codes in an iterable of lines. - - Args: - lines (Iterable[str]): An iterable of lines of terminal output. - - Yields: - Text: Marked up Text. - """ - for line in terminal_text.splitlines(): - yield self.decode_line(line) - - def decode_line(self, line: str) -> Text: - """Decode a line containing ansi codes. - - Args: - line (str): A line of terminal output. - - Returns: - Text: A Text instance marked up according to ansi codes. - """ - from_ansi = Color.from_ansi - from_rgb = Color.from_rgb - _Style = Style - text = Text() - append = text.append - line = line.rsplit("\r", 1)[-1] - for plain_text, sgr, osc in _ansi_tokenize(line): - if plain_text: - append(plain_text, self.style or None) - elif osc is not None: - if osc.startswith("8;"): - _params, semicolon, link = osc[2:].partition(";") - if semicolon: - self.style = self.style.update_link(link or None) - elif sgr is not None: - # Translate in to semi-colon separated codes - # Ignore invalid codes, because we want to be lenient - codes = [ - min(255, int(_code) if _code else 0) - for _code in sgr.split(";") - if _code.isdigit() or _code == "" - ] - iter_codes = iter(codes) - for code in iter_codes: - if code == 0: - # reset - self.style = _Style.null() - elif code in SGR_STYLE_MAP: - # styles - self.style += _Style.parse(SGR_STYLE_MAP[code]) - elif code == 38: - #  Foreground - with suppress(StopIteration): - color_type = next(iter_codes) - if color_type == 5: - self.style += _Style.from_color( - from_ansi(next(iter_codes)) - ) - elif color_type == 2: - self.style += _Style.from_color( - from_rgb( - next(iter_codes), - next(iter_codes), - next(iter_codes), - ) - ) - elif code == 48: - # Background - with suppress(StopIteration): - color_type = next(iter_codes) - if color_type == 5: - self.style += _Style.from_color( - None, from_ansi(next(iter_codes)) - ) - elif color_type == 2: - self.style += _Style.from_color( - None, - from_rgb( - next(iter_codes), - next(iter_codes), - next(iter_codes), - ), - ) - - return text - - -if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover - import io - import os - import pty - import sys - - decoder = AnsiDecoder() - - stdout = io.BytesIO() - - def read(fd: int) -> bytes: - data = os.read(fd, 1024) - stdout.write(data) - return data - - pty.spawn(sys.argv[1:], read) - - from .console import Console - - console = Console(record=True) - - stdout_result = stdout.getvalue().decode("utf-8") - print(stdout_result) - - for line in decoder.decode(stdout_result): - console.print(line) - - console.save_html("stdout.html") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py deleted file mode 100644 index ed86a55..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py +++ /dev/null @@ -1,94 +0,0 @@ -from typing import Optional, Union - -from .color import Color -from .console import Console, ConsoleOptions, RenderResult -from .jupyter import JupyterMixin -from .measure import Measurement -from .segment import Segment -from .style import Style - -# There are left-aligned characters for 1/8 to 7/8, but -# the right-aligned characters exist only for 1/8 and 4/8. -BEGIN_BLOCK_ELEMENTS = ["â–ˆ", "â–ˆ", "â–ˆ", "â–", "â–", "â–", "â–•", "â–•"] -END_BLOCK_ELEMENTS = [" ", "â–", "â–Ž", "â–", "â–Œ", "â–‹", "â–Š", "â–‰"] -FULL_BLOCK = "â–ˆ" - - -class Bar(JupyterMixin): - """Renders a solid block bar. - - Args: - size (float): Value for the end of the bar. - begin (float): Begin point (between 0 and size, inclusive). - end (float): End point (between 0 and size, inclusive). - width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None. - color (Union[Color, str], optional): Color of the bar. Defaults to "default". - bgcolor (Union[Color, str], optional): Color of bar background. Defaults to "default". - """ - - def __init__( - self, - size: float, - begin: float, - end: float, - *, - width: Optional[int] = None, - color: Union[Color, str] = "default", - bgcolor: Union[Color, str] = "default", - ): - self.size = size - self.begin = max(begin, 0) - self.end = min(end, size) - self.width = width - self.style = Style(color=color, bgcolor=bgcolor) - - def __repr__(self) -> str: - return f"Bar({self.size}, {self.begin}, {self.end})" - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - - width = min( - self.width if self.width is not None else options.max_width, - options.max_width, - ) - - if self.begin >= self.end: - yield Segment(" " * width, self.style) - yield Segment.line() - return - - prefix_complete_eights = int(width * 8 * self.begin / self.size) - prefix_bar_count = prefix_complete_eights // 8 - prefix_eights_count = prefix_complete_eights % 8 - - body_complete_eights = int(width * 8 * self.end / self.size) - body_bar_count = body_complete_eights // 8 - body_eights_count = body_complete_eights % 8 - - # When start and end fall into the same cell, we ideally should render - # a symbol that's "center-aligned", but there is no good symbol in Unicode. - # In this case, we fall back to right-aligned block symbol for simplicity. - - prefix = " " * prefix_bar_count - if prefix_eights_count: - prefix += BEGIN_BLOCK_ELEMENTS[prefix_eights_count] - - body = FULL_BLOCK * body_bar_count - if body_eights_count: - body += END_BLOCK_ELEMENTS[body_eights_count] - - suffix = " " * (width - len(body)) - - yield Segment(prefix + body[len(prefix) :] + suffix, self.style) - yield Segment.line() - - def __rich_measure__( - self, console: Console, options: ConsoleOptions - ) -> Measurement: - return ( - Measurement(self.width, self.width) - if self.width is not None - else Measurement(4, options.max_width) - ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py deleted file mode 100644 index 97d2a94..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py +++ /dev/null @@ -1,517 +0,0 @@ -import sys -from typing import TYPE_CHECKING, Iterable, List - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from pip._vendor.typing_extensions import Literal # pragma: no cover - - -from ._loop import loop_last - -if TYPE_CHECKING: - from pip._vendor.rich.console import ConsoleOptions - - -class Box: - """Defines characters to render boxes. - - ┌─┬┠top - │ ││ head - ├─┼┤ head_row - │ ││ mid - ├─┼┤ row - ├─┼┤ foot_row - │ ││ foot - └─┴┘ bottom - - Args: - box (str): Characters making up box. - ascii (bool, optional): True if this box uses ascii characters only. Default is False. - """ - - def __init__(self, box: str, *, ascii: bool = False) -> None: - self._box = box - self.ascii = ascii - line1, line2, line3, line4, line5, line6, line7, line8 = box.splitlines() - # top - self.top_left, self.top, self.top_divider, self.top_right = iter(line1) - # head - self.head_left, _, self.head_vertical, self.head_right = iter(line2) - # head_row - ( - self.head_row_left, - self.head_row_horizontal, - self.head_row_cross, - self.head_row_right, - ) = iter(line3) - - # mid - self.mid_left, _, self.mid_vertical, self.mid_right = iter(line4) - # row - self.row_left, self.row_horizontal, self.row_cross, self.row_right = iter(line5) - # foot_row - ( - self.foot_row_left, - self.foot_row_horizontal, - self.foot_row_cross, - self.foot_row_right, - ) = iter(line6) - # foot - self.foot_left, _, self.foot_vertical, self.foot_right = iter(line7) - # bottom - self.bottom_left, self.bottom, self.bottom_divider, self.bottom_right = iter( - line8 - ) - - def __repr__(self) -> str: - return "Box(...)" - - def __str__(self) -> str: - return self._box - - def substitute(self, options: "ConsoleOptions", safe: bool = True) -> "Box": - """Substitute this box for another if it won't render due to platform issues. - - Args: - options (ConsoleOptions): Console options used in rendering. - safe (bool, optional): Substitute this for another Box if there are known problems - displaying on the platform (currently only relevant on Windows). Default is True. - - Returns: - Box: A different Box or the same Box. - """ - box = self - if options.legacy_windows and safe: - box = LEGACY_WINDOWS_SUBSTITUTIONS.get(box, box) - if options.ascii_only and not box.ascii: - box = ASCII - return box - - def get_plain_headed_box(self) -> "Box": - """If this box uses special characters for the borders of the header, then - return the equivalent box that does not. - - Returns: - Box: The most similar Box that doesn't use header-specific box characters. - If the current Box already satisfies this criterion, then it's returned. - """ - return PLAIN_HEADED_SUBSTITUTIONS.get(self, self) - - def get_top(self, widths: Iterable[int]) -> str: - """Get the top of a simple box. - - Args: - widths (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - - parts: List[str] = [] - append = parts.append - append(self.top_left) - for last, width in loop_last(widths): - append(self.top * width) - if not last: - append(self.top_divider) - append(self.top_right) - return "".join(parts) - - def get_row( - self, - widths: Iterable[int], - level: Literal["head", "row", "foot", "mid"] = "row", - edge: bool = True, - ) -> str: - """Get the top of a simple box. - - Args: - width (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - if level == "head": - left = self.head_row_left - horizontal = self.head_row_horizontal - cross = self.head_row_cross - right = self.head_row_right - elif level == "row": - left = self.row_left - horizontal = self.row_horizontal - cross = self.row_cross - right = self.row_right - elif level == "mid": - left = self.mid_left - horizontal = " " - cross = self.mid_vertical - right = self.mid_right - elif level == "foot": - left = self.foot_row_left - horizontal = self.foot_row_horizontal - cross = self.foot_row_cross - right = self.foot_row_right - else: - raise ValueError("level must be 'head', 'row' or 'foot'") - - parts: List[str] = [] - append = parts.append - if edge: - append(left) - for last, width in loop_last(widths): - append(horizontal * width) - if not last: - append(cross) - if edge: - append(right) - return "".join(parts) - - def get_bottom(self, widths: Iterable[int]) -> str: - """Get the bottom of a simple box. - - Args: - widths (List[int]): Widths of columns. - - Returns: - str: A string of box characters. - """ - - parts: List[str] = [] - append = parts.append - append(self.bottom_left) - for last, width in loop_last(widths): - append(self.bottom * width) - if not last: - append(self.bottom_divider) - append(self.bottom_right) - return "".join(parts) - - -ASCII: Box = Box( - """\ -+--+ -| || -|-+| -| || -|-+| -|-+| -| || -+--+ -""", - ascii=True, -) - -ASCII2: Box = Box( - """\ -+-++ -| || -+-++ -| || -+-++ -+-++ -| || -+-++ -""", - ascii=True, -) - -ASCII_DOUBLE_HEAD: Box = Box( - """\ -+-++ -| || -+=++ -| || -+-++ -+-++ -| || -+-++ -""", - ascii=True, -) - -SQUARE: Box = Box( - """\ -┌─┬┠-│ ││ -├─┼┤ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" -) - -SQUARE_DOUBLE_HEAD: Box = Box( - """\ -┌─┬┠-│ ││ -╞â•╪╡ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" -) - -MINIMAL: Box = Box( - """\ - â•· - │ -╶─┼╴ - │ -╶─┼╴ -╶─┼╴ - │ - ╵ -""" -) - - -MINIMAL_HEAVY_HEAD: Box = Box( - """\ - â•· - │ -╺â”┿╸ - │ -╶─┼╴ -╶─┼╴ - │ - ╵ -""" -) - -MINIMAL_DOUBLE_HEAD: Box = Box( - """\ - â•· - │ - â•╪ - │ - ─┼ - ─┼ - │ - ╵ -""" -) - - -SIMPLE: Box = Box( - """\ - - - ── - - - ── - - -""" -) - -SIMPLE_HEAD: Box = Box( - """\ - - - ── - - - - - -""" -) - - -SIMPLE_HEAVY: Box = Box( - """\ - - - â”â” - - - â”â” - - -""" -) - - -HORIZONTALS: Box = Box( - """\ - ── - - ── - - ── - ── - - ── -""" -) - -ROUNDED: Box = Box( - """\ -╭─┬╮ -│ ││ -├─┼┤ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -╰─┴╯ -""" -) - -HEAVY: Box = Box( - """\ -â”â”┳┓ -┃ ┃┃ -┣â”╋┫ -┃ ┃┃ -┣â”╋┫ -┣â”╋┫ -┃ ┃┃ -â”—â”┻┛ -""" -) - -HEAVY_EDGE: Box = Box( - """\ -â”â”┯┓ -┃ │┃ -┠─┼┨ -┃ │┃ -┠─┼┨ -┠─┼┨ -┃ │┃ -â”—â”â”·â”› -""" -) - -HEAVY_HEAD: Box = Box( - """\ -â”â”┳┓ -┃ ┃┃ -┡â”╇┩ -│ ││ -├─┼┤ -├─┼┤ -│ ││ -└─┴┘ -""" -) - -DOUBLE: Box = Box( - """\ -â•”â•╦╗ -â•‘ â•‘â•‘ -â• â•╬╣ -â•‘ â•‘â•‘ -â• â•╬╣ -â• â•╬╣ -â•‘ â•‘â•‘ -╚â•â•©â• -""" -) - -DOUBLE_EDGE: Box = Box( - """\ -â•”â•╤╗ -â•‘ │║ -╟─┼╢ -â•‘ │║ -╟─┼╢ -╟─┼╢ -â•‘ │║ -╚â•â•§â• -""" -) - -MARKDOWN: Box = Box( - """\ - -| || -|-|| -| || -|-|| -|-|| -| || - -""", - ascii=True, -) - -# Map Boxes that don't render with raster fonts on to equivalent that do -LEGACY_WINDOWS_SUBSTITUTIONS = { - ROUNDED: SQUARE, - MINIMAL_HEAVY_HEAD: MINIMAL, - SIMPLE_HEAVY: SIMPLE, - HEAVY: SQUARE, - HEAVY_EDGE: SQUARE, - HEAVY_HEAD: SQUARE, -} - -# Map headed boxes to their headerless equivalents -PLAIN_HEADED_SUBSTITUTIONS = { - HEAVY_HEAD: SQUARE, - SQUARE_DOUBLE_HEAD: SQUARE, - MINIMAL_DOUBLE_HEAD: MINIMAL, - MINIMAL_HEAVY_HEAD: MINIMAL, - ASCII_DOUBLE_HEAD: ASCII2, -} - - -if __name__ == "__main__": # pragma: no cover - - from pip._vendor.rich.columns import Columns - from pip._vendor.rich.panel import Panel - - from . import box as box - from .console import Console - from .table import Table - from .text import Text - - console = Console(record=True) - - BOXES = [ - "ASCII", - "ASCII2", - "ASCII_DOUBLE_HEAD", - "SQUARE", - "SQUARE_DOUBLE_HEAD", - "MINIMAL", - "MINIMAL_HEAVY_HEAD", - "MINIMAL_DOUBLE_HEAD", - "SIMPLE", - "SIMPLE_HEAD", - "SIMPLE_HEAVY", - "HORIZONTALS", - "ROUNDED", - "HEAVY", - "HEAVY_EDGE", - "HEAVY_HEAD", - "DOUBLE", - "DOUBLE_EDGE", - "MARKDOWN", - ] - - console.print(Panel("[bold green]Box Constants", style="green"), justify="center") - console.print() - - columns = Columns(expand=True, padding=2) - for box_name in sorted(BOXES): - table = Table( - show_footer=True, style="dim", border_style="not dim", expand=True - ) - table.add_column("Header 1", "Footer 1") - table.add_column("Header 2", "Footer 2") - table.add_row("Cell", "Cell") - table.add_row("Cell", "Cell") - table.box = getattr(box, box_name) - table.title = Text(f"box.{box_name}", style="magenta") - columns.add_renderable(table) - console.print(columns) - - # console.save_svg("box.svg") diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py deleted file mode 100644 index 9354f9e..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py +++ /dev/null @@ -1,154 +0,0 @@ -import re -from functools import lru_cache -from typing import Callable, List - -from ._cell_widths import CELL_WIDTHS - -# Regex to match sequence of the most common character ranges -_is_single_cell_widths = re.compile("^[\u0020-\u006f\u00a0\u02ff\u0370-\u0482]*$").match - - -@lru_cache(4096) -def cached_cell_len(text: str) -> int: - """Get the number of cells required to display text. - - This method always caches, which may use up a lot of memory. It is recommended to use - `cell_len` over this method. - - Args: - text (str): Text to display. - - Returns: - int: Get the number of cells required to display text. - """ - _get_size = get_character_cell_size - total_size = sum(_get_size(character) for character in text) - return total_size - - -def cell_len(text: str, _cell_len: Callable[[str], int] = cached_cell_len) -> int: - """Get the number of cells required to display text. - - Args: - text (str): Text to display. - - Returns: - int: Get the number of cells required to display text. - """ - if len(text) < 512: - return _cell_len(text) - _get_size = get_character_cell_size - total_size = sum(_get_size(character) for character in text) - return total_size - - -@lru_cache(maxsize=4096) -def get_character_cell_size(character: str) -> int: - """Get the cell size of a character. - - Args: - character (str): A single character. - - Returns: - int: Number of cells (0, 1 or 2) occupied by that character. - """ - return _get_codepoint_cell_size(ord(character)) - - -@lru_cache(maxsize=4096) -def _get_codepoint_cell_size(codepoint: int) -> int: - """Get the cell size of a character. - - Args: - codepoint (int): Codepoint of a character. - - Returns: - int: Number of cells (0, 1 or 2) occupied by that character. - """ - - _table = CELL_WIDTHS - lower_bound = 0 - upper_bound = len(_table) - 1 - index = (lower_bound + upper_bound) // 2 - while True: - start, end, width = _table[index] - if codepoint < start: - upper_bound = index - 1 - elif codepoint > end: - lower_bound = index + 1 - else: - return 0 if width == -1 else width - if upper_bound < lower_bound: - break - index = (lower_bound + upper_bound) // 2 - return 1 - - -def set_cell_size(text: str, total: int) -> str: - """Set the length of a string to fit within given number of cells.""" - - if _is_single_cell_widths(text): - size = len(text) - if size < total: - return text + " " * (total - size) - return text[:total] - - if total <= 0: - return "" - cell_size = cell_len(text) - if cell_size == total: - return text - if cell_size < total: - return text + " " * (total - cell_size) - - start = 0 - end = len(text) - - # Binary search until we find the right size - while True: - pos = (start + end) // 2 - before = text[: pos + 1] - before_len = cell_len(before) - if before_len == total + 1 and cell_len(before[-1]) == 2: - return before[:-1] + " " - if before_len == total: - return before - if before_len > total: - end = pos - else: - start = pos - - -# TODO: This is inefficient -# TODO: This might not work with CWJ type characters -def chop_cells(text: str, max_size: int, position: int = 0) -> List[str]: - """Break text in to equal (cell) length strings, returning the characters in reverse - order""" - _get_character_cell_size = get_character_cell_size - characters = [ - (character, _get_character_cell_size(character)) for character in text - ] - total_size = position - lines: List[List[str]] = [[]] - append = lines[-1].append - - for character, size in reversed(characters): - if total_size + size > max_size: - lines.append([character]) - append = lines[-1].append - total_size = size - else: - total_size += size - append(character) - - return ["".join(line) for line in lines] - - -if __name__ == "__main__": # pragma: no cover - - print(get_character_cell_size("😽")) - for line in chop_cells("""这是对亚洲语言支æŒçš„æµ‹è¯•。é¢å¯¹æ¨¡æ£±ä¸¤å¯çš„æƒ³æ³•,拒ç»çŒœæµ‹çš„诱惑。""", 8): - print(line) - for n in range(80, 1, -1): - print(set_cell_size("""这是对亚洲语言支æŒçš„æµ‹è¯•。é¢å¯¹æ¨¡æ£±ä¸¤å¯çš„æƒ³æ³•,拒ç»çŒœæµ‹çš„诱惑。""", n) + "|") - print("x" * n) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py deleted file mode 100644 index dfe4559..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py +++ /dev/null @@ -1,622 +0,0 @@ -import platform -import re -from colorsys import rgb_to_hls -from enum import IntEnum -from functools import lru_cache -from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple - -from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE -from .color_triplet import ColorTriplet -from .repr import Result, rich_repr -from .terminal_theme import DEFAULT_TERMINAL_THEME - -if TYPE_CHECKING: # pragma: no cover - from .terminal_theme import TerminalTheme - from .text import Text - - -WINDOWS = platform.system() == "Windows" - - -class ColorSystem(IntEnum): - """One of the 3 color system supported by terminals.""" - - STANDARD = 1 - EIGHT_BIT = 2 - TRUECOLOR = 3 - WINDOWS = 4 - - def __repr__(self) -> str: - return f"ColorSystem.{self.name}" - - def __str__(self) -> str: - return repr(self) - - -class ColorType(IntEnum): - """Type of color stored in Color class.""" - - DEFAULT = 0 - STANDARD = 1 - EIGHT_BIT = 2 - TRUECOLOR = 3 - WINDOWS = 4 - - def __repr__(self) -> str: - return f"ColorType.{self.name}" - - -ANSI_COLOR_NAMES = { - "black": 0, - "red": 1, - "green": 2, - "yellow": 3, - "blue": 4, - "magenta": 5, - "cyan": 6, - "white": 7, - "bright_black": 8, - "bright_red": 9, - "bright_green": 10, - "bright_yellow": 11, - "bright_blue": 12, - "bright_magenta": 13, - "bright_cyan": 14, - "bright_white": 15, - "grey0": 16, - "gray0": 16, - "navy_blue": 17, - "dark_blue": 18, - "blue3": 20, - "blue1": 21, - "dark_green": 22, - "deep_sky_blue4": 25, - "dodger_blue3": 26, - "dodger_blue2": 27, - "green4": 28, - "spring_green4": 29, - "turquoise4": 30, - "deep_sky_blue3": 32, - "dodger_blue1": 33, - "green3": 40, - "spring_green3": 41, - "dark_cyan": 36, - "light_sea_green": 37, - "deep_sky_blue2": 38, - "deep_sky_blue1": 39, - "spring_green2": 47, - "cyan3": 43, - "dark_turquoise": 44, - "turquoise2": 45, - "green1": 46, - "spring_green1": 48, - "medium_spring_green": 49, - "cyan2": 50, - "cyan1": 51, - "dark_red": 88, - "deep_pink4": 125, - "purple4": 55, - "purple3": 56, - "blue_violet": 57, - "orange4": 94, - "grey37": 59, - "gray37": 59, - "medium_purple4": 60, - "slate_blue3": 62, - "royal_blue1": 63, - "chartreuse4": 64, - "dark_sea_green4": 71, - "pale_turquoise4": 66, - "steel_blue": 67, - "steel_blue3": 68, - "cornflower_blue": 69, - "chartreuse3": 76, - "cadet_blue": 73, - "sky_blue3": 74, - "steel_blue1": 81, - "pale_green3": 114, - "sea_green3": 78, - "aquamarine3": 79, - "medium_turquoise": 80, - "chartreuse2": 112, - "sea_green2": 83, - "sea_green1": 85, - "aquamarine1": 122, - "dark_slate_gray2": 87, - "dark_magenta": 91, - "dark_violet": 128, - "purple": 129, - "light_pink4": 95, - "plum4": 96, - "medium_purple3": 98, - "slate_blue1": 99, - "yellow4": 106, - "wheat4": 101, - "grey53": 102, - "gray53": 102, - "light_slate_grey": 103, - "light_slate_gray": 103, - "medium_purple": 104, - "light_slate_blue": 105, - "dark_olive_green3": 149, - "dark_sea_green": 108, - "light_sky_blue3": 110, - "sky_blue2": 111, - "dark_sea_green3": 150, - "dark_slate_gray3": 116, - "sky_blue1": 117, - "chartreuse1": 118, - "light_green": 120, - "pale_green1": 156, - "dark_slate_gray1": 123, - "red3": 160, - "medium_violet_red": 126, - "magenta3": 164, - "dark_orange3": 166, - "indian_red": 167, - "hot_pink3": 168, - "medium_orchid3": 133, - "medium_orchid": 134, - "medium_purple2": 140, - "dark_goldenrod": 136, - "light_salmon3": 173, - "rosy_brown": 138, - "grey63": 139, - "gray63": 139, - "medium_purple1": 141, - "gold3": 178, - "dark_khaki": 143, - "navajo_white3": 144, - "grey69": 145, - "gray69": 145, - "light_steel_blue3": 146, - "light_steel_blue": 147, - "yellow3": 184, - "dark_sea_green2": 157, - "light_cyan3": 152, - "light_sky_blue1": 153, - "green_yellow": 154, - "dark_olive_green2": 155, - "dark_sea_green1": 193, - "pale_turquoise1": 159, - "deep_pink3": 162, - "magenta2": 200, - "hot_pink2": 169, - "orchid": 170, - "medium_orchid1": 207, - "orange3": 172, - "light_pink3": 174, - "pink3": 175, - "plum3": 176, - "violet": 177, - "light_goldenrod3": 179, - "tan": 180, - "misty_rose3": 181, - "thistle3": 182, - "plum2": 183, - "khaki3": 185, - "light_goldenrod2": 222, - "light_yellow3": 187, - "grey84": 188, - "gray84": 188, - "light_steel_blue1": 189, - "yellow2": 190, - "dark_olive_green1": 192, - "honeydew2": 194, - "light_cyan1": 195, - "red1": 196, - "deep_pink2": 197, - "deep_pink1": 199, - "magenta1": 201, - "orange_red1": 202, - "indian_red1": 204, - "hot_pink": 206, - "dark_orange": 208, - "salmon1": 209, - "light_coral": 210, - "pale_violet_red1": 211, - "orchid2": 212, - "orchid1": 213, - "orange1": 214, - "sandy_brown": 215, - "light_salmon1": 216, - "light_pink1": 217, - "pink1": 218, - "plum1": 219, - "gold1": 220, - "navajo_white1": 223, - "misty_rose1": 224, - "thistle1": 225, - "yellow1": 226, - "light_goldenrod1": 227, - "khaki1": 228, - "wheat1": 229, - "cornsilk1": 230, - "grey100": 231, - "gray100": 231, - "grey3": 232, - "gray3": 232, - "grey7": 233, - "gray7": 233, - "grey11": 234, - "gray11": 234, - "grey15": 235, - "gray15": 235, - "grey19": 236, - "gray19": 236, - "grey23": 237, - "gray23": 237, - "grey27": 238, - "gray27": 238, - "grey30": 239, - "gray30": 239, - "grey35": 240, - "gray35": 240, - "grey39": 241, - "gray39": 241, - "grey42": 242, - "gray42": 242, - "grey46": 243, - "gray46": 243, - "grey50": 244, - "gray50": 244, - "grey54": 245, - "gray54": 245, - "grey58": 246, - "gray58": 246, - "grey62": 247, - "gray62": 247, - "grey66": 248, - "gray66": 248, - "grey70": 249, - "gray70": 249, - "grey74": 250, - "gray74": 250, - "grey78": 251, - "gray78": 251, - "grey82": 252, - "gray82": 252, - "grey85": 253, - "gray85": 253, - "grey89": 254, - "gray89": 254, - "grey93": 255, - "gray93": 255, -} - - -class ColorParseError(Exception): - """The color could not be parsed.""" - - -RE_COLOR = re.compile( - r"""^ -\#([0-9a-f]{6})$| -color\(([0-9]{1,3})\)$| -rgb\(([\d\s,]+)\)$ -""", - re.VERBOSE, -) - - -@rich_repr -class Color(NamedTuple): - """Terminal color definition.""" - - name: str - """The name of the color (typically the input to Color.parse).""" - type: ColorType - """The type of the color.""" - number: Optional[int] = None - """The color number, if a standard color, or None.""" - triplet: Optional[ColorTriplet] = None - """A triplet of color components, if an RGB color.""" - - def __rich__(self) -> "Text": - """Displays the actual color if Rich printed.""" - from .style import Style - from .text import Text - - return Text.assemble( - f"", - ) - - def __rich_repr__(self) -> Result: - yield self.name - yield self.type - yield "number", self.number, None - yield "triplet", self.triplet, None - - @property - def system(self) -> ColorSystem: - """Get the native color system for this color.""" - if self.type == ColorType.DEFAULT: - return ColorSystem.STANDARD - return ColorSystem(int(self.type)) - - @property - def is_system_defined(self) -> bool: - """Check if the color is ultimately defined by the system.""" - return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR) - - @property - def is_default(self) -> bool: - """Check if the color is a default color.""" - return self.type == ColorType.DEFAULT - - def get_truecolor( - self, theme: Optional["TerminalTheme"] = None, foreground: bool = True - ) -> ColorTriplet: - """Get an equivalent color triplet for this color. - - Args: - theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None. - foreground (bool, optional): True for a foreground color, or False for background. Defaults to True. - - Returns: - ColorTriplet: A color triplet containing RGB components. - """ - - if theme is None: - theme = DEFAULT_TERMINAL_THEME - if self.type == ColorType.TRUECOLOR: - assert self.triplet is not None - return self.triplet - elif self.type == ColorType.EIGHT_BIT: - assert self.number is not None - return EIGHT_BIT_PALETTE[self.number] - elif self.type == ColorType.STANDARD: - assert self.number is not None - return theme.ansi_colors[self.number] - elif self.type == ColorType.WINDOWS: - assert self.number is not None - return WINDOWS_PALETTE[self.number] - else: # self.type == ColorType.DEFAULT: - assert self.number is None - return theme.foreground_color if foreground else theme.background_color - - @classmethod - def from_ansi(cls, number: int) -> "Color": - """Create a Color number from it's 8-bit ansi number. - - Args: - number (int): A number between 0-255 inclusive. - - Returns: - Color: A new Color instance. - """ - return cls( - name=f"color({number})", - type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), - number=number, - ) - - @classmethod - def from_triplet(cls, triplet: "ColorTriplet") -> "Color": - """Create a truecolor RGB color from a triplet of values. - - Args: - triplet (ColorTriplet): A color triplet containing red, green and blue components. - - Returns: - Color: A new color object. - """ - return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet) - - @classmethod - def from_rgb(cls, red: float, green: float, blue: float) -> "Color": - """Create a truecolor from three color components in the range(0->255). - - Args: - red (float): Red component in range 0-255. - green (float): Green component in range 0-255. - blue (float): Blue component in range 0-255. - - Returns: - Color: A new color object. - """ - return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue))) - - @classmethod - def default(cls) -> "Color": - """Get a Color instance representing the default color. - - Returns: - Color: Default color. - """ - return cls(name="default", type=ColorType.DEFAULT) - - @classmethod - @lru_cache(maxsize=1024) - def parse(cls, color: str) -> "Color": - """Parse a color definition.""" - original_color = color - color = color.lower().strip() - - if color == "default": - return cls(color, type=ColorType.DEFAULT) - - color_number = ANSI_COLOR_NAMES.get(color) - if color_number is not None: - return cls( - color, - type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT), - number=color_number, - ) - - color_match = RE_COLOR.match(color) - if color_match is None: - raise ColorParseError(f"{original_color!r} is not a valid color") - - color_24, color_8, color_rgb = color_match.groups() - if color_24: - triplet = ColorTriplet( - int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16) - ) - return cls(color, ColorType.TRUECOLOR, triplet=triplet) - - elif color_8: - number = int(color_8) - if number > 255: - raise ColorParseError(f"color number must be <= 255 in {color!r}") - return cls( - color, - type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), - number=number, - ) - - else: # color_rgb: - components = color_rgb.split(",") - if len(components) != 3: - raise ColorParseError( - f"expected three components in {original_color!r}" - ) - red, green, blue = components - triplet = ColorTriplet(int(red), int(green), int(blue)) - if not all(component <= 255 for component in triplet): - raise ColorParseError( - f"color components must be <= 255 in {original_color!r}" - ) - return cls(color, ColorType.TRUECOLOR, triplet=triplet) - - @lru_cache(maxsize=1024) - def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: - """Get the ANSI escape codes for this color.""" - _type = self.type - if _type == ColorType.DEFAULT: - return ("39" if foreground else "49",) - - elif _type == ColorType.WINDOWS: - number = self.number - assert number is not None - fore, back = (30, 40) if number < 8 else (82, 92) - return (str(fore + number if foreground else back + number),) - - elif _type == ColorType.STANDARD: - number = self.number - assert number is not None - fore, back = (30, 40) if number < 8 else (82, 92) - return (str(fore + number if foreground else back + number),) - - elif _type == ColorType.EIGHT_BIT: - assert self.number is not None - return ("38" if foreground else "48", "5", str(self.number)) - - else: # self.standard == ColorStandard.TRUECOLOR: - assert self.triplet is not None - red, green, blue = self.triplet - return ("38" if foreground else "48", "2", str(red), str(green), str(blue)) - - @lru_cache(maxsize=1024) - def downgrade(self, system: ColorSystem) -> "Color": - """Downgrade a color system to a system with fewer colors.""" - - if self.type in (ColorType.DEFAULT, system): - return self - # Convert to 8-bit color from truecolor color - if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - _h, l, s = rgb_to_hls(*self.triplet.normalized) - # If saturation is under 15% assume it is grayscale - if s < 0.15: - gray = round(l * 25.0) - if gray == 0: - color_number = 16 - elif gray == 25: - color_number = 231 - else: - color_number = 231 + gray - return Color(self.name, ColorType.EIGHT_BIT, number=color_number) - - red, green, blue = self.triplet - six_red = red / 95 if red < 95 else 1 + (red - 95) / 40 - six_green = green / 95 if green < 95 else 1 + (green - 95) / 40 - six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40 - - color_number = ( - 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue) - ) - return Color(self.name, ColorType.EIGHT_BIT, number=color_number) - - # Convert to standard from truecolor or 8-bit - elif system == ColorSystem.STANDARD: - if self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - triplet = self.triplet - else: # self.system == ColorSystem.EIGHT_BIT - assert self.number is not None - triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) - - color_number = STANDARD_PALETTE.match(triplet) - return Color(self.name, ColorType.STANDARD, number=color_number) - - elif system == ColorSystem.WINDOWS: - if self.system == ColorSystem.TRUECOLOR: - assert self.triplet is not None - triplet = self.triplet - else: # self.system == ColorSystem.EIGHT_BIT - assert self.number is not None - if self.number < 16: - return Color(self.name, ColorType.WINDOWS, number=self.number) - triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) - - color_number = WINDOWS_PALETTE.match(triplet) - return Color(self.name, ColorType.WINDOWS, number=color_number) - - return self - - -def parse_rgb_hex(hex_color: str) -> ColorTriplet: - """Parse six hex characters in to RGB triplet.""" - assert len(hex_color) == 6, "must be 6 characters" - color = ColorTriplet( - int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16) - ) - return color - - -def blend_rgb( - color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5 -) -> ColorTriplet: - """Blend one RGB color in to another.""" - r1, g1, b1 = color1 - r2, g2, b2 = color2 - new_color = ColorTriplet( - int(r1 + (r2 - r1) * cross_fade), - int(g1 + (g2 - g1) * cross_fade), - int(b1 + (b2 - b1) * cross_fade), - ) - return new_color - - -if __name__ == "__main__": # pragma: no cover - - from .console import Console - from .table import Table - from .text import Text - - console = Console() - - table = Table(show_footer=False, show_edge=True) - table.add_column("Color", width=10, overflow="ellipsis") - table.add_column("Number", justify="right", style="yellow") - table.add_column("Name", style="green") - table.add_column("Hex", style="blue") - table.add_column("RGB", style="magenta") - - colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items()) - for color_number, name in colors: - if "grey" in name: - continue - color_cell = Text(" " * 10, style=f"on {name}") - if color_number < 16: - table.add_row(color_cell, f"{color_number}", Text(f'"{name}"')) - else: - color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type] - table.add_row( - color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb - ) - - console.print(table) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py deleted file mode 100644 index 02cab32..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py +++ /dev/null @@ -1,38 +0,0 @@ -from typing import NamedTuple, Tuple - - -class ColorTriplet(NamedTuple): - """The red, green, and blue components of a color.""" - - red: int - """Red component in 0 to 255 range.""" - green: int - """Green component in 0 to 255 range.""" - blue: int - """Blue component in 0 to 255 range.""" - - @property - def hex(self) -> str: - """get the color triplet in CSS style.""" - red, green, blue = self - return f"#{red:02x}{green:02x}{blue:02x}" - - @property - def rgb(self) -> str: - """The color in RGB format. - - Returns: - str: An rgb color, e.g. ``"rgb(100,23,255)"``. - """ - red, green, blue = self - return f"rgb({red},{green},{blue})" - - @property - def normalized(self) -> Tuple[float, float, float]: - """Convert components into floats between 0 and 1. - - Returns: - Tuple[float, float, float]: A tuple of three normalized colour components. - """ - red, green, blue = self - return red / 255.0, green / 255.0, blue / 255.0 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py deleted file mode 100644 index 669a3a7..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py +++ /dev/null @@ -1,187 +0,0 @@ -from collections import defaultdict -from itertools import chain -from operator import itemgetter -from typing import Dict, Iterable, List, Optional, Tuple - -from .align import Align, AlignMethod -from .console import Console, ConsoleOptions, RenderableType, RenderResult -from .constrain import Constrain -from .measure import Measurement -from .padding import Padding, PaddingDimensions -from .table import Table -from .text import TextType -from .jupyter import JupyterMixin - - -class Columns(JupyterMixin): - """Display renderables in neat columns. - - Args: - renderables (Iterable[RenderableType]): Any number of Rich renderables (including str). - width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None. - padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1). - expand (bool, optional): Expand columns to full width. Defaults to False. - equal (bool, optional): Arrange in to equal sized columns. Defaults to False. - column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False. - right_to_left (bool, optional): Start column from right hand side. Defaults to False. - align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None. - title (TextType, optional): Optional title for Columns. - """ - - def __init__( - self, - renderables: Optional[Iterable[RenderableType]] = None, - padding: PaddingDimensions = (0, 1), - *, - width: Optional[int] = None, - expand: bool = False, - equal: bool = False, - column_first: bool = False, - right_to_left: bool = False, - align: Optional[AlignMethod] = None, - title: Optional[TextType] = None, - ) -> None: - self.renderables = list(renderables or []) - self.width = width - self.padding = padding - self.expand = expand - self.equal = equal - self.column_first = column_first - self.right_to_left = right_to_left - self.align: Optional[AlignMethod] = align - self.title = title - - def add_renderable(self, renderable: RenderableType) -> None: - """Add a renderable to the columns. - - Args: - renderable (RenderableType): Any renderable object. - """ - self.renderables.append(renderable) - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - render_str = console.render_str - renderables = [ - render_str(renderable) if isinstance(renderable, str) else renderable - for renderable in self.renderables - ] - if not renderables: - return - _top, right, _bottom, left = Padding.unpack(self.padding) - width_padding = max(left, right) - max_width = options.max_width - widths: Dict[int, int] = defaultdict(int) - column_count = len(renderables) - - get_measurement = Measurement.get - renderable_widths = [ - get_measurement(console, options, renderable).maximum - for renderable in renderables - ] - if self.equal: - renderable_widths = [max(renderable_widths)] * len(renderable_widths) - - def iter_renderables( - column_count: int, - ) -> Iterable[Tuple[int, Optional[RenderableType]]]: - item_count = len(renderables) - if self.column_first: - width_renderables = list(zip(renderable_widths, renderables)) - - column_lengths: List[int] = [item_count // column_count] * column_count - for col_no in range(item_count % column_count): - column_lengths[col_no] += 1 - - row_count = (item_count + column_count - 1) // column_count - cells = [[-1] * column_count for _ in range(row_count)] - row = col = 0 - for index in range(item_count): - cells[row][col] = index - column_lengths[col] -= 1 - if column_lengths[col]: - row += 1 - else: - col += 1 - row = 0 - for index in chain.from_iterable(cells): - if index == -1: - break - yield width_renderables[index] - else: - yield from zip(renderable_widths, renderables) - # Pad odd elements with spaces - if item_count % column_count: - for _ in range(column_count - (item_count % column_count)): - yield 0, None - - table = Table.grid(padding=self.padding, collapse_padding=True, pad_edge=False) - table.expand = self.expand - table.title = self.title - - if self.width is not None: - column_count = (max_width) // (self.width + width_padding) - for _ in range(column_count): - table.add_column(width=self.width) - else: - while column_count > 1: - widths.clear() - column_no = 0 - for renderable_width, _ in iter_renderables(column_count): - widths[column_no] = max(widths[column_no], renderable_width) - total_width = sum(widths.values()) + width_padding * ( - len(widths) - 1 - ) - if total_width > max_width: - column_count = len(widths) - 1 - break - else: - column_no = (column_no + 1) % column_count - else: - break - - get_renderable = itemgetter(1) - _renderables = [ - get_renderable(_renderable) - for _renderable in iter_renderables(column_count) - ] - if self.equal: - _renderables = [ - None - if renderable is None - else Constrain(renderable, renderable_widths[0]) - for renderable in _renderables - ] - if self.align: - align = self.align - _Align = Align - _renderables = [ - None if renderable is None else _Align(renderable, align) - for renderable in _renderables - ] - - right_to_left = self.right_to_left - add_row = table.add_row - for start in range(0, len(_renderables), column_count): - row = _renderables[start : start + column_count] - if right_to_left: - row = row[::-1] - add_row(*row) - yield table - - -if __name__ == "__main__": # pragma: no cover - import os - - console = Console() - - files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))] - columns = Columns(files, padding=(0, 1), expand=False, equal=False) - console.print(columns) - console.rule() - columns.column_first = True - console.print(columns) - columns.right_to_left = True - console.rule() - console.print(columns) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py deleted file mode 100644 index e559cbb..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py +++ /dev/null @@ -1,2633 +0,0 @@ -import inspect -import os -import platform -import sys -import threading -import zlib -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from datetime import datetime -from functools import wraps -from getpass import getpass -from html import escape -from inspect import isclass -from itertools import islice -from math import ceil -from time import monotonic -from types import FrameType, ModuleType, TracebackType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Callable, - Dict, - Iterable, - List, - Mapping, - NamedTuple, - Optional, - TextIO, - Tuple, - Type, - Union, - cast, -) - -from pip._vendor.rich._null_file import NULL_FILE - -if sys.version_info >= (3, 8): - from typing import Literal, Protocol, runtime_checkable -else: - from pip._vendor.typing_extensions import ( - Literal, - Protocol, - runtime_checkable, - ) # pragma: no cover - -from . import errors, themes -from ._emoji_replace import _emoji_replace -from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT -from ._fileno import get_fileno -from ._log_render import FormatTimeCallable, LogRender -from .align import Align, AlignMethod -from .color import ColorSystem, blend_rgb -from .control import Control -from .emoji import EmojiVariant -from .highlighter import NullHighlighter, ReprHighlighter -from .markup import render as render_markup -from .measure import Measurement, measure_renderables -from .pager import Pager, SystemPager -from .pretty import Pretty, is_expandable -from .protocol import rich_cast -from .region import Region -from .scope import render_scope -from .screen import Screen -from .segment import Segment -from .style import Style, StyleType -from .styled import Styled -from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme -from .text import Text, TextType -from .theme import Theme, ThemeStack - -if TYPE_CHECKING: - from ._windows import WindowsConsoleFeatures - from .live import Live - from .status import Status - -JUPYTER_DEFAULT_COLUMNS = 115 -JUPYTER_DEFAULT_LINES = 100 -WINDOWS = platform.system() == "Windows" - -HighlighterType = Callable[[Union[str, "Text"]], "Text"] -JustifyMethod = Literal["default", "left", "center", "right", "full"] -OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] - - -class NoChange: - pass - - -NO_CHANGE = NoChange() - -try: - _STDIN_FILENO = sys.__stdin__.fileno() -except Exception: - _STDIN_FILENO = 0 -try: - _STDOUT_FILENO = sys.__stdout__.fileno() -except Exception: - _STDOUT_FILENO = 1 -try: - _STDERR_FILENO = sys.__stderr__.fileno() -except Exception: - _STDERR_FILENO = 2 - -_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) -_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) - - -_TERM_COLORS = { - "kitty": ColorSystem.EIGHT_BIT, - "256color": ColorSystem.EIGHT_BIT, - "16color": ColorSystem.STANDARD, -} - - -class ConsoleDimensions(NamedTuple): - """Size of the terminal.""" - - width: int - """The width of the console in 'cells'.""" - height: int - """The height of the console in lines.""" - - -@dataclass -class ConsoleOptions: - """Options for __rich_console__ method.""" - - size: ConsoleDimensions - """Size of console.""" - legacy_windows: bool - """legacy_windows: flag for legacy windows.""" - min_width: int - """Minimum width of renderable.""" - max_width: int - """Maximum width of renderable.""" - is_terminal: bool - """True if the target is a terminal, otherwise False.""" - encoding: str - """Encoding of terminal.""" - max_height: int - """Height of container (starts as terminal)""" - justify: Optional[JustifyMethod] = None - """Justify value override for renderable.""" - overflow: Optional[OverflowMethod] = None - """Overflow value override for renderable.""" - no_wrap: Optional[bool] = False - """Disable wrapping for text.""" - highlight: Optional[bool] = None - """Highlight override for render_str.""" - markup: Optional[bool] = None - """Enable markup when rendering strings.""" - height: Optional[int] = None - - @property - def ascii_only(self) -> bool: - """Check if renderables should use ascii only.""" - return not self.encoding.startswith("utf") - - def copy(self) -> "ConsoleOptions": - """Return a copy of the options. - - Returns: - ConsoleOptions: a copy of self. - """ - options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions) - options.__dict__ = self.__dict__.copy() - return options - - def update( - self, - *, - width: Union[int, NoChange] = NO_CHANGE, - min_width: Union[int, NoChange] = NO_CHANGE, - max_width: Union[int, NoChange] = NO_CHANGE, - justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE, - overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE, - no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE, - highlight: Union[Optional[bool], NoChange] = NO_CHANGE, - markup: Union[Optional[bool], NoChange] = NO_CHANGE, - height: Union[Optional[int], NoChange] = NO_CHANGE, - ) -> "ConsoleOptions": - """Update values, return a copy.""" - options = self.copy() - if not isinstance(width, NoChange): - options.min_width = options.max_width = max(0, width) - if not isinstance(min_width, NoChange): - options.min_width = min_width - if not isinstance(max_width, NoChange): - options.max_width = max_width - if not isinstance(justify, NoChange): - options.justify = justify - if not isinstance(overflow, NoChange): - options.overflow = overflow - if not isinstance(no_wrap, NoChange): - options.no_wrap = no_wrap - if not isinstance(highlight, NoChange): - options.highlight = highlight - if not isinstance(markup, NoChange): - options.markup = markup - if not isinstance(height, NoChange): - if height is not None: - options.max_height = height - options.height = None if height is None else max(0, height) - return options - - def update_width(self, width: int) -> "ConsoleOptions": - """Update just the width, return a copy. - - Args: - width (int): New width (sets both min_width and max_width) - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.min_width = options.max_width = max(0, width) - return options - - def update_height(self, height: int) -> "ConsoleOptions": - """Update the height, and return a copy. - - Args: - height (int): New height - - Returns: - ~ConsoleOptions: New Console options instance. - """ - options = self.copy() - options.max_height = options.height = height - return options - - def reset_height(self) -> "ConsoleOptions": - """Return a copy of the options with height set to ``None``. - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.height = None - return options - - def update_dimensions(self, width: int, height: int) -> "ConsoleOptions": - """Update the width and height, and return a copy. - - Args: - width (int): New width (sets both min_width and max_width). - height (int): New height. - - Returns: - ~ConsoleOptions: New console options instance. - """ - options = self.copy() - options.min_width = options.max_width = max(0, width) - options.height = options.max_height = height - return options - - -@runtime_checkable -class RichCast(Protocol): - """An object that may be 'cast' to a console renderable.""" - - def __rich__( - self, - ) -> Union["ConsoleRenderable", "RichCast", str]: # pragma: no cover - ... - - -@runtime_checkable -class ConsoleRenderable(Protocol): - """An object that supports the console protocol.""" - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": # pragma: no cover - ... - - -# A type that may be rendered by Console. -RenderableType = Union[ConsoleRenderable, RichCast, str] - -# The result of calling a __rich_console__ method. -RenderResult = Iterable[Union[RenderableType, Segment]] - -_null_highlighter = NullHighlighter() - - -class CaptureError(Exception): - """An error in the Capture context manager.""" - - -class NewLine: - """A renderable to generate new line(s)""" - - def __init__(self, count: int = 1) -> None: - self.count = count - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> Iterable[Segment]: - yield Segment("\n" * self.count) - - -class ScreenUpdate: - """Render a list of lines at a given offset.""" - - def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None: - self._lines = lines - self.x = x - self.y = y - - def __rich_console__( - self, console: "Console", options: ConsoleOptions - ) -> RenderResult: - x = self.x - move_to = Control.move_to - for offset, line in enumerate(self._lines, self.y): - yield move_to(x, offset) - yield from line - - -class Capture: - """Context manager to capture the result of printing to the console. - See :meth:`~rich.console.Console.capture` for how to use. - - Args: - console (Console): A console instance to capture output. - """ - - def __init__(self, console: "Console") -> None: - self._console = console - self._result: Optional[str] = None - - def __enter__(self) -> "Capture": - self._console.begin_capture() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self._result = self._console.end_capture() - - def get(self) -> str: - """Get the result of the capture.""" - if self._result is None: - raise CaptureError( - "Capture result is not available until context manager exits." - ) - return self._result - - -class ThemeContext: - """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage.""" - - def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None: - self.console = console - self.theme = theme - self.inherit = inherit - - def __enter__(self) -> "ThemeContext": - self.console.push_theme(self.theme) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - self.console.pop_theme() - - -class PagerContext: - """A context manager that 'pages' content. See :meth:`~rich.console.Console.pager` for usage.""" - - def __init__( - self, - console: "Console", - pager: Optional[Pager] = None, - styles: bool = False, - links: bool = False, - ) -> None: - self._console = console - self.pager = SystemPager() if pager is None else pager - self.styles = styles - self.links = links - - def __enter__(self) -> "PagerContext": - self._console._enter_buffer() - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - if exc_type is None: - with self._console._lock: - buffer: List[Segment] = self._console._buffer[:] - del self._console._buffer[:] - segments: Iterable[Segment] = buffer - if not self.styles: - segments = Segment.strip_styles(segments) - elif not self.links: - segments = Segment.strip_links(segments) - content = self._console._render_buffer(segments) - self.pager.show(content) - self._console._exit_buffer() - - -class ScreenContext: - """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage.""" - - def __init__( - self, console: "Console", hide_cursor: bool, style: StyleType = "" - ) -> None: - self.console = console - self.hide_cursor = hide_cursor - self.screen = Screen(style=style) - self._changed = False - - def update( - self, *renderables: RenderableType, style: Optional[StyleType] = None - ) -> None: - """Update the screen. - - Args: - renderable (RenderableType, optional): Optional renderable to replace current renderable, - or None for no change. Defaults to None. - style: (Style, optional): Replacement style, or None for no change. Defaults to None. - """ - if renderables: - self.screen.renderable = ( - Group(*renderables) if len(renderables) > 1 else renderables[0] - ) - if style is not None: - self.screen.style = style - self.console.print(self.screen, end="") - - def __enter__(self) -> "ScreenContext": - self._changed = self.console.set_alt_screen(True) - if self._changed and self.hide_cursor: - self.console.show_cursor(False) - return self - - def __exit__( - self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], - ) -> None: - if self._changed: - self.console.set_alt_screen(False) - if self.hide_cursor: - self.console.show_cursor(True) - - -class Group: - """Takes a group of renderables and returns a renderable object that renders the group. - - Args: - renderables (Iterable[RenderableType]): An iterable of renderable objects. - fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. - """ - - def __init__(self, *renderables: "RenderableType", fit: bool = True) -> None: - self._renderables = renderables - self.fit = fit - self._render: Optional[List[RenderableType]] = None - - @property - def renderables(self) -> List["RenderableType"]: - if self._render is None: - self._render = list(self._renderables) - return self._render - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - if self.fit: - return measure_renderables(console, options, self.renderables) - else: - return Measurement(options.max_width, options.max_width) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> RenderResult: - yield from self.renderables - - -def group(fit: bool = True) -> Callable[..., Callable[..., Group]]: - """A decorator that turns an iterable of renderables in to a group. - - Args: - fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. - """ - - def decorator( - method: Callable[..., Iterable[RenderableType]] - ) -> Callable[..., Group]: - """Convert a method that returns an iterable of renderables in to a Group.""" - - @wraps(method) - def _replace(*args: Any, **kwargs: Any) -> Group: - renderables = method(*args, **kwargs) - return Group(*renderables, fit=fit) - - return _replace - - return decorator - - -def _is_jupyter() -> bool: # pragma: no cover - """Check if we're running in a Jupyter notebook.""" - try: - get_ipython # type: ignore[name-defined] - except NameError: - return False - ipython = get_ipython() # type: ignore[name-defined] - shell = ipython.__class__.__name__ - if ( - "google.colab" in str(ipython.__class__) - or os.getenv("DATABRICKS_RUNTIME_VERSION") - or shell == "ZMQInteractiveShell" - ): - return True # Jupyter notebook or qtconsole - elif shell == "TerminalInteractiveShell": - return False # Terminal running IPython - else: - return False # Other type (?) - - -COLOR_SYSTEMS = { - "standard": ColorSystem.STANDARD, - "256": ColorSystem.EIGHT_BIT, - "truecolor": ColorSystem.TRUECOLOR, - "windows": ColorSystem.WINDOWS, -} - -_COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()} - - -@dataclass -class ConsoleThreadLocals(threading.local): - """Thread local values for Console context.""" - - theme_stack: ThemeStack - buffer: List[Segment] = field(default_factory=list) - buffer_index: int = 0 - - -class RenderHook(ABC): - """Provides hooks in to the render process.""" - - @abstractmethod - def process_renderables( - self, renderables: List[ConsoleRenderable] - ) -> List[ConsoleRenderable]: - """Called with a list of objects to render. - - This method can return a new list of renderables, or modify and return the same list. - - Args: - renderables (List[ConsoleRenderable]): A number of renderable objects. - - Returns: - List[ConsoleRenderable]: A replacement list of renderables. - """ - - -_windows_console_features: Optional["WindowsConsoleFeatures"] = None - - -def get_windows_console_features() -> "WindowsConsoleFeatures": # pragma: no cover - global _windows_console_features - if _windows_console_features is not None: - return _windows_console_features - from ._windows import get_windows_console_features - - _windows_console_features = get_windows_console_features() - return _windows_console_features - - -def detect_legacy_windows() -> bool: - """Detect legacy Windows.""" - return WINDOWS and not get_windows_console_features().vt - - -class Console: - """A high level console interface. - - Args: - color_system (str, optional): The color system supported by your terminal, - either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect. - force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None. - force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None. - force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None. - soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False. - theme (Theme, optional): An optional style theme object, or ``None`` for default theme. - stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False. - file (IO, optional): A file object where the console should write to. Defaults to stdout. - quiet (bool, Optional): Boolean to suppress all output. Defaults to False. - width (int, optional): The width of the terminal. Leave as default to auto-detect width. - height (int, optional): The height of the terminal. Leave as default to auto-detect height. - style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None. - no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None. - tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8. - record (bool, optional): Boolean to enable recording of terminal output, - required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False. - markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True. - emoji (bool, optional): Enable emoji code. Defaults to True. - emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. - highlight (bool, optional): Enable automatic highlighting. Defaults to True. - log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True. - log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True. - log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ". - highlighter (HighlighterType, optional): Default highlighter. - legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``. - safe_box (bool, optional): Restrict box options that don't render on legacy Windows. - get_datetime (Callable[[], datetime], optional): Callable that gets the current time as a datetime.datetime object (used by Console.log), - or None for datetime.now. - get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic. - """ - - _environ: Mapping[str, str] = os.environ - - def __init__( - self, - *, - color_system: Optional[ - Literal["auto", "standard", "256", "truecolor", "windows"] - ] = "auto", - force_terminal: Optional[bool] = None, - force_jupyter: Optional[bool] = None, - force_interactive: Optional[bool] = None, - soft_wrap: bool = False, - theme: Optional[Theme] = None, - stderr: bool = False, - file: Optional[IO[str]] = None, - quiet: bool = False, - width: Optional[int] = None, - height: Optional[int] = None, - style: Optional[StyleType] = None, - no_color: Optional[bool] = None, - tab_size: int = 8, - record: bool = False, - markup: bool = True, - emoji: bool = True, - emoji_variant: Optional[EmojiVariant] = None, - highlight: bool = True, - log_time: bool = True, - log_path: bool = True, - log_time_format: Union[str, FormatTimeCallable] = "[%X]", - highlighter: Optional["HighlighterType"] = ReprHighlighter(), - legacy_windows: Optional[bool] = None, - safe_box: bool = True, - get_datetime: Optional[Callable[[], datetime]] = None, - get_time: Optional[Callable[[], float]] = None, - _environ: Optional[Mapping[str, str]] = None, - ): - # Copy of os.environ allows us to replace it for testing - if _environ is not None: - self._environ = _environ - - self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter - if self.is_jupyter: - if width is None: - jupyter_columns = self._environ.get("JUPYTER_COLUMNS") - if jupyter_columns is not None and jupyter_columns.isdigit(): - width = int(jupyter_columns) - else: - width = JUPYTER_DEFAULT_COLUMNS - if height is None: - jupyter_lines = self._environ.get("JUPYTER_LINES") - if jupyter_lines is not None and jupyter_lines.isdigit(): - height = int(jupyter_lines) - else: - height = JUPYTER_DEFAULT_LINES - - self.tab_size = tab_size - self.record = record - self._markup = markup - self._emoji = emoji - self._emoji_variant: Optional[EmojiVariant] = emoji_variant - self._highlight = highlight - self.legacy_windows: bool = ( - (detect_legacy_windows() and not self.is_jupyter) - if legacy_windows is None - else legacy_windows - ) - - if width is None: - columns = self._environ.get("COLUMNS") - if columns is not None and columns.isdigit(): - width = int(columns) - self.legacy_windows - if height is None: - lines = self._environ.get("LINES") - if lines is not None and lines.isdigit(): - height = int(lines) - - self.soft_wrap = soft_wrap - self._width = width - self._height = height - - self._color_system: Optional[ColorSystem] - - self._force_terminal = None - if force_terminal is not None: - self._force_terminal = force_terminal - - self._file = file - self.quiet = quiet - self.stderr = stderr - - if color_system is None: - self._color_system = None - elif color_system == "auto": - self._color_system = self._detect_color_system() - else: - self._color_system = COLOR_SYSTEMS[color_system] - - self._lock = threading.RLock() - self._log_render = LogRender( - show_time=log_time, - show_path=log_path, - time_format=log_time_format, - ) - self.highlighter: HighlighterType = highlighter or _null_highlighter - self.safe_box = safe_box - self.get_datetime = get_datetime or datetime.now - self.get_time = get_time or monotonic - self.style = style - self.no_color = ( - no_color if no_color is not None else "NO_COLOR" in self._environ - ) - self.is_interactive = ( - (self.is_terminal and not self.is_dumb_terminal) - if force_interactive is None - else force_interactive - ) - - self._record_buffer_lock = threading.RLock() - self._thread_locals = ConsoleThreadLocals( - theme_stack=ThemeStack(themes.DEFAULT if theme is None else theme) - ) - self._record_buffer: List[Segment] = [] - self._render_hooks: List[RenderHook] = [] - self._live: Optional["Live"] = None - self._is_alt_screen = False - - def __repr__(self) -> str: - return f"" - - @property - def file(self) -> IO[str]: - """Get the file object to write to.""" - file = self._file or (sys.stderr if self.stderr else sys.stdout) - file = getattr(file, "rich_proxied_file", file) - if file is None: - file = NULL_FILE - return file - - @file.setter - def file(self, new_file: IO[str]) -> None: - """Set a new file object.""" - self._file = new_file - - @property - def _buffer(self) -> List[Segment]: - """Get a thread local buffer.""" - return self._thread_locals.buffer - - @property - def _buffer_index(self) -> int: - """Get a thread local buffer.""" - return self._thread_locals.buffer_index - - @_buffer_index.setter - def _buffer_index(self, value: int) -> None: - self._thread_locals.buffer_index = value - - @property - def _theme_stack(self) -> ThemeStack: - """Get the thread local theme stack.""" - return self._thread_locals.theme_stack - - def _detect_color_system(self) -> Optional[ColorSystem]: - """Detect color system from env vars.""" - if self.is_jupyter: - return ColorSystem.TRUECOLOR - if not self.is_terminal or self.is_dumb_terminal: - return None - if WINDOWS: # pragma: no cover - if self.legacy_windows: # pragma: no cover - return ColorSystem.WINDOWS - windows_console_features = get_windows_console_features() - return ( - ColorSystem.TRUECOLOR - if windows_console_features.truecolor - else ColorSystem.EIGHT_BIT - ) - else: - color_term = self._environ.get("COLORTERM", "").strip().lower() - if color_term in ("truecolor", "24bit"): - return ColorSystem.TRUECOLOR - term = self._environ.get("TERM", "").strip().lower() - _term_name, _hyphen, colors = term.rpartition("-") - color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD) - return color_system - - def _enter_buffer(self) -> None: - """Enter in to a buffer context, and buffer all output.""" - self._buffer_index += 1 - - def _exit_buffer(self) -> None: - """Leave buffer context, and render content if required.""" - self._buffer_index -= 1 - self._check_buffer() - - def set_live(self, live: "Live") -> None: - """Set Live instance. Used by Live context manager. - - Args: - live (Live): Live instance using this Console. - - Raises: - errors.LiveError: If this Console has a Live context currently active. - """ - with self._lock: - if self._live is not None: - raise errors.LiveError("Only one live display may be active at once") - self._live = live - - def clear_live(self) -> None: - """Clear the Live instance.""" - with self._lock: - self._live = None - - def push_render_hook(self, hook: RenderHook) -> None: - """Add a new render hook to the stack. - - Args: - hook (RenderHook): Render hook instance. - """ - with self._lock: - self._render_hooks.append(hook) - - def pop_render_hook(self) -> None: - """Pop the last renderhook from the stack.""" - with self._lock: - self._render_hooks.pop() - - def __enter__(self) -> "Console": - """Own context manager to enter buffer context.""" - self._enter_buffer() - return self - - def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: - """Exit buffer context.""" - self._exit_buffer() - - def begin_capture(self) -> None: - """Begin capturing console output. Call :meth:`end_capture` to exit capture mode and return output.""" - self._enter_buffer() - - def end_capture(self) -> str: - """End capture mode and return captured string. - - Returns: - str: Console output. - """ - render_result = self._render_buffer(self._buffer) - del self._buffer[:] - self._exit_buffer() - return render_result - - def push_theme(self, theme: Theme, *, inherit: bool = True) -> None: - """Push a new theme on to the top of the stack, replacing the styles from the previous theme. - Generally speaking, you should call :meth:`~rich.console.Console.use_theme` to get a context manager, rather - than calling this method directly. - - Args: - theme (Theme): A theme instance. - inherit (bool, optional): Inherit existing styles. Defaults to True. - """ - self._theme_stack.push_theme(theme, inherit=inherit) - - def pop_theme(self) -> None: - """Remove theme from top of stack, restoring previous theme.""" - self._theme_stack.pop_theme() - - def use_theme(self, theme: Theme, *, inherit: bool = True) -> ThemeContext: - """Use a different theme for the duration of the context manager. - - Args: - theme (Theme): Theme instance to user. - inherit (bool, optional): Inherit existing console styles. Defaults to True. - - Returns: - ThemeContext: [description] - """ - return ThemeContext(self, theme, inherit) - - @property - def color_system(self) -> Optional[str]: - """Get color system string. - - Returns: - Optional[str]: "standard", "256" or "truecolor". - """ - - if self._color_system is not None: - return _COLOR_SYSTEMS_NAMES[self._color_system] - else: - return None - - @property - def encoding(self) -> str: - """Get the encoding of the console file, e.g. ``"utf-8"``. - - Returns: - str: A standard encoding string. - """ - return (getattr(self.file, "encoding", "utf-8") or "utf-8").lower() - - @property - def is_terminal(self) -> bool: - """Check if the console is writing to a terminal. - - Returns: - bool: True if the console writing to a device capable of - understanding terminal codes, otherwise False. - """ - if self._force_terminal is not None: - return self._force_terminal - - if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith( - "idlelib" - ): - # Return False for Idle which claims to be a tty but can't handle ansi codes - return False - - if self.is_jupyter: - # return False for Jupyter, which may have FORCE_COLOR set - return False - - # If FORCE_COLOR env var has any value at all, we assume a terminal. - force_color = self._environ.get("FORCE_COLOR") - if force_color is not None: - self._force_terminal = True - return True - - isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) - try: - return False if isatty is None else isatty() - except ValueError: - # in some situation (at the end of a pytest run for example) isatty() can raise - # ValueError: I/O operation on closed file - # return False because we aren't in a terminal anymore - return False - - @property - def is_dumb_terminal(self) -> bool: - """Detect dumb terminal. - - Returns: - bool: True if writing to a dumb terminal, otherwise False. - - """ - _term = self._environ.get("TERM", "") - is_dumb = _term.lower() in ("dumb", "unknown") - return self.is_terminal and is_dumb - - @property - def options(self) -> ConsoleOptions: - """Get default console options.""" - return ConsoleOptions( - max_height=self.size.height, - size=self.size, - legacy_windows=self.legacy_windows, - min_width=1, - max_width=self.width, - encoding=self.encoding, - is_terminal=self.is_terminal, - ) - - @property - def size(self) -> ConsoleDimensions: - """Get the size of the console. - - Returns: - ConsoleDimensions: A named tuple containing the dimensions. - """ - - if self._width is not None and self._height is not None: - return ConsoleDimensions(self._width - self.legacy_windows, self._height) - - if self.is_dumb_terminal: - return ConsoleDimensions(80, 25) - - width: Optional[int] = None - height: Optional[int] = None - - if WINDOWS: # pragma: no cover - try: - width, height = os.get_terminal_size() - except (AttributeError, ValueError, OSError): # Probably not a terminal - pass - else: - for file_descriptor in _STD_STREAMS: - try: - width, height = os.get_terminal_size(file_descriptor) - except (AttributeError, ValueError, OSError): - pass - else: - break - - columns = self._environ.get("COLUMNS") - if columns is not None and columns.isdigit(): - width = int(columns) - lines = self._environ.get("LINES") - if lines is not None and lines.isdigit(): - height = int(lines) - - # get_terminal_size can report 0, 0 if run from pseudo-terminal - width = width or 80 - height = height or 25 - return ConsoleDimensions( - width - self.legacy_windows if self._width is None else self._width, - height if self._height is None else self._height, - ) - - @size.setter - def size(self, new_size: Tuple[int, int]) -> None: - """Set a new size for the terminal. - - Args: - new_size (Tuple[int, int]): New width and height. - """ - width, height = new_size - self._width = width - self._height = height - - @property - def width(self) -> int: - """Get the width of the console. - - Returns: - int: The width (in characters) of the console. - """ - return self.size.width - - @width.setter - def width(self, width: int) -> None: - """Set width. - - Args: - width (int): New width. - """ - self._width = width - - @property - def height(self) -> int: - """Get the height of the console. - - Returns: - int: The height (in lines) of the console. - """ - return self.size.height - - @height.setter - def height(self, height: int) -> None: - """Set height. - - Args: - height (int): new height. - """ - self._height = height - - def bell(self) -> None: - """Play a 'bell' sound (if supported by the terminal).""" - self.control(Control.bell()) - - def capture(self) -> Capture: - """A context manager to *capture* the result of print() or log() in a string, - rather than writing it to the console. - - Example: - >>> from rich.console import Console - >>> console = Console() - >>> with console.capture() as capture: - ... console.print("[bold magenta]Hello World[/]") - >>> print(capture.get()) - - Returns: - Capture: Context manager with disables writing to the terminal. - """ - capture = Capture(self) - return capture - - def pager( - self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False - ) -> PagerContext: - """A context manager to display anything printed within a "pager". The pager application - is defined by the system and will typically support at least pressing a key to scroll. - - Args: - pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None. - styles (bool, optional): Show styles in pager. Defaults to False. - links (bool, optional): Show links in pager. Defaults to False. - - Example: - >>> from rich.console import Console - >>> from rich.__main__ import make_test_card - >>> console = Console() - >>> with console.pager(): - console.print(make_test_card()) - - Returns: - PagerContext: A context manager. - """ - return PagerContext(self, pager=pager, styles=styles, links=links) - - def line(self, count: int = 1) -> None: - """Write new line(s). - - Args: - count (int, optional): Number of new lines. Defaults to 1. - """ - - assert count >= 0, "count must be >= 0" - self.print(NewLine(count)) - - def clear(self, home: bool = True) -> None: - """Clear the screen. - - Args: - home (bool, optional): Also move the cursor to 'home' position. Defaults to True. - """ - if home: - self.control(Control.clear(), Control.home()) - else: - self.control(Control.clear()) - - def status( - self, - status: RenderableType, - *, - spinner: str = "dots", - spinner_style: StyleType = "status.spinner", - speed: float = 1.0, - refresh_per_second: float = 12.5, - ) -> "Status": - """Display a status and spinner. - - Args: - status (RenderableType): A status renderable (str or Text typically). - spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". - spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". - speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. - refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. - - Returns: - Status: A Status object that may be used as a context manager. - """ - from .status import Status - - status_renderable = Status( - status, - console=self, - spinner=spinner, - spinner_style=spinner_style, - speed=speed, - refresh_per_second=refresh_per_second, - ) - return status_renderable - - def show_cursor(self, show: bool = True) -> bool: - """Show or hide the cursor. - - Args: - show (bool, optional): Set visibility of the cursor. - """ - if self.is_terminal: - self.control(Control.show_cursor(show)) - return True - return False - - def set_alt_screen(self, enable: bool = True) -> bool: - """Enables alternative screen mode. - - Note, if you enable this mode, you should ensure that is disabled before - the application exits. See :meth:`~rich.Console.screen` for a context manager - that handles this for you. - - Args: - enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True. - - Returns: - bool: True if the control codes were written. - - """ - changed = False - if self.is_terminal and not self.legacy_windows: - self.control(Control.alt_screen(enable)) - changed = True - self._is_alt_screen = enable - return changed - - @property - def is_alt_screen(self) -> bool: - """Check if the alt screen was enabled. - - Returns: - bool: True if the alt screen was enabled, otherwise False. - """ - return self._is_alt_screen - - def set_window_title(self, title: str) -> bool: - """Set the title of the console terminal window. - - Warning: There is no means within Rich of "resetting" the window title to its - previous value, meaning the title you set will persist even after your application - exits. - - ``fish`` shell resets the window title before and after each command by default, - negating this issue. Windows Terminal and command prompt will also reset the title for you. - Most other shells and terminals, however, do not do this. - - Some terminals may require configuration changes before you can set the title. - Some terminals may not support setting the title at all. - - Other software (including the terminal itself, the shell, custom prompts, plugins, etc.) - may also set the terminal window title. This could result in whatever value you write - using this method being overwritten. - - Args: - title (str): The new title of the terminal window. - - Returns: - bool: True if the control code to change the terminal title was - written, otherwise False. Note that a return value of True - does not guarantee that the window title has actually changed, - since the feature may be unsupported/disabled in some terminals. - """ - if self.is_terminal: - self.control(Control.title(title)) - return True - return False - - def screen( - self, hide_cursor: bool = True, style: Optional[StyleType] = None - ) -> "ScreenContext": - """Context manager to enable and disable 'alternative screen' mode. - - Args: - hide_cursor (bool, optional): Also hide the cursor. Defaults to False. - style (Style, optional): Optional style for screen. Defaults to None. - - Returns: - ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit. - """ - return ScreenContext(self, hide_cursor=hide_cursor, style=style or "") - - def measure( - self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None - ) -> Measurement: - """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains - information regarding the number of characters required to print the renderable. - - Args: - renderable (RenderableType): Any renderable or string. - options (Optional[ConsoleOptions], optional): Options to use when measuring, or None - to use default options. Defaults to None. - - Returns: - Measurement: A measurement of the renderable. - """ - measurement = Measurement.get(self, options or self.options, renderable) - return measurement - - def render( - self, renderable: RenderableType, options: Optional[ConsoleOptions] = None - ) -> Iterable[Segment]: - """Render an object in to an iterable of `Segment` instances. - - This method contains the logic for rendering objects with the console protocol. - You are unlikely to need to use it directly, unless you are extending the library. - - Args: - renderable (RenderableType): An object supporting the console protocol, or - an object that may be converted to a string. - options (ConsoleOptions, optional): An options object, or None to use self.options. Defaults to None. - - Returns: - Iterable[Segment]: An iterable of segments that may be rendered. - """ - - _options = options or self.options - if _options.max_width < 1: - # No space to render anything. This prevents potential recursion errors. - return - render_iterable: RenderResult - - renderable = rich_cast(renderable) - if hasattr(renderable, "__rich_console__") and not isclass(renderable): - render_iterable = renderable.__rich_console__(self, _options) # type: ignore[union-attr] - elif isinstance(renderable, str): - text_renderable = self.render_str( - renderable, highlight=_options.highlight, markup=_options.markup - ) - render_iterable = text_renderable.__rich_console__(self, _options) - else: - raise errors.NotRenderableError( - f"Unable to render {renderable!r}; " - "A str, Segment or object with __rich_console__ method is required" - ) - - try: - iter_render = iter(render_iterable) - except TypeError: - raise errors.NotRenderableError( - f"object {render_iterable!r} is not renderable" - ) - _Segment = Segment - _options = _options.reset_height() - for render_output in iter_render: - if isinstance(render_output, _Segment): - yield render_output - else: - yield from self.render(render_output, _options) - - def render_lines( - self, - renderable: RenderableType, - options: Optional[ConsoleOptions] = None, - *, - style: Optional[Style] = None, - pad: bool = True, - new_lines: bool = False, - ) -> List[List[Segment]]: - """Render objects in to a list of lines. - - The output of render_lines is useful when further formatting of rendered console text - is required, such as the Panel class which draws a border around any renderable object. - - Args: - renderable (RenderableType): Any object renderable in the console. - options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``. - style (Style, optional): Optional style to apply to renderables. Defaults to ``None``. - pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``. - new_lines (bool, optional): Include "\n" characters at end of lines. - - Returns: - List[List[Segment]]: A list of lines, where a line is a list of Segment objects. - """ - with self._lock: - render_options = options or self.options - _rendered = self.render(renderable, render_options) - if style: - _rendered = Segment.apply_style(_rendered, style) - - render_height = render_options.height - if render_height is not None: - render_height = max(0, render_height) - - lines = list( - islice( - Segment.split_and_crop_lines( - _rendered, - render_options.max_width, - include_new_lines=new_lines, - pad=pad, - style=style, - ), - None, - render_height, - ) - ) - if render_options.height is not None: - extra_lines = render_options.height - len(lines) - if extra_lines > 0: - pad_line = [ - [Segment(" " * render_options.max_width, style), Segment("\n")] - if new_lines - else [Segment(" " * render_options.max_width, style)] - ] - lines.extend(pad_line * extra_lines) - - return lines - - def render_str( - self, - text: str, - *, - style: Union[str, Style] = "", - justify: Optional[JustifyMethod] = None, - overflow: Optional[OverflowMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - highlighter: Optional[HighlighterType] = None, - ) -> "Text": - """Convert a string to a Text instance. This is called automatically if - you print or log a string. - - Args: - text (str): Text to render. - style (Union[str, Style], optional): Style to apply to rendered text. - justify (str, optional): Justify method: "default", "left", "center", "full", or "right". Defaults to ``None``. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. - emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. - markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. - highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default. - highlighter (HighlighterType, optional): Optional highlighter to apply. - Returns: - ConsoleRenderable: Renderable object. - - """ - emoji_enabled = emoji or (emoji is None and self._emoji) - markup_enabled = markup or (markup is None and self._markup) - highlight_enabled = highlight or (highlight is None and self._highlight) - - if markup_enabled: - rich_text = render_markup( - text, - style=style, - emoji=emoji_enabled, - emoji_variant=self._emoji_variant, - ) - rich_text.justify = justify - rich_text.overflow = overflow - else: - rich_text = Text( - _emoji_replace(text, default_variant=self._emoji_variant) - if emoji_enabled - else text, - justify=justify, - overflow=overflow, - style=style, - ) - - _highlighter = (highlighter or self.highlighter) if highlight_enabled else None - if _highlighter is not None: - highlight_text = _highlighter(str(rich_text)) - highlight_text.copy_styles(rich_text) - return highlight_text - - return rich_text - - def get_style( - self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None - ) -> Style: - """Get a Style instance by its theme name or parse a definition. - - Args: - name (str): The name of a style or a style definition. - - Returns: - Style: A Style object. - - Raises: - MissingStyle: If no style could be parsed from name. - - """ - if isinstance(name, Style): - return name - - try: - style = self._theme_stack.get(name) - if style is None: - style = Style.parse(name) - return style.copy() if style.link else style - except errors.StyleSyntaxError as error: - if default is not None: - return self.get_style(default) - raise errors.MissingStyle( - f"Failed to get style {name!r}; {error}" - ) from None - - def _collect_renderables( - self, - objects: Iterable[Any], - sep: str, - end: str, - *, - justify: Optional[JustifyMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - ) -> List[ConsoleRenderable]: - """Combine a number of renderables and text into one renderable. - - Args: - objects (Iterable[Any]): Anything that Rich can render. - sep (str): String to write between print data. - end (str): String to write at end of print data. - justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. - - Returns: - List[ConsoleRenderable]: A list of things to render. - """ - renderables: List[ConsoleRenderable] = [] - _append = renderables.append - text: List[Text] = [] - append_text = text.append - - append = _append - if justify in ("left", "center", "right"): - - def align_append(renderable: RenderableType) -> None: - _append(Align(renderable, cast(AlignMethod, justify))) - - append = align_append - - _highlighter: HighlighterType = _null_highlighter - if highlight or (highlight is None and self._highlight): - _highlighter = self.highlighter - - def check_text() -> None: - if text: - sep_text = Text(sep, justify=justify, end=end) - append(sep_text.join(text)) - text.clear() - - for renderable in objects: - renderable = rich_cast(renderable) - if isinstance(renderable, str): - append_text( - self.render_str( - renderable, emoji=emoji, markup=markup, highlighter=_highlighter - ) - ) - elif isinstance(renderable, Text): - append_text(renderable) - elif isinstance(renderable, ConsoleRenderable): - check_text() - append(renderable) - elif is_expandable(renderable): - check_text() - append(Pretty(renderable, highlighter=_highlighter)) - else: - append_text(_highlighter(str(renderable))) - - check_text() - - if self.style is not None: - style = self.get_style(self.style) - renderables = [Styled(renderable, style) for renderable in renderables] - - return renderables - - def rule( - self, - title: TextType = "", - *, - characters: str = "─", - style: Union[str, Style] = "rule.line", - align: AlignMethod = "center", - ) -> None: - """Draw a line with optional centered title. - - Args: - title (str, optional): Text to render over the rule. Defaults to "". - characters (str, optional): Character(s) to form the line. Defaults to "─". - style (str, optional): Style of line. Defaults to "rule.line". - align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". - """ - from .rule import Rule - - rule = Rule(title=title, characters=characters, style=style, align=align) - self.print(rule) - - def control(self, *control: Control) -> None: - """Insert non-printing control codes. - - Args: - control_codes (str): Control codes, such as those that may move the cursor. - """ - if not self.is_dumb_terminal: - with self: - self._buffer.extend(_control.segment for _control in control) - - def out( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - highlight: Optional[bool] = None, - ) -> None: - """Output to the terminal. This is a low-level way of writing to the terminal which unlike - :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will - optionally apply highlighting and a basic style. - - Args: - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use - console default. Defaults to ``None``. - """ - raw_output: str = sep.join(str(_object) for _object in objects) - self.print( - raw_output, - style=style, - highlight=highlight, - emoji=False, - markup=False, - no_wrap=True, - overflow="ignore", - crop=False, - end=end, - ) - - def print( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - justify: Optional[JustifyMethod] = None, - overflow: Optional[OverflowMethod] = None, - no_wrap: Optional[bool] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - width: Optional[int] = None, - height: Optional[int] = None, - crop: bool = True, - soft_wrap: Optional[bool] = None, - new_line_start: bool = False, - ) -> None: - """Print to the console. - - Args: - objects (positional args): Objects to log to the terminal. - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``. - overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None. - no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to None. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to ``None``. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to ``None``. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. - width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``. - crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True. - soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for - Console default. Defaults to ``None``. - new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``. - """ - if not objects: - objects = (NewLine(),) - - if soft_wrap is None: - soft_wrap = self.soft_wrap - if soft_wrap: - if no_wrap is None: - no_wrap = True - if overflow is None: - overflow = "ignore" - crop = False - render_hooks = self._render_hooks[:] - with self: - renderables = self._collect_renderables( - objects, - sep, - end, - justify=justify, - emoji=emoji, - markup=markup, - highlight=highlight, - ) - for hook in render_hooks: - renderables = hook.process_renderables(renderables) - render_options = self.options.update( - justify=justify, - overflow=overflow, - width=min(width, self.width) if width is not None else NO_CHANGE, - height=height, - no_wrap=no_wrap, - markup=markup, - highlight=highlight, - ) - - new_segments: List[Segment] = [] - extend = new_segments.extend - render = self.render - if style is None: - for renderable in renderables: - extend(render(renderable, render_options)) - else: - for renderable in renderables: - extend( - Segment.apply_style( - render(renderable, render_options), self.get_style(style) - ) - ) - if new_line_start: - if ( - len("".join(segment.text for segment in new_segments).splitlines()) - > 1 - ): - new_segments.insert(0, Segment.line()) - if crop: - buffer_extend = self._buffer.extend - for line in Segment.split_and_crop_lines( - new_segments, self.width, pad=False - ): - buffer_extend(line) - else: - self._buffer.extend(new_segments) - - def print_json( - self, - json: Optional[str] = None, - *, - data: Any = None, - indent: Union[None, int, str] = 2, - highlight: bool = True, - skip_keys: bool = False, - ensure_ascii: bool = False, - check_circular: bool = True, - allow_nan: bool = True, - default: Optional[Callable[[Any], Any]] = None, - sort_keys: bool = False, - ) -> None: - """Pretty prints JSON. Output will be valid JSON. - - Args: - json (Optional[str]): A string containing JSON. - data (Any): If json is not supplied, then encode this data. - indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2. - highlight (bool, optional): Enable highlighting of output: Defaults to True. - skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. - ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. - check_circular (bool, optional): Check for circular references. Defaults to True. - allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. - default (Callable, optional): A callable that converts values that can not be encoded - in to something that can be JSON encoded. Defaults to None. - sort_keys (bool, optional): Sort dictionary keys. Defaults to False. - """ - from pip._vendor.rich.json import JSON - - if json is None: - json_renderable = JSON.from_data( - data, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - else: - if not isinstance(json, str): - raise TypeError( - f"json must be str. Did you mean print_json(data={json!r}) ?" - ) - json_renderable = JSON( - json, - indent=indent, - highlight=highlight, - skip_keys=skip_keys, - ensure_ascii=ensure_ascii, - check_circular=check_circular, - allow_nan=allow_nan, - default=default, - sort_keys=sort_keys, - ) - self.print(json_renderable, soft_wrap=True) - - def update_screen( - self, - renderable: RenderableType, - *, - region: Optional[Region] = None, - options: Optional[ConsoleOptions] = None, - ) -> None: - """Update the screen at a given offset. - - Args: - renderable (RenderableType): A Rich renderable. - region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None. - x (int, optional): x offset. Defaults to 0. - y (int, optional): y offset. Defaults to 0. - - Raises: - errors.NoAltScreen: If the Console isn't in alt screen mode. - - """ - if not self.is_alt_screen: - raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") - render_options = options or self.options - if region is None: - x = y = 0 - render_options = render_options.update_dimensions( - render_options.max_width, render_options.height or self.height - ) - else: - x, y, width, height = region - render_options = render_options.update_dimensions(width, height) - - lines = self.render_lines(renderable, options=render_options) - self.update_screen_lines(lines, x, y) - - def update_screen_lines( - self, lines: List[List[Segment]], x: int = 0, y: int = 0 - ) -> None: - """Update lines of the screen at a given offset. - - Args: - lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`). - x (int, optional): x offset (column no). Defaults to 0. - y (int, optional): y offset (column no). Defaults to 0. - - Raises: - errors.NoAltScreen: If the Console isn't in alt screen mode. - """ - if not self.is_alt_screen: - raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") - screen_update = ScreenUpdate(lines, x, y) - segments = self.render(screen_update) - self._buffer.extend(segments) - self._check_buffer() - - def print_exception( - self, - *, - width: Optional[int] = 100, - extra_lines: int = 3, - theme: Optional[str] = None, - word_wrap: bool = False, - show_locals: bool = False, - suppress: Iterable[Union[str, ModuleType]] = (), - max_frames: int = 100, - ) -> None: - """Prints a rich render of the last exception and traceback. - - Args: - width (Optional[int], optional): Number of characters used to render code. Defaults to 100. - extra_lines (int, optional): Additional lines of code to render. Defaults to 3. - theme (str, optional): Override pygments theme used in traceback - word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. - show_locals (bool, optional): Enable display of local variables. Defaults to False. - suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. - max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. - """ - from .traceback import Traceback - - traceback = Traceback( - width=width, - extra_lines=extra_lines, - theme=theme, - word_wrap=word_wrap, - show_locals=show_locals, - suppress=suppress, - max_frames=max_frames, - ) - self.print(traceback) - - @staticmethod - def _caller_frame_info( - offset: int, - currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe, - ) -> Tuple[str, int, Dict[str, Any]]: - """Get caller frame information. - - Args: - offset (int): the caller offset within the current frame stack. - currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to - retrieve the current frame. Defaults to ``inspect.currentframe``. - - Returns: - Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and - the dictionary of local variables associated with the caller frame. - - Raises: - RuntimeError: If the stack offset is invalid. - """ - # Ignore the frame of this local helper - offset += 1 - - frame = currentframe() - if frame is not None: - # Use the faster currentframe where implemented - while offset and frame is not None: - frame = frame.f_back - offset -= 1 - assert frame is not None - return frame.f_code.co_filename, frame.f_lineno, frame.f_locals - else: - # Fallback to the slower stack - frame_info = inspect.stack()[offset] - return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals - - def log( - self, - *objects: Any, - sep: str = " ", - end: str = "\n", - style: Optional[Union[str, Style]] = None, - justify: Optional[JustifyMethod] = None, - emoji: Optional[bool] = None, - markup: Optional[bool] = None, - highlight: Optional[bool] = None, - log_locals: bool = False, - _stack_offset: int = 1, - ) -> None: - """Log rich content to the terminal. - - Args: - objects (positional args): Objects to log to the terminal. - sep (str, optional): String to write between print data. Defaults to " ". - end (str, optional): String to write at end of print data. Defaults to "\\\\n". - style (Union[str, Style], optional): A style to apply to output. Defaults to None. - justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. - overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. - emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. - markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None. - highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None. - log_locals (bool, optional): Boolean to enable logging of locals where ``log()`` - was called. Defaults to False. - _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1. - """ - if not objects: - objects = (NewLine(),) - - render_hooks = self._render_hooks[:] - - with self: - renderables = self._collect_renderables( - objects, - sep, - end, - justify=justify, - emoji=emoji, - markup=markup, - highlight=highlight, - ) - if style is not None: - renderables = [Styled(renderable, style) for renderable in renderables] - - filename, line_no, locals = self._caller_frame_info(_stack_offset) - link_path = None if filename.startswith("<") else os.path.abspath(filename) - path = filename.rpartition(os.sep)[-1] - if log_locals: - locals_map = { - key: value - for key, value in locals.items() - if not key.startswith("__") - } - renderables.append(render_scope(locals_map, title="[i]locals")) - - renderables = [ - self._log_render( - self, - renderables, - log_time=self.get_datetime(), - path=path, - line_no=line_no, - link_path=link_path, - ) - ] - for hook in render_hooks: - renderables = hook.process_renderables(renderables) - new_segments: List[Segment] = [] - extend = new_segments.extend - render = self.render - render_options = self.options - for renderable in renderables: - extend(render(renderable, render_options)) - buffer_extend = self._buffer.extend - for line in Segment.split_and_crop_lines( - new_segments, self.width, pad=False - ): - buffer_extend(line) - - def _check_buffer(self) -> None: - """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) - Rendering is supported on Windows, Unix and Jupyter environments. For - legacy Windows consoles, the win32 API is called directly. - This method will also record what it renders if recording is enabled via Console.record. - """ - if self.quiet: - del self._buffer[:] - return - with self._lock: - if self.record: - with self._record_buffer_lock: - self._record_buffer.extend(self._buffer[:]) - - if self._buffer_index == 0: - if self.is_jupyter: # pragma: no cover - from .jupyter import display - - display(self._buffer, self._render_buffer(self._buffer[:])) - del self._buffer[:] - else: - if WINDOWS: - use_legacy_windows_render = False - if self.legacy_windows: - fileno = get_fileno(self.file) - if fileno is not None: - use_legacy_windows_render = ( - fileno in _STD_STREAMS_OUTPUT - ) - - if use_legacy_windows_render: - from pip._vendor.rich._win32_console import LegacyWindowsTerm - from pip._vendor.rich._windows_renderer import legacy_windows_render - - buffer = self._buffer[:] - if self.no_color and self._color_system: - buffer = list(Segment.remove_color(buffer)) - - legacy_windows_render(buffer, LegacyWindowsTerm(self.file)) - else: - # Either a non-std stream on legacy Windows, or modern Windows. - text = self._render_buffer(self._buffer[:]) - # https://bugs.python.org/issue37871 - # https://github.com/python/cpython/issues/82052 - # We need to avoid writing more than 32Kb in a single write, due to the above bug - write = self.file.write - # Worse case scenario, every character is 4 bytes of utf-8 - MAX_WRITE = 32 * 1024 // 4 - try: - if len(text) <= MAX_WRITE: - write(text) - else: - batch: List[str] = [] - batch_append = batch.append - size = 0 - for line in text.splitlines(True): - if size + len(line) > MAX_WRITE and batch: - write("".join(batch)) - batch.clear() - size = 0 - batch_append(line) - size += len(line) - if batch: - write("".join(batch)) - batch.clear() - except UnicodeEncodeError as error: - error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" - raise - else: - text = self._render_buffer(self._buffer[:]) - try: - self.file.write(text) - except UnicodeEncodeError as error: - error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" - raise - - self.file.flush() - del self._buffer[:] - - def _render_buffer(self, buffer: Iterable[Segment]) -> str: - """Render buffered output, and clear buffer.""" - output: List[str] = [] - append = output.append - color_system = self._color_system - legacy_windows = self.legacy_windows - not_terminal = not self.is_terminal - if self.no_color and color_system: - buffer = Segment.remove_color(buffer) - for text, style, control in buffer: - if style: - append( - style.render( - text, - color_system=color_system, - legacy_windows=legacy_windows, - ) - ) - elif not (not_terminal and control): - append(text) - - rendered = "".join(output) - return rendered - - def input( - self, - prompt: TextType = "", - *, - markup: bool = True, - emoji: bool = True, - password: bool = False, - stream: Optional[TextIO] = None, - ) -> str: - """Displays a prompt and waits for input from the user. The prompt may contain color / style. - - It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded. - - Args: - prompt (Union[str, Text]): Text to render in the prompt. - markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True. - emoji (bool, optional): Enable emoji (requires a str prompt). Defaults to True. - password: (bool, optional): Hide typed text. Defaults to False. - stream: (TextIO, optional): Optional file to read input from (rather than stdin). Defaults to None. - - Returns: - str: Text read from stdin. - """ - if prompt: - self.print(prompt, markup=markup, emoji=emoji, end="") - if password: - result = getpass("", stream=stream) - else: - if stream: - result = stream.readline() - else: - result = input() - return result - - def export_text(self, *, clear: bool = True, styles: bool = False) -> str: - """Generate text from console contents (requires record=True argument in constructor). - - Args: - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - styles (bool, optional): If ``True``, ansi escape codes will be included. ``False`` for plain text. - Defaults to ``False``. - - Returns: - str: String containing console contents. - - """ - assert ( - self.record - ), "To export console contents set record=True in the constructor or instance" - - with self._record_buffer_lock: - if styles: - text = "".join( - (style.render(text) if style else text) - for text, style, _ in self._record_buffer - ) - else: - text = "".join( - segment.text - for segment in self._record_buffer - if not segment.control - ) - if clear: - del self._record_buffer[:] - return text - - def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> None: - """Generate text from console and save to a given location (requires record=True argument in constructor). - - Args: - path (str): Path to write text files. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - styles (bool, optional): If ``True``, ansi style codes will be included. ``False`` for plain text. - Defaults to ``False``. - - """ - text = self.export_text(clear=clear, styles=styles) - with open(path, "wt", encoding="utf-8") as write_file: - write_file.write(text) - - def export_html( - self, - *, - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: Optional[str] = None, - inline_styles: bool = False, - ) -> str: - """Generate HTML from console contents (requires record=True argument in constructor). - - Args: - theme (TerminalTheme, optional): TerminalTheme object containing console colors. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML. In addition to '{foreground}', - '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. - inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files - larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. - Defaults to False. - - Returns: - str: String containing console contents as HTML. - """ - assert ( - self.record - ), "To export console contents set record=True in the constructor or instance" - fragments: List[str] = [] - append = fragments.append - _theme = theme or DEFAULT_TERMINAL_THEME - stylesheet = "" - - render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format - - with self._record_buffer_lock: - if inline_styles: - for text, style, _ in Segment.filter_control( - Segment.simplify(self._record_buffer) - ): - text = escape(text) - if style: - rule = style.get_html_style(_theme) - if style.link: - text = f'{text}' - text = f'{text}' if rule else text - append(text) - else: - styles: Dict[str, int] = {} - for text, style, _ in Segment.filter_control( - Segment.simplify(self._record_buffer) - ): - text = escape(text) - if style: - rule = style.get_html_style(_theme) - style_number = styles.setdefault(rule, len(styles) + 1) - if style.link: - text = f'{text}' - else: - text = f'{text}' - append(text) - stylesheet_rules: List[str] = [] - stylesheet_append = stylesheet_rules.append - for style_rule, style_number in styles.items(): - if style_rule: - stylesheet_append(f".r{style_number} {{{style_rule}}}") - stylesheet = "\n".join(stylesheet_rules) - - rendered_code = render_code_format.format( - code="".join(fragments), - stylesheet=stylesheet, - foreground=_theme.foreground_color.hex, - background=_theme.background_color.hex, - ) - if clear: - del self._record_buffer[:] - return rendered_code - - def save_html( - self, - path: str, - *, - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_HTML_FORMAT, - inline_styles: bool = False, - ) -> None: - """Generate HTML from console contents and write to a file (requires record=True argument in constructor). - - Args: - path (str): Path to write html file. - theme (TerminalTheme, optional): TerminalTheme object containing console colors. - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. - code_format (str, optional): Format string to render HTML. In addition to '{foreground}', - '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. - inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files - larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. - Defaults to False. - - """ - html = self.export_html( - theme=theme, - clear=clear, - code_format=code_format, - inline_styles=inline_styles, - ) - with open(path, "wt", encoding="utf-8") as write_file: - write_file.write(html) - - def export_svg( - self, - *, - title: str = "Rich", - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_SVG_FORMAT, - font_aspect_ratio: float = 0.61, - unique_id: Optional[str] = None, - ) -> str: - """ - Generate an SVG from the console contents (requires record=True in Console constructor). - - Args: - title (str, optional): The title of the tab in the output image - theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables - into the string in order to form the final SVG output. The default template used and the variables - injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. - font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` - string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). - If you aren't specifying a different font inside ``code_format``, you probably don't need this. - unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node - ids). If not set, this defaults to a computed value based on the recorded content. - """ - - from pip._vendor.rich.cells import cell_len - - style_cache: Dict[Style, str] = {} - - def get_svg_style(style: Style) -> str: - """Convert a Style to CSS rules for SVG.""" - if style in style_cache: - return style_cache[style] - css_rules = [] - color = ( - _theme.foreground_color - if (style.color is None or style.color.is_default) - else style.color.get_truecolor(_theme) - ) - bgcolor = ( - _theme.background_color - if (style.bgcolor is None or style.bgcolor.is_default) - else style.bgcolor.get_truecolor(_theme) - ) - if style.reverse: - color, bgcolor = bgcolor, color - if style.dim: - color = blend_rgb(color, bgcolor, 0.4) - css_rules.append(f"fill: {color.hex}") - if style.bold: - css_rules.append("font-weight: bold") - if style.italic: - css_rules.append("font-style: italic;") - if style.underline: - css_rules.append("text-decoration: underline;") - if style.strike: - css_rules.append("text-decoration: line-through;") - - css = ";".join(css_rules) - style_cache[style] = css - return css - - _theme = theme or SVG_EXPORT_THEME - - width = self.width - char_height = 20 - char_width = char_height * font_aspect_ratio - line_height = char_height * 1.22 - - margin_top = 1 - margin_right = 1 - margin_bottom = 1 - margin_left = 1 - - padding_top = 40 - padding_right = 8 - padding_bottom = 8 - padding_left = 8 - - padding_width = padding_left + padding_right - padding_height = padding_top + padding_bottom - margin_width = margin_left + margin_right - margin_height = margin_top + margin_bottom - - text_backgrounds: List[str] = [] - text_group: List[str] = [] - classes: Dict[str, int] = {} - style_no = 1 - - def escape_text(text: str) -> str: - """HTML escape text and replace spaces with nbsp.""" - return escape(text).replace(" ", " ") - - def make_tag( - name: str, content: Optional[str] = None, **attribs: object - ) -> str: - """Make a tag from name, content, and attributes.""" - - def stringify(value: object) -> str: - if isinstance(value, (float)): - return format(value, "g") - return str(value) - - tag_attribs = " ".join( - f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"' - for k, v in attribs.items() - ) - return ( - f"<{name} {tag_attribs}>{content}" - if content - else f"<{name} {tag_attribs}/>" - ) - - with self._record_buffer_lock: - segments = list(Segment.filter_control(self._record_buffer)) - if clear: - self._record_buffer.clear() - - if unique_id is None: - unique_id = "terminal-" + str( - zlib.adler32( - ("".join(repr(segment) for segment in segments)).encode( - "utf-8", - "ignore", - ) - + title.encode("utf-8", "ignore") - ) - ) - y = 0 - for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): - x = 0 - for text, style, _control in line: - style = style or Style() - rules = get_svg_style(style) - if rules not in classes: - classes[rules] = style_no - style_no += 1 - class_name = f"r{classes[rules]}" - - if style.reverse: - has_background = True - background = ( - _theme.foreground_color.hex - if style.color is None - else style.color.get_truecolor(_theme).hex - ) - else: - bgcolor = style.bgcolor - has_background = bgcolor is not None and not bgcolor.is_default - background = ( - _theme.background_color.hex - if style.bgcolor is None - else style.bgcolor.get_truecolor(_theme).hex - ) - - text_length = cell_len(text) - if has_background: - text_backgrounds.append( - make_tag( - "rect", - fill=background, - x=x * char_width, - y=y * line_height + 1.5, - width=char_width * text_length, - height=line_height + 0.25, - shape_rendering="crispEdges", - ) - ) - - if text != " " * len(text): - text_group.append( - make_tag( - "text", - escape_text(text), - _class=f"{unique_id}-{class_name}", - x=x * char_width, - y=y * line_height + char_height, - textLength=char_width * len(text), - clip_path=f"url(#{unique_id}-line-{y})", - ) - ) - x += cell_len(text) - - line_offsets = [line_no * line_height + 1.5 for line_no in range(y)] - lines = "\n".join( - f""" - {make_tag("rect", x=0, y=offset, width=char_width * width, height=line_height + 0.25)} - """ - for line_no, offset in enumerate(line_offsets) - ) - - styles = "\n".join( - f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items() - ) - backgrounds = "".join(text_backgrounds) - matrix = "".join(text_group) - - terminal_width = ceil(width * char_width + padding_width) - terminal_height = (y + 1) * line_height + padding_height - chrome = make_tag( - "rect", - fill=_theme.background_color.hex, - stroke="rgba(255,255,255,0.35)", - stroke_width="1", - x=margin_left, - y=margin_top, - width=terminal_width, - height=terminal_height, - rx=8, - ) - - title_color = _theme.foreground_color.hex - if title: - chrome += make_tag( - "text", - escape_text(title), - _class=f"{unique_id}-title", - fill=title_color, - text_anchor="middle", - x=terminal_width // 2, - y=margin_top + char_height + 6, - ) - chrome += f""" - - - - - - """ - - svg = code_format.format( - unique_id=unique_id, - char_width=char_width, - char_height=char_height, - line_height=line_height, - terminal_width=char_width * width - 1, - terminal_height=(y + 1) * line_height - 1, - width=terminal_width + margin_width, - height=terminal_height + margin_height, - terminal_x=margin_left + padding_left, - terminal_y=margin_top + padding_top, - styles=styles, - chrome=chrome, - backgrounds=backgrounds, - matrix=matrix, - lines=lines, - ) - return svg - - def save_svg( - self, - path: str, - *, - title: str = "Rich", - theme: Optional[TerminalTheme] = None, - clear: bool = True, - code_format: str = CONSOLE_SVG_FORMAT, - font_aspect_ratio: float = 0.61, - unique_id: Optional[str] = None, - ) -> None: - """Generate an SVG file from the console contents (requires record=True in Console constructor). - - Args: - path (str): The path to write the SVG to. - title (str, optional): The title of the tab in the output image - theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal - clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` - code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables - into the string in order to form the final SVG output. The default template used and the variables - injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. - font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` - string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). - If you aren't specifying a different font inside ``code_format``, you probably don't need this. - unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node - ids). If not set, this defaults to a computed value based on the recorded content. - """ - svg = self.export_svg( - title=title, - theme=theme, - clear=clear, - code_format=code_format, - font_aspect_ratio=font_aspect_ratio, - unique_id=unique_id, - ) - with open(path, "wt", encoding="utf-8") as write_file: - write_file.write(svg) - - -def _svg_hash(svg_main_code: str) -> str: - """Returns a unique hash for the given SVG main code. - - Args: - svg_main_code (str): The content we're going to inject in the SVG envelope. - - Returns: - str: a hash of the given content - """ - return str(zlib.adler32(svg_main_code.encode())) - - -if __name__ == "__main__": # pragma: no cover - console = Console(record=True) - - console.log( - "JSONRPC [i]request[/i]", - 5, - 1.3, - True, - False, - None, - { - "jsonrpc": "2.0", - "method": "subtract", - "params": {"minuend": 42, "subtrahend": 23}, - "id": 3, - }, - ) - - console.log("Hello, World!", "{'a': 1}", repr(console)) - - console.print( - { - "name": None, - "empty": [], - "quiz": { - "sport": { - "answered": True, - "q1": { - "question": "Which one is correct team name in NBA?", - "options": [ - "New York Bulls", - "Los Angeles Kings", - "Golden State Warriors", - "Huston Rocket", - ], - "answer": "Huston Rocket", - }, - }, - "maths": { - "answered": False, - "q1": { - "question": "5 + 7 = ?", - "options": [10, 11, 12, 13], - "answer": 12, - }, - "q2": { - "question": "12 - 8 = ?", - "options": [1, 2, 3, 4], - "answer": 4, - }, - }, - }, - } - ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py deleted file mode 100644 index 65fdf56..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Optional, TYPE_CHECKING - -from .jupyter import JupyterMixin -from .measure import Measurement - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderableType, RenderResult - - -class Constrain(JupyterMixin): - """Constrain the width of a renderable to a given number of characters. - - Args: - renderable (RenderableType): A renderable object. - width (int, optional): The maximum width (in characters) to render. Defaults to 80. - """ - - def __init__(self, renderable: "RenderableType", width: Optional[int] = 80) -> None: - self.renderable = renderable - self.width = width - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.width is None: - yield self.renderable - else: - child_options = options.update_width(min(self.width, options.max_width)) - yield from console.render(self.renderable, child_options) - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - if self.width is not None: - options = options.update_width(self.width) - measurement = Measurement.get(console, options, self.renderable) - return measurement diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py deleted file mode 100644 index e29cf36..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py +++ /dev/null @@ -1,167 +0,0 @@ -from itertools import zip_longest -from typing import ( - Iterator, - Iterable, - List, - Optional, - Union, - overload, - TypeVar, - TYPE_CHECKING, -) - -if TYPE_CHECKING: - from .console import ( - Console, - ConsoleOptions, - JustifyMethod, - OverflowMethod, - RenderResult, - RenderableType, - ) - from .text import Text - -from .cells import cell_len -from .measure import Measurement - -T = TypeVar("T") - - -class Renderables: - """A list subclass which renders its contents to the console.""" - - def __init__( - self, renderables: Optional[Iterable["RenderableType"]] = None - ) -> None: - self._renderables: List["RenderableType"] = ( - list(renderables) if renderables is not None else [] - ) - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - """Console render method to insert line-breaks.""" - yield from self._renderables - - def __rich_measure__( - self, console: "Console", options: "ConsoleOptions" - ) -> "Measurement": - dimensions = [ - Measurement.get(console, options, renderable) - for renderable in self._renderables - ] - if not dimensions: - return Measurement(1, 1) - _min = max(dimension.minimum for dimension in dimensions) - _max = max(dimension.maximum for dimension in dimensions) - return Measurement(_min, _max) - - def append(self, renderable: "RenderableType") -> None: - self._renderables.append(renderable) - - def __iter__(self) -> Iterable["RenderableType"]: - return iter(self._renderables) - - -class Lines: - """A list subclass which can render to the console.""" - - def __init__(self, lines: Iterable["Text"] = ()) -> None: - self._lines: List["Text"] = list(lines) - - def __repr__(self) -> str: - return f"Lines({self._lines!r})" - - def __iter__(self) -> Iterator["Text"]: - return iter(self._lines) - - @overload - def __getitem__(self, index: int) -> "Text": - ... - - @overload - def __getitem__(self, index: slice) -> List["Text"]: - ... - - def __getitem__(self, index: Union[slice, int]) -> Union["Text", List["Text"]]: - return self._lines[index] - - def __setitem__(self, index: int, value: "Text") -> "Lines": - self._lines[index] = value - return self - - def __len__(self) -> int: - return self._lines.__len__() - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - """Console render method to insert line-breaks.""" - yield from self._lines - - def append(self, line: "Text") -> None: - self._lines.append(line) - - def extend(self, lines: Iterable["Text"]) -> None: - self._lines.extend(lines) - - def pop(self, index: int = -1) -> "Text": - return self._lines.pop(index) - - def justify( - self, - console: "Console", - width: int, - justify: "JustifyMethod" = "left", - overflow: "OverflowMethod" = "fold", - ) -> None: - """Justify and overflow text to a given width. - - Args: - console (Console): Console instance. - width (int): Number of characters per line. - justify (str, optional): Default justify method for text: "left", "center", "full" or "right". Defaults to "left". - overflow (str, optional): Default overflow for text: "crop", "fold", or "ellipsis". Defaults to "fold". - - """ - from .text import Text - - if justify == "left": - for line in self._lines: - line.truncate(width, overflow=overflow, pad=True) - elif justify == "center": - for line in self._lines: - line.rstrip() - line.truncate(width, overflow=overflow) - line.pad_left((width - cell_len(line.plain)) // 2) - line.pad_right(width - cell_len(line.plain)) - elif justify == "right": - for line in self._lines: - line.rstrip() - line.truncate(width, overflow=overflow) - line.pad_left(width - cell_len(line.plain)) - elif justify == "full": - for line_index, line in enumerate(self._lines): - if line_index == len(self._lines) - 1: - break - words = line.split(" ") - words_size = sum(cell_len(word.plain) for word in words) - num_spaces = len(words) - 1 - spaces = [1 for _ in range(num_spaces)] - index = 0 - if spaces: - while words_size + num_spaces < width: - spaces[len(spaces) - index - 1] += 1 - num_spaces += 1 - index = (index + 1) % len(spaces) - tokens: List[Text] = [] - for index, (word, next_word) in enumerate( - zip_longest(words, words[1:]) - ): - tokens.append(word) - if index < len(spaces): - style = word.get_style_at_offset(console, -1) - next_style = next_word.get_style_at_offset(console, 0) - space_style = style if style == next_style else line.style - tokens.append(Text(" " * spaces[index], style=space_style)) - self[line_index] = Text("").join(tokens) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py deleted file mode 100644 index 88fcb92..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py +++ /dev/null @@ -1,225 +0,0 @@ -import sys -import time -from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union - -if sys.version_info >= (3, 8): - from typing import Final -else: - from pip._vendor.typing_extensions import Final # pragma: no cover - -from .segment import ControlCode, ControlType, Segment - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - -STRIP_CONTROL_CODES: Final = [ - 7, # Bell - 8, # Backspace - 11, # Vertical tab - 12, # Form feed - 13, # Carriage return -] -_CONTROL_STRIP_TRANSLATE: Final = { - _codepoint: None for _codepoint in STRIP_CONTROL_CODES -} - -CONTROL_ESCAPE: Final = { - 7: "\\a", - 8: "\\b", - 11: "\\v", - 12: "\\f", - 13: "\\r", -} - -CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = { - ControlType.BELL: lambda: "\x07", - ControlType.CARRIAGE_RETURN: lambda: "\r", - ControlType.HOME: lambda: "\x1b[H", - ControlType.CLEAR: lambda: "\x1b[2J", - ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h", - ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l", - ControlType.SHOW_CURSOR: lambda: "\x1b[?25h", - ControlType.HIDE_CURSOR: lambda: "\x1b[?25l", - ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A", - ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B", - ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C", - ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D", - ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G", - ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K", - ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H", - ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07", -} - - -class Control: - """A renderable that inserts a control code (non printable but may move cursor). - - Args: - *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a - tuple of ControlType and an integer parameter - """ - - __slots__ = ["segment"] - - def __init__(self, *codes: Union[ControlType, ControlCode]) -> None: - control_codes: List[ControlCode] = [ - (code,) if isinstance(code, ControlType) else code for code in codes - ] - _format_map = CONTROL_CODES_FORMAT - rendered_codes = "".join( - _format_map[code](*parameters) for code, *parameters in control_codes - ) - self.segment = Segment(rendered_codes, None, control_codes) - - @classmethod - def bell(cls) -> "Control": - """Ring the 'bell'.""" - return cls(ControlType.BELL) - - @classmethod - def home(cls) -> "Control": - """Move cursor to 'home' position.""" - return cls(ControlType.HOME) - - @classmethod - def move(cls, x: int = 0, y: int = 0) -> "Control": - """Move cursor relative to current position. - - Args: - x (int): X offset. - y (int): Y offset. - - Returns: - ~Control: Control object. - - """ - - def get_codes() -> Iterable[ControlCode]: - control = ControlType - if x: - yield ( - control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD, - abs(x), - ) - if y: - yield ( - control.CURSOR_DOWN if y > 0 else control.CURSOR_UP, - abs(y), - ) - - control = cls(*get_codes()) - return control - - @classmethod - def move_to_column(cls, x: int, y: int = 0) -> "Control": - """Move to the given column, optionally add offset to row. - - Returns: - x (int): absolute x (column) - y (int): optional y offset (row) - - Returns: - ~Control: Control object. - """ - - return ( - cls( - (ControlType.CURSOR_MOVE_TO_COLUMN, x), - ( - ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP, - abs(y), - ), - ) - if y - else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x)) - ) - - @classmethod - def move_to(cls, x: int, y: int) -> "Control": - """Move cursor to absolute position. - - Args: - x (int): x offset (column) - y (int): y offset (row) - - Returns: - ~Control: Control object. - """ - return cls((ControlType.CURSOR_MOVE_TO, x, y)) - - @classmethod - def clear(cls) -> "Control": - """Clear the screen.""" - return cls(ControlType.CLEAR) - - @classmethod - def show_cursor(cls, show: bool) -> "Control": - """Show or hide the cursor.""" - return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR) - - @classmethod - def alt_screen(cls, enable: bool) -> "Control": - """Enable or disable alt screen.""" - if enable: - return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME) - else: - return cls(ControlType.DISABLE_ALT_SCREEN) - - @classmethod - def title(cls, title: str) -> "Control": - """Set the terminal window title - - Args: - title (str): The new terminal window title - """ - return cls((ControlType.SET_WINDOW_TITLE, title)) - - def __str__(self) -> str: - return self.segment.text - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - if self.segment.text: - yield self.segment - - -def strip_control_codes( - text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE -) -> str: - """Remove control codes from text. - - Args: - text (str): A string possibly contain control codes. - - Returns: - str: String with control codes removed. - """ - return text.translate(_translate_table) - - -def escape_control_codes( - text: str, - _translate_table: Dict[int, str] = CONTROL_ESCAPE, -) -> str: - """Replace control codes with their "escaped" equivalent in the given text. - (e.g. "\b" becomes "\\b") - - Args: - text (str): A string possibly containing control codes. - - Returns: - str: String with control codes replaced with their escaped version. - """ - return text.translate(_translate_table) - - -if __name__ == "__main__": # pragma: no cover - from pip._vendor.rich.console import Console - - console = Console() - console.print("Look at the title of your terminal window ^") - # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!"))) - for i in range(10): - console.set_window_title("🚀 Loading" + "." * i) - time.sleep(0.5) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py deleted file mode 100644 index dca3719..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py +++ /dev/null @@ -1,190 +0,0 @@ -from typing import Dict - -from .style import Style - -DEFAULT_STYLES: Dict[str, Style] = { - "none": Style.null(), - "reset": Style( - color="default", - bgcolor="default", - dim=False, - bold=False, - italic=False, - underline=False, - blink=False, - blink2=False, - reverse=False, - conceal=False, - strike=False, - ), - "dim": Style(dim=True), - "bright": Style(dim=False), - "bold": Style(bold=True), - "strong": Style(bold=True), - "code": Style(reverse=True, bold=True), - "italic": Style(italic=True), - "emphasize": Style(italic=True), - "underline": Style(underline=True), - "blink": Style(blink=True), - "blink2": Style(blink2=True), - "reverse": Style(reverse=True), - "strike": Style(strike=True), - "black": Style(color="black"), - "red": Style(color="red"), - "green": Style(color="green"), - "yellow": Style(color="yellow"), - "magenta": Style(color="magenta"), - "cyan": Style(color="cyan"), - "white": Style(color="white"), - "inspect.attr": Style(color="yellow", italic=True), - "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True), - "inspect.callable": Style(bold=True, color="red"), - "inspect.async_def": Style(italic=True, color="bright_cyan"), - "inspect.def": Style(italic=True, color="bright_cyan"), - "inspect.class": Style(italic=True, color="bright_cyan"), - "inspect.error": Style(bold=True, color="red"), - "inspect.equals": Style(), - "inspect.help": Style(color="cyan"), - "inspect.doc": Style(dim=True), - "inspect.value.border": Style(color="green"), - "live.ellipsis": Style(bold=True, color="red"), - "layout.tree.row": Style(dim=False, color="red"), - "layout.tree.column": Style(dim=False, color="blue"), - "logging.keyword": Style(bold=True, color="yellow"), - "logging.level.notset": Style(dim=True), - "logging.level.debug": Style(color="green"), - "logging.level.info": Style(color="blue"), - "logging.level.warning": Style(color="red"), - "logging.level.error": Style(color="red", bold=True), - "logging.level.critical": Style(color="red", bold=True, reverse=True), - "log.level": Style.null(), - "log.time": Style(color="cyan", dim=True), - "log.message": Style.null(), - "log.path": Style(dim=True), - "repr.ellipsis": Style(color="yellow"), - "repr.indent": Style(color="green", dim=True), - "repr.error": Style(color="red", bold=True), - "repr.str": Style(color="green", italic=False, bold=False), - "repr.brace": Style(bold=True), - "repr.comma": Style(bold=True), - "repr.ipv4": Style(bold=True, color="bright_green"), - "repr.ipv6": Style(bold=True, color="bright_green"), - "repr.eui48": Style(bold=True, color="bright_green"), - "repr.eui64": Style(bold=True, color="bright_green"), - "repr.tag_start": Style(bold=True), - "repr.tag_name": Style(color="bright_magenta", bold=True), - "repr.tag_contents": Style(color="default"), - "repr.tag_end": Style(bold=True), - "repr.attrib_name": Style(color="yellow", italic=False), - "repr.attrib_equal": Style(bold=True), - "repr.attrib_value": Style(color="magenta", italic=False), - "repr.number": Style(color="cyan", bold=True, italic=False), - "repr.number_complex": Style(color="cyan", bold=True, italic=False), # same - "repr.bool_true": Style(color="bright_green", italic=True), - "repr.bool_false": Style(color="bright_red", italic=True), - "repr.none": Style(color="magenta", italic=True), - "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False), - "repr.uuid": Style(color="bright_yellow", bold=False), - "repr.call": Style(color="magenta", bold=True), - "repr.path": Style(color="magenta"), - "repr.filename": Style(color="bright_magenta"), - "rule.line": Style(color="bright_green"), - "rule.text": Style.null(), - "json.brace": Style(bold=True), - "json.bool_true": Style(color="bright_green", italic=True), - "json.bool_false": Style(color="bright_red", italic=True), - "json.null": Style(color="magenta", italic=True), - "json.number": Style(color="cyan", bold=True, italic=False), - "json.str": Style(color="green", italic=False, bold=False), - "json.key": Style(color="blue", bold=True), - "prompt": Style.null(), - "prompt.choices": Style(color="magenta", bold=True), - "prompt.default": Style(color="cyan", bold=True), - "prompt.invalid": Style(color="red"), - "prompt.invalid.choice": Style(color="red"), - "pretty": Style.null(), - "scope.border": Style(color="blue"), - "scope.key": Style(color="yellow", italic=True), - "scope.key.special": Style(color="yellow", italic=True, dim=True), - "scope.equals": Style(color="red"), - "table.header": Style(bold=True), - "table.footer": Style(bold=True), - "table.cell": Style.null(), - "table.title": Style(italic=True), - "table.caption": Style(italic=True, dim=True), - "traceback.error": Style(color="red", italic=True), - "traceback.border.syntax_error": Style(color="bright_red"), - "traceback.border": Style(color="red"), - "traceback.text": Style.null(), - "traceback.title": Style(color="red", bold=True), - "traceback.exc_type": Style(color="bright_red", bold=True), - "traceback.exc_value": Style.null(), - "traceback.offset": Style(color="bright_red", bold=True), - "bar.back": Style(color="grey23"), - "bar.complete": Style(color="rgb(249,38,114)"), - "bar.finished": Style(color="rgb(114,156,31)"), - "bar.pulse": Style(color="rgb(249,38,114)"), - "progress.description": Style.null(), - "progress.filesize": Style(color="green"), - "progress.filesize.total": Style(color="green"), - "progress.download": Style(color="green"), - "progress.elapsed": Style(color="yellow"), - "progress.percentage": Style(color="magenta"), - "progress.remaining": Style(color="cyan"), - "progress.data.speed": Style(color="red"), - "progress.spinner": Style(color="green"), - "status.spinner": Style(color="green"), - "tree": Style(), - "tree.line": Style(), - "markdown.paragraph": Style(), - "markdown.text": Style(), - "markdown.em": Style(italic=True), - "markdown.emph": Style(italic=True), # For commonmark backwards compatibility - "markdown.strong": Style(bold=True), - "markdown.code": Style(bold=True, color="cyan", bgcolor="black"), - "markdown.code_block": Style(color="cyan", bgcolor="black"), - "markdown.block_quote": Style(color="magenta"), - "markdown.list": Style(color="cyan"), - "markdown.item": Style(), - "markdown.item.bullet": Style(color="yellow", bold=True), - "markdown.item.number": Style(color="yellow", bold=True), - "markdown.hr": Style(color="yellow"), - "markdown.h1.border": Style(), - "markdown.h1": Style(bold=True), - "markdown.h2": Style(bold=True, underline=True), - "markdown.h3": Style(bold=True), - "markdown.h4": Style(bold=True, dim=True), - "markdown.h5": Style(underline=True), - "markdown.h6": Style(italic=True), - "markdown.h7": Style(italic=True, dim=True), - "markdown.link": Style(color="bright_blue"), - "markdown.link_url": Style(color="blue", underline=True), - "markdown.s": Style(strike=True), - "iso8601.date": Style(color="blue"), - "iso8601.time": Style(color="magenta"), - "iso8601.timezone": Style(color="yellow"), -} - - -if __name__ == "__main__": # pragma: no cover - import argparse - import io - - from pip._vendor.rich.console import Console - from pip._vendor.rich.table import Table - from pip._vendor.rich.text import Text - - parser = argparse.ArgumentParser() - parser.add_argument("--html", action="store_true", help="Export as HTML table") - args = parser.parse_args() - html: bool = args.html - console = Console(record=True, width=70, file=io.StringIO()) if html else Console() - - table = Table("Name", "Styling") - - for style_name, style in DEFAULT_STYLES.items(): - table.add_row(Text(style_name, style=style), str(style)) - - console.print(table) - if html: - print(console.export_html(inline_styles=True)) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py deleted file mode 100644 index ad36183..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py +++ /dev/null @@ -1,37 +0,0 @@ -import os -import platform - -from pip._vendor.rich import inspect -from pip._vendor.rich.console import Console, get_windows_console_features -from pip._vendor.rich.panel import Panel -from pip._vendor.rich.pretty import Pretty - - -def report() -> None: # pragma: no cover - """Print a report to the terminal with debugging information""" - console = Console() - inspect(console) - features = get_windows_console_features() - inspect(features) - - env_names = ( - "TERM", - "COLORTERM", - "CLICOLOR", - "NO_COLOR", - "TERM_PROGRAM", - "COLUMNS", - "LINES", - "JUPYTER_COLUMNS", - "JUPYTER_LINES", - "JPY_PARENT_PID", - "VSCODE_VERBOSE_LOGGING", - ) - env = {name: os.getenv(name) for name in env_names} - console.print(Panel.fit((Pretty(env)), title="[b]Environment Variables")) - - console.print(f'platform="{platform.system()}"') - - -if __name__ == "__main__": # pragma: no cover - report() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py deleted file mode 100644 index 791f046..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py +++ /dev/null @@ -1,96 +0,0 @@ -import sys -from typing import TYPE_CHECKING, Optional, Union - -from .jupyter import JupyterMixin -from .segment import Segment -from .style import Style -from ._emoji_codes import EMOJI -from ._emoji_replace import _emoji_replace - -if sys.version_info >= (3, 8): - from typing import Literal -else: - from pip._vendor.typing_extensions import Literal # pragma: no cover - - -if TYPE_CHECKING: - from .console import Console, ConsoleOptions, RenderResult - - -EmojiVariant = Literal["emoji", "text"] - - -class NoEmoji(Exception): - """No emoji by that name.""" - - -class Emoji(JupyterMixin): - __slots__ = ["name", "style", "_char", "variant"] - - VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"} - - def __init__( - self, - name: str, - style: Union[str, Style] = "none", - variant: Optional[EmojiVariant] = None, - ) -> None: - """A single emoji character. - - Args: - name (str): Name of emoji. - style (Union[str, Style], optional): Optional style. Defaults to None. - - Raises: - NoEmoji: If the emoji doesn't exist. - """ - self.name = name - self.style = style - self.variant = variant - try: - self._char = EMOJI[name] - except KeyError: - raise NoEmoji(f"No emoji called {name!r}") - if variant is not None: - self._char += self.VARIANTS.get(variant, "") - - @classmethod - def replace(cls, text: str) -> str: - """Replace emoji markup with corresponding unicode characters. - - Args: - text (str): A string with emojis codes, e.g. "Hello :smiley:!" - - Returns: - str: A string with emoji codes replaces with actual emoji. - """ - return _emoji_replace(text) - - def __repr__(self) -> str: - return f"" - - def __str__(self) -> str: - return self._char - - def __rich_console__( - self, console: "Console", options: "ConsoleOptions" - ) -> "RenderResult": - yield Segment(self._char, console.get_style(self.style)) - - -if __name__ == "__main__": # pragma: no cover - import sys - - from pip._vendor.rich.columns import Columns - from pip._vendor.rich.console import Console - - console = Console(record=True) - - columns = Columns( - (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name), - column_first=True, - ) - - console.print(columns) - if len(sys.argv) > 1: - console.save_html(sys.argv[1]) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py deleted file mode 100644 index 0bcbe53..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py +++ /dev/null @@ -1,34 +0,0 @@ -class ConsoleError(Exception): - """An error in console operation.""" - - -class StyleError(Exception): - """An error in styles.""" - - -class StyleSyntaxError(ConsoleError): - """Style was badly formatted.""" - - -class MissingStyle(StyleError): - """No such style.""" - - -class StyleStackError(ConsoleError): - """Style stack is invalid.""" - - -class NotRenderableError(ConsoleError): - """Object is not renderable.""" - - -class MarkupError(ConsoleError): - """Markup was badly formatted.""" - - -class LiveError(ConsoleError): - """Error related to Live display.""" - - -class NoAltScreen(ConsoleError): - """Alt screen mode was required.""" diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py deleted file mode 100644 index 4b0b0da..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py +++ /dev/null @@ -1,57 +0,0 @@ -import io -from typing import IO, TYPE_CHECKING, Any, List - -from .ansi import AnsiDecoder -from .text import Text - -if TYPE_CHECKING: - from .console import Console - - -class FileProxy(io.TextIOBase): - """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" - - def __init__(self, console: "Console", file: IO[str]) -> None: - self.__console = console - self.__file = file - self.__buffer: List[str] = [] - self.__ansi_decoder = AnsiDecoder() - - @property - def rich_proxied_file(self) -> IO[str]: - """Get proxied file.""" - return self.__file - - def __getattr__(self, name: str) -> Any: - return getattr(self.__file, name) - - def write(self, text: str) -> int: - if not isinstance(text, str): - raise TypeError(f"write() argument must be str, not {type(text).__name__}") - buffer = self.__buffer - lines: List[str] = [] - while text: - line, new_line, text = text.partition("\n") - if new_line: - lines.append("".join(buffer) + line) - buffer.clear() - else: - buffer.append(line) - break - if lines: - console = self.__console - with console: - output = Text("\n").join( - self.__ansi_decoder.decode_line(line) for line in lines - ) - console.print(output) - return len(text) - - def flush(self) -> None: - output = "".join(self.__buffer) - if output: - self.__console.print(output) - del self.__buffer[:] - - def fileno(self) -> int: - return self.__file.fileno() diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py deleted file mode 100644 index 99f118e..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py +++ /dev/null @@ -1,89 +0,0 @@ -# coding: utf-8 -"""Functions for reporting filesizes. Borrowed from https://github.com/PyFilesystem/pyfilesystem2 - -The functions declared in this module should cover the different -use cases needed to generate a string representation of a file size -using several different units. Since there are many standards regarding -file size units, three different functions have been implemented. - -See Also: - * `Wikipedia: Binary prefix `_ - -""" - -__all__ = ["decimal"] - -from typing import Iterable, List, Optional, Tuple - - -def _to_str( - size: int, - suffixes: Iterable[str], - base: int, - *, - precision: Optional[int] = 1, - separator: Optional[str] = " ", -) -> str: - if size == 1: - return "1 byte" - elif size < base: - return "{:,} bytes".format(size) - - for i, suffix in enumerate(suffixes, 2): # noqa: B007 - unit = base**i - if size < unit: - break - return "{:,.{precision}f}{separator}{}".format( - (base * size / unit), - suffix, - precision=precision, - separator=separator, - ) - - -def pick_unit_and_suffix(size: int, suffixes: List[str], base: int) -> Tuple[int, str]: - """Pick a suffix and base for the given size.""" - for i, suffix in enumerate(suffixes): - unit = base**i - if size < unit * base: - break - return unit, suffix - - -def decimal( - size: int, - *, - precision: Optional[int] = 1, - separator: Optional[str] = " ", -) -> str: - """Convert a filesize in to a string (powers of 1000, SI prefixes). - - In this convention, ``1000 B = 1 kB``. - - This is typically the format used to advertise the storage - capacity of USB flash drives and the like (*256 MB* meaning - actually a storage capacity of more than *256 000 000 B*), - or used by **Mac OS X** since v10.6 to report file sizes. - - Arguments: - int (size): A file size. - int (precision): The number of decimal places to include (default = 1). - str (separator): The string to separate the value from the units (default = " "). - - Returns: - `str`: A string containing a abbreviated file size and units. - - Example: - >>> filesize.decimal(30000) - '30.0 kB' - >>> filesize.decimal(30000, precision=2, separator="") - '30.00kB' - - """ - return _to_str( - size, - ("kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"), - 1000, - precision=precision, - separator=separator, - ) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py deleted file mode 100644 index c264679..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py +++ /dev/null @@ -1,232 +0,0 @@ -import re -from abc import ABC, abstractmethod -from typing import List, Union - -from .text import Span, Text - - -def _combine_regex(*regexes: str) -> str: - """Combine a number of regexes in to a single regex. - - Returns: - str: New regex with all regexes ORed together. - """ - return "|".join(regexes) - - -class Highlighter(ABC): - """Abstract base class for highlighters.""" - - def __call__(self, text: Union[str, Text]) -> Text: - """Highlight a str or Text instance. - - Args: - text (Union[str, ~Text]): Text to highlight. - - Raises: - TypeError: If not called with text or str. - - Returns: - Text: A test instance with highlighting applied. - """ - if isinstance(text, str): - highlight_text = Text(text) - elif isinstance(text, Text): - highlight_text = text.copy() - else: - raise TypeError(f"str or Text instance required, not {text!r}") - self.highlight(highlight_text) - return highlight_text - - @abstractmethod - def highlight(self, text: Text) -> None: - """Apply highlighting in place to text. - - Args: - text (~Text): A text object highlight. - """ - - -class NullHighlighter(Highlighter): - """A highlighter object that doesn't highlight. - - May be used to disable highlighting entirely. - - """ - - def highlight(self, text: Text) -> None: - """Nothing to do""" - - -class RegexHighlighter(Highlighter): - """Applies highlighting from a list of regular expressions.""" - - highlights: List[str] = [] - base_style: str = "" - - def highlight(self, text: Text) -> None: - """Highlight :class:`rich.text.Text` using regular expressions. - - Args: - text (~Text): Text to highlighted. - - """ - - highlight_regex = text.highlight_regex - for re_highlight in self.highlights: - highlight_regex(re_highlight, style_prefix=self.base_style) - - -class ReprHighlighter(RegexHighlighter): - """Highlights the text typically produced from ``__repr__`` methods.""" - - base_style = "repr." - highlights = [ - r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*)(?P>)", - r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?', - r"(?P[][{}()])", - _combine_regex( - r"(?P[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", - r"(?P([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})", - r"(?P(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})", - r"(?P(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})", - r"(?P[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})", - r"(?P[\w.]*?)\(", - r"\b(?PTrue)\b|\b(?PFalse)\b|\b(?PNone)\b", - r"(?P\.\.\.)", - r"(?P(?(?\B(/[-\w._+]+)*\/)(?P[-\w._+]*)?", - r"(?b?'''.*?(?(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)", - ), - ] - - -class JSONHighlighter(RegexHighlighter): - """Highlights JSON""" - - # Captures the start and end of JSON strings, handling escaped quotes - JSON_STR = r"(?b?\".*?(?[\{\[\(\)\]\}])", - r"\b(?Ptrue)\b|\b(?Pfalse)\b|\b(?Pnull)\b", - r"(?P(? None: - super().highlight(text) - - # Additional work to handle highlighting JSON keys - plain = text.plain - append = text.spans.append - whitespace = self.JSON_WHITESPACE - for match in re.finditer(self.JSON_STR, plain): - start, end = match.span() - cursor = end - while cursor < len(plain): - char = plain[cursor] - cursor += 1 - if char == ":": - append(Span(start, end, "json.key")) - elif char in whitespace: - continue - break - - -class ISO8601Highlighter(RegexHighlighter): - """Highlights the ISO8601 date time strings. - Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html - """ - - base_style = "iso8601." - highlights = [ - # - # Dates - # - # Calendar month (e.g. 2008-08). The hyphen is required - r"^(?P[0-9]{4})-(?P1[0-2]|0[1-9])$", - # Calendar date w/o hyphens (e.g. 20080830) - r"^(?P(?P[0-9]{4})(?P1[0-2]|0[1-9])(?P3[01]|0[1-9]|[12][0-9]))$", - # Ordinal date (e.g. 2008-243). The hyphen is optional - r"^(?P(?P[0-9]{4})-?(?P36[0-6]|3[0-5][0-9]|[12][0-9]{2}|0[1-9][0-9]|00[1-9]))$", - # - # Weeks - # - # Week of the year (e.g., 2008-W35). The hyphen is optional - r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9]))$", - # Week date (e.g., 2008-W35-6). The hyphens are optional - r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9])-?(?P[1-7]))$", - # - # Times - # - # Hours and minutes (e.g., 17:21). The colon is optional - r"^(?P

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 IW#!`j518x{cK`qY diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/text.cpython-312.pyc deleted file mode 100644 index 84518479a6b896b8c1606ac1738e19d5d04a0f3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58960 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 Qi_IU(_bezx-oP*Af52RswEzGB diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-312.pyc deleted file mode 100644 index 738280f127e71d66e5e849d7059fe233e87f3432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-312.pyc deleted file mode 100644 index 7b8f92f717cd44597f326f667c7a40488183feaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11436 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 diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py deleted file mode 100644 index 36286df..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py +++ /dev/null @@ -1,451 +0,0 @@ -# Auto generated by make_terminal_widths.py - -CELL_WIDTHS = [ - (0, 0, 0), - (1, 31, -1), - (127, 159, -1), - (768, 879, 0), - (1155, 1161, 0), - (1425, 1469, 0), - (1471, 1471, 0), - (1473, 1474, 0), - (1476, 1477, 0), - (1479, 1479, 0), - (1552, 1562, 0), - (1611, 1631, 0), - (1648, 1648, 0), - (1750, 1756, 0), - (1759, 1764, 0), - (1767, 1768, 0), - (1770, 1773, 0), - (1809, 1809, 0), - (1840, 1866, 0), - (1958, 1968, 0), - (2027, 2035, 0), - (2045, 2045, 0), - (2070, 2073, 0), - (2075, 2083, 0), - (2085, 2087, 0), - (2089, 2093, 0), - (2137, 2139, 0), - (2259, 2273, 0), - (2275, 2306, 0), - (2362, 2362, 0), - (2364, 2364, 0), - (2369, 2376, 0), - (2381, 2381, 0), - (2385, 2391, 0), - (2402, 2403, 0), - (2433, 2433, 0), - (2492, 2492, 0), - (2497, 2500, 0), - (2509, 2509, 0), - (2530, 2531, 0), - (2558, 2558, 0), - (2561, 2562, 0), - (2620, 2620, 0), - (2625, 2626, 0), - (2631, 2632, 0), - (2635, 2637, 0), - (2641, 2641, 0), - (2672, 2673, 0), - (2677, 2677, 0), - (2689, 2690, 0), - (2748, 2748, 0), - (2753, 2757, 0), - (2759, 2760, 0), - (2765, 2765, 0), - (2786, 2787, 0), - (2810, 2815, 0), - (2817, 2817, 0), - (2876, 2876, 0), - (2879, 2879, 0), - (2881, 2884, 0), - (2893, 2893, 0), - (2901, 2902, 0), - (2914, 2915, 0), - (2946, 2946, 0), - (3008, 3008, 0), - (3021, 3021, 0), - (3072, 3072, 0), - (3076, 3076, 0), - (3134, 3136, 0), - (3142, 3144, 0), - (3146, 3149, 0), - (3157, 3158, 0), - (3170, 3171, 0), - (3201, 3201, 0), - (3260, 3260, 0), - (3263, 3263, 0), - (3270, 3270, 0), - (3276, 3277, 0), - (3298, 3299, 0), - (3328, 3329, 0), - (3387, 3388, 0), - (3393, 3396, 0), - (3405, 3405, 0), - (3426, 3427, 0), - (3457, 3457, 0), - (3530, 3530, 0), - (3538, 3540, 0), - (3542, 3542, 0), - (3633, 3633, 0), - (3636, 3642, 0), - (3655, 3662, 0), - (3761, 3761, 0), - (3764, 3772, 0), - (3784, 3789, 0), - (3864, 3865, 0), - (3893, 3893, 0), - (3895, 3895, 0), - (3897, 3897, 0), - (3953, 3966, 0), - (3968, 3972, 0), - (3974, 3975, 0), - (3981, 3991, 0), - (3993, 4028, 0), - (4038, 4038, 0), - (4141, 4144, 0), - (4146, 4151, 0), - (4153, 4154, 0), - (4157, 4158, 0), - (4184, 4185, 0), - (4190, 4192, 0), - (4209, 4212, 0), - (4226, 4226, 0), - (4229, 4230, 0), - (4237, 4237, 0), - (4253, 4253, 0), - (4352, 4447, 2), - (4957, 4959, 0), - (5906, 5908, 0), - (5938, 5940, 0), - (5970, 5971, 0), - (6002, 6003, 0), - (6068, 6069, 0), - (6071, 6077, 0), - (6086, 6086, 0), - (6089, 6099, 0), - (6109, 6109, 0), - (6155, 6157, 0), - (6277, 6278, 0), - (6313, 6313, 0), - (6432, 6434, 0), - (6439, 6440, 0), - (6450, 6450, 0), - (6457, 6459, 0), - (6679, 6680, 0), - (6683, 6683, 0), - (6742, 6742, 0), - (6744, 6750, 0), - (6752, 6752, 0), - (6754, 6754, 0), - (6757, 6764, 0), - (6771, 6780, 0), - (6783, 6783, 0), - (6832, 6848, 0), - (6912, 6915, 0), - (6964, 6964, 0), - (6966, 6970, 0), - (6972, 6972, 0), - (6978, 6978, 0), - (7019, 7027, 0), - (7040, 7041, 0), - (7074, 7077, 0), - (7080, 7081, 0), - (7083, 7085, 0), - (7142, 7142, 0), - (7144, 7145, 0), - (7149, 7149, 0), - (7151, 7153, 0), - (7212, 7219, 0), - (7222, 7223, 0), - (7376, 7378, 0), - (7380, 7392, 0), - (7394, 7400, 0), - (7405, 7405, 0), - (7412, 7412, 0), - (7416, 7417, 0), - (7616, 7673, 0), - (7675, 7679, 0), - (8203, 8207, 0), - (8232, 8238, 0), - (8288, 8291, 0), - (8400, 8432, 0), - (8986, 8987, 2), - (9001, 9002, 2), - (9193, 9196, 2), - (9200, 9200, 2), - (9203, 9203, 2), - (9725, 9726, 2), - (9748, 9749, 2), - (9800, 9811, 2), - (9855, 9855, 2), - (9875, 9875, 2), - (9889, 9889, 2), - (9898, 9899, 2), - (9917, 9918, 2), - (9924, 9925, 2), - (9934, 9934, 2), - (9940, 9940, 2), - (9962, 9962, 2), - (9970, 9971, 2), - (9973, 9973, 2), - (9978, 9978, 2), - (9981, 9981, 2), - (9989, 9989, 2), - (9994, 9995, 2), - (10024, 10024, 2), - (10060, 10060, 2), - (10062, 10062, 2), - (10067, 10069, 2), - (10071, 10071, 2), - (10133, 10135, 2), - (10160, 10160, 2), - (10175, 10175, 2), - (11035, 11036, 2), - (11088, 11088, 2), - (11093, 11093, 2), - (11503, 11505, 0), - (11647, 11647, 0), - (11744, 11775, 0), - (11904, 11929, 2), - (11931, 12019, 2), - (12032, 12245, 2), - (12272, 12283, 2), - (12288, 12329, 2), - (12330, 12333, 0), - (12334, 12350, 2), - (12353, 12438, 2), - (12441, 12442, 0), - (12443, 12543, 2), - (12549, 12591, 2), - (12593, 12686, 2), - (12688, 12771, 2), - (12784, 12830, 2), - (12832, 12871, 2), - (12880, 19903, 2), - (19968, 42124, 2), - (42128, 42182, 2), - (42607, 42610, 0), - (42612, 42621, 0), - (42654, 42655, 0), - (42736, 42737, 0), - (43010, 43010, 0), - (43014, 43014, 0), - (43019, 43019, 0), - (43045, 43046, 0), - (43052, 43052, 0), - (43204, 43205, 0), - (43232, 43249, 0), - (43263, 43263, 0), - (43302, 43309, 0), - (43335, 43345, 0), - (43360, 43388, 2), - (43392, 43394, 0), - (43443, 43443, 0), - (43446, 43449, 0), - (43452, 43453, 0), - (43493, 43493, 0), - (43561, 43566, 0), - (43569, 43570, 0), - (43573, 43574, 0), - (43587, 43587, 0), - (43596, 43596, 0), - (43644, 43644, 0), - (43696, 43696, 0), - (43698, 43700, 0), - (43703, 43704, 0), - (43710, 43711, 0), - (43713, 43713, 0), - (43756, 43757, 0), - (43766, 43766, 0), - (44005, 44005, 0), - (44008, 44008, 0), - (44013, 44013, 0), - (44032, 55203, 2), - (63744, 64255, 2), - (64286, 64286, 0), - (65024, 65039, 0), - (65040, 65049, 2), - (65056, 65071, 0), - (65072, 65106, 2), - (65108, 65126, 2), - (65128, 65131, 2), - (65281, 65376, 2), - (65504, 65510, 2), - (66045, 66045, 0), - (66272, 66272, 0), - (66422, 66426, 0), - (68097, 68099, 0), - (68101, 68102, 0), - (68108, 68111, 0), - (68152, 68154, 0), - (68159, 68159, 0), - (68325, 68326, 0), - (68900, 68903, 0), - (69291, 69292, 0), - (69446, 69456, 0), - (69633, 69633, 0), - (69688, 69702, 0), - (69759, 69761, 0), - (69811, 69814, 0), - (69817, 69818, 0), - (69888, 69890, 0), - (69927, 69931, 0), - (69933, 69940, 0), - (70003, 70003, 0), - (70016, 70017, 0), - (70070, 70078, 0), - (70089, 70092, 0), - (70095, 70095, 0), - (70191, 70193, 0), - (70196, 70196, 0), - (70198, 70199, 0), - (70206, 70206, 0), - (70367, 70367, 0), - (70371, 70378, 0), - (70400, 70401, 0), - (70459, 70460, 0), - (70464, 70464, 0), - (70502, 70508, 0), - (70512, 70516, 0), - (70712, 70719, 0), - (70722, 70724, 0), - (70726, 70726, 0), - (70750, 70750, 0), - (70835, 70840, 0), - (70842, 70842, 0), - (70847, 70848, 0), - (70850, 70851, 0), - (71090, 71093, 0), - (71100, 71101, 0), - (71103, 71104, 0), - (71132, 71133, 0), - (71219, 71226, 0), - (71229, 71229, 0), - (71231, 71232, 0), - (71339, 71339, 0), - (71341, 71341, 0), - (71344, 71349, 0), - (71351, 71351, 0), - (71453, 71455, 0), - (71458, 71461, 0), - (71463, 71467, 0), - (71727, 71735, 0), - (71737, 71738, 0), - (71995, 71996, 0), - (71998, 71998, 0), - (72003, 72003, 0), - (72148, 72151, 0), - (72154, 72155, 0), - (72160, 72160, 0), - (72193, 72202, 0), - (72243, 72248, 0), - (72251, 72254, 0), - (72263, 72263, 0), - (72273, 72278, 0), - (72281, 72283, 0), - (72330, 72342, 0), - (72344, 72345, 0), - (72752, 72758, 0), - (72760, 72765, 0), - (72767, 72767, 0), - (72850, 72871, 0), - (72874, 72880, 0), - (72882, 72883, 0), - (72885, 72886, 0), - (73009, 73014, 0), - (73018, 73018, 0), - (73020, 73021, 0), - (73023, 73029, 0), - (73031, 73031, 0), - (73104, 73105, 0), - (73109, 73109, 0), - (73111, 73111, 0), - (73459, 73460, 0), - (92912, 92916, 0), - (92976, 92982, 0), - (94031, 94031, 0), - (94095, 94098, 0), - (94176, 94179, 2), - (94180, 94180, 0), - (94192, 94193, 2), - (94208, 100343, 2), - (100352, 101589, 2), - (101632, 101640, 2), - (110592, 110878, 2), - (110928, 110930, 2), - (110948, 110951, 2), - (110960, 111355, 2), - (113821, 113822, 0), - (119143, 119145, 0), - (119163, 119170, 0), - (119173, 119179, 0), - (119210, 119213, 0), - (119362, 119364, 0), - (121344, 121398, 0), - (121403, 121452, 0), - (121461, 121461, 0), - (121476, 121476, 0), - (121499, 121503, 0), - (121505, 121519, 0), - (122880, 122886, 0), - (122888, 122904, 0), - (122907, 122913, 0), - (122915, 122916, 0), - (122918, 122922, 0), - (123184, 123190, 0), - (123628, 123631, 0), - (125136, 125142, 0), - (125252, 125258, 0), - (126980, 126980, 2), - (127183, 127183, 2), - (127374, 127374, 2), - (127377, 127386, 2), - (127488, 127490, 2), - (127504, 127547, 2), - (127552, 127560, 2), - (127568, 127569, 2), - (127584, 127589, 2), - (127744, 127776, 2), - (127789, 127797, 2), - (127799, 127868, 2), - (127870, 127891, 2), - (127904, 127946, 2), - (127951, 127955, 2), - (127968, 127984, 2), - (127988, 127988, 2), - (127992, 128062, 2), - (128064, 128064, 2), - (128066, 128252, 2), - (128255, 128317, 2), - (128331, 128334, 2), - (128336, 128359, 2), - (128378, 128378, 2), - (128405, 128406, 2), - (128420, 128420, 2), - (128507, 128591, 2), - (128640, 128709, 2), - (128716, 128716, 2), - (128720, 128722, 2), - (128725, 128727, 2), - (128747, 128748, 2), - (128756, 128764, 2), - (128992, 129003, 2), - (129292, 129338, 2), - (129340, 129349, 2), - (129351, 129400, 2), - (129402, 129483, 2), - (129485, 129535, 2), - (129648, 129652, 2), - (129656, 129658, 2), - (129664, 129670, 2), - (129680, 129704, 2), - (129712, 129718, 2), - (129728, 129730, 2), - (129744, 129750, 2), - (131072, 196605, 2), - (196608, 262141, 2), - (917760, 917999, 0), -] diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py deleted file mode 100644 index 1f2877b..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py +++ /dev/null @@ -1,3610 +0,0 @@ -EMOJI = { - "1st_place_medal": "🥇", - "2nd_place_medal": "🥈", - "3rd_place_medal": "🥉", - "ab_button_(blood_type)": "🆎", - "atm_sign": "ðŸ§", - "a_button_(blood_type)": "🅰", - "afghanistan": "🇦🇫", - "albania": "🇦🇱", - "algeria": "🇩🇿", - "american_samoa": "🇦🇸", - "andorra": "🇦🇩", - "angola": "🇦🇴", - "anguilla": "🇦🇮", - "antarctica": "🇦🇶", - "antigua_&_barbuda": "🇦🇬", - "aquarius": "â™’", - "argentina": "🇦🇷", - "aries": "♈", - "armenia": "🇦🇲", - "aruba": "🇦🇼", - "ascension_island": "🇦🇨", - "australia": "🇦🇺", - "austria": "🇦🇹", - "azerbaijan": "🇦🇿", - "back_arrow": "🔙", - "b_button_(blood_type)": "🅱", - "bahamas": "🇧🇸", - "bahrain": "🇧🇭", - "bangladesh": "🇧🇩", - "barbados": "🇧🇧", - "belarus": "🇧🇾", - "belgium": "🇧🇪", - "belize": "🇧🇿", - "benin": "🇧🇯", - "bermuda": "🇧🇲", - "bhutan": "🇧🇹", - "bolivia": "🇧🇴", - "bosnia_&_herzegovina": "🇧🇦", - "botswana": "🇧🇼", - "bouvet_island": "🇧🇻", - "brazil": "🇧🇷", - "british_indian_ocean_territory": "🇮🇴", - "british_virgin_islands": "🇻🇬", - "brunei": "🇧🇳", - "bulgaria": "🇧🇬", - "burkina_faso": "🇧🇫", - "burundi": "🇧🇮", - "cl_button": "🆑", - "cool_button": "🆒", - "cambodia": "🇰🇭", - "cameroon": "🇨🇲", - "canada": "🇨🇦", - "canary_islands": "🇮🇨", - "cancer": "♋", - "cape_verde": "🇨🇻", - "capricorn": "♑", - "caribbean_netherlands": "🇧🇶", - "cayman_islands": "🇰🇾", - "central_african_republic": "🇨🇫", - "ceuta_&_melilla": "🇪🇦", - "chad": "🇹🇩", - "chile": "🇨🇱", - "china": "🇨🇳", - "christmas_island": "🇨🇽", - "christmas_tree": "🎄", - "clipperton_island": "🇨🇵", - "cocos_(keeling)_islands": "🇨🇨", - "colombia": "🇨🇴", - "comoros": "🇰🇲", - "congo_-_brazzaville": "🇨🇬", - "congo_-_kinshasa": "🇨🇩", - "cook_islands": "🇨🇰", - "costa_rica": "🇨🇷", - "croatia": "🇭🇷", - "cuba": "🇨🇺", - "curaçao": "🇨🇼", - "cyprus": "🇨🇾", - "czechia": "🇨🇿", - "côte_d’ivoire": "🇨🇮", - "denmark": "🇩🇰", - "diego_garcia": "🇩🇬", - "djibouti": "🇩🇯", - "dominica": "🇩🇲", - "dominican_republic": "🇩🇴", - "end_arrow": "🔚", - "ecuador": "🇪🇨", - "egypt": "🇪🇬", - "el_salvador": "🇸🇻", - "england": "ðŸ´\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", - "equatorial_guinea": "🇬🇶", - "eritrea": "🇪🇷", - "estonia": "🇪🇪", - "ethiopia": "🇪🇹", - "european_union": "🇪🇺", - "free_button": "🆓", - "falkland_islands": "🇫🇰", - "faroe_islands": "🇫🇴", - "fiji": "🇫🇯", - "finland": "🇫🇮", - "france": "🇫🇷", - "french_guiana": "🇬🇫", - "french_polynesia": "🇵🇫", - "french_southern_territories": "🇹🇫", - "gabon": "🇬🇦", - "gambia": "🇬🇲", - "gemini": "♊", - "georgia": "🇬🇪", - "germany": "🇩🇪", - "ghana": "🇬🇭", - "gibraltar": "🇬🇮", - "greece": "🇬🇷", - "greenland": "🇬🇱", - "grenada": "🇬🇩", - "guadeloupe": "🇬🇵", - "guam": "🇬🇺", - "guatemala": "🇬🇹", - "guernsey": "🇬🇬", - "guinea": "🇬🇳", - "guinea-bissau": "🇬🇼", - "guyana": "🇬🇾", - "haiti": "🇭🇹", - "heard_&_mcdonald_islands": "🇭🇲", - "honduras": "🇭🇳", - "hong_kong_sar_china": "🇭🇰", - "hungary": "🇭🇺", - "id_button": "🆔", - "iceland": "🇮🇸", - "india": "🇮🇳", - "indonesia": "🇮🇩", - "iran": "🇮🇷", - "iraq": "🇮🇶", - "ireland": "🇮🇪", - "isle_of_man": "🇮🇲", - "israel": "🇮🇱", - "italy": "🇮🇹", - "jamaica": "🇯🇲", - "japan": "🗾", - "japanese_acceptable_button": "🉑", - "japanese_application_button": "🈸", - "japanese_bargain_button": "ðŸ‰", - "japanese_castle": "ðŸ¯", - "japanese_congratulations_button": "㊗", - "japanese_discount_button": "🈹", - "japanese_dolls": "🎎", - "japanese_free_of_charge_button": "🈚", - "japanese_here_button": "ðŸˆ", - "japanese_monthly_amount_button": "🈷", - "japanese_no_vacancy_button": "🈵", - "japanese_not_free_of_charge_button": "🈶", - "japanese_open_for_business_button": "🈺", - "japanese_passing_grade_button": "🈴", - "japanese_post_office": "ðŸ£", - "japanese_prohibited_button": "🈲", - "japanese_reserved_button": "🈯", - "japanese_secret_button": "㊙", - "japanese_service_charge_button": "🈂", - "japanese_symbol_for_beginner": "🔰", - "japanese_vacancy_button": "🈳", - "jersey": "🇯🇪", - "jordan": "🇯🇴", - "kazakhstan": "🇰🇿", - "kenya": "🇰🇪", - "kiribati": "🇰🇮", - "kosovo": "🇽🇰", - "kuwait": "🇰🇼", - "kyrgyzstan": "🇰🇬", - "laos": "🇱🇦", - "latvia": "🇱🇻", - "lebanon": "🇱🇧", - "leo": "♌", - "lesotho": "🇱🇸", - "liberia": "🇱🇷", - "libra": "♎", - "libya": "🇱🇾", - "liechtenstein": "🇱🇮", - "lithuania": "🇱🇹", - "luxembourg": "🇱🇺", - "macau_sar_china": "🇲🇴", - "macedonia": "🇲🇰", - "madagascar": "🇲🇬", - "malawi": "🇲🇼", - "malaysia": "🇲🇾", - "maldives": "🇲🇻", - "mali": "🇲🇱", - "malta": "🇲🇹", - "marshall_islands": "🇲🇭", - "martinique": "🇲🇶", - "mauritania": "🇲🇷", - "mauritius": "🇲🇺", - "mayotte": "🇾🇹", - "mexico": "🇲🇽", - "micronesia": "🇫🇲", - "moldova": "🇲🇩", - "monaco": "🇲🇨", - "mongolia": "🇲🇳", - "montenegro": "🇲🇪", - "montserrat": "🇲🇸", - "morocco": "🇲🇦", - "mozambique": "🇲🇿", - "mrs._claus": "🤶", - "mrs._claus_dark_skin_tone": "🤶ðŸ¿", - "mrs._claus_light_skin_tone": "🤶ðŸ»", - "mrs._claus_medium-dark_skin_tone": "🤶ðŸ¾", - "mrs._claus_medium-light_skin_tone": "🤶ðŸ¼", - "mrs._claus_medium_skin_tone": "🤶ðŸ½", - "myanmar_(burma)": "🇲🇲", - "new_button": "🆕", - "ng_button": "🆖", - "namibia": "🇳🇦", - "nauru": "🇳🇷", - "nepal": "🇳🇵", - "netherlands": "🇳🇱", - "new_caledonia": "🇳🇨", - "new_zealand": "🇳🇿", - "nicaragua": "🇳🇮", - "niger": "🇳🇪", - "nigeria": "🇳🇬", - "niue": "🇳🇺", - "norfolk_island": "🇳🇫", - "north_korea": "🇰🇵", - "northern_mariana_islands": "🇲🇵", - "norway": "🇳🇴", - "ok_button": "🆗", - "ok_hand": "👌", - "ok_hand_dark_skin_tone": "👌ðŸ¿", - "ok_hand_light_skin_tone": "👌ðŸ»", - "ok_hand_medium-dark_skin_tone": "👌ðŸ¾", - "ok_hand_medium-light_skin_tone": "👌ðŸ¼", - "ok_hand_medium_skin_tone": "👌ðŸ½", - "on!_arrow": "🔛", - "o_button_(blood_type)": "🅾", - "oman": "🇴🇲", - "ophiuchus": "⛎", - "p_button": "🅿", - "pakistan": "🇵🇰", - "palau": "🇵🇼", - "palestinian_territories": "🇵🇸", - "panama": "🇵🇦", - "papua_new_guinea": "🇵🇬", - "paraguay": "🇵🇾", - "peru": "🇵🇪", - "philippines": "🇵🇭", - "pisces": "♓", - "pitcairn_islands": "🇵🇳", - "poland": "🇵🇱", - "portugal": "🇵🇹", - "puerto_rico": "🇵🇷", - "qatar": "🇶🇦", - "romania": "🇷🇴", - "russia": "🇷🇺", - "rwanda": "🇷🇼", - "réunion": "🇷🇪", - "soon_arrow": "🔜", - "sos_button": "🆘", - "sagittarius": "â™", - "samoa": "🇼🇸", - "san_marino": "🇸🇲", - "santa_claus": "🎅", - "santa_claus_dark_skin_tone": "🎅ðŸ¿", - "santa_claus_light_skin_tone": "🎅ðŸ»", - "santa_claus_medium-dark_skin_tone": "🎅ðŸ¾", - "santa_claus_medium-light_skin_tone": "🎅ðŸ¼", - "santa_claus_medium_skin_tone": "🎅ðŸ½", - "saudi_arabia": "🇸🇦", - "scorpio": "â™", - "scotland": "ðŸ´\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", - "senegal": "🇸🇳", - "serbia": "🇷🇸", - "seychelles": "🇸🇨", - "sierra_leone": "🇸🇱", - "singapore": "🇸🇬", - "sint_maarten": "🇸🇽", - "slovakia": "🇸🇰", - "slovenia": "🇸🇮", - "solomon_islands": "🇸🇧", - "somalia": "🇸🇴", - "south_africa": "🇿🇦", - "south_georgia_&_south_sandwich_islands": "🇬🇸", - "south_korea": "🇰🇷", - "south_sudan": "🇸🇸", - "spain": "🇪🇸", - "sri_lanka": "🇱🇰", - "st._barthélemy": "🇧🇱", - "st._helena": "🇸🇭", - "st._kitts_&_nevis": "🇰🇳", - "st._lucia": "🇱🇨", - "st._martin": "🇲🇫", - "st._pierre_&_miquelon": "🇵🇲", - "st._vincent_&_grenadines": "🇻🇨", - "statue_of_liberty": "🗽", - "sudan": "🇸🇩", - "suriname": "🇸🇷", - "svalbard_&_jan_mayen": "🇸🇯", - "swaziland": "🇸🇿", - "sweden": "🇸🇪", - "switzerland": "🇨🇭", - "syria": "🇸🇾", - "são_tomé_&_príncipe": "🇸🇹", - "t-rex": "🦖", - "top_arrow": "ðŸ”", - "taiwan": "🇹🇼", - "tajikistan": "🇹🇯", - "tanzania": "🇹🇿", - "taurus": "♉", - "thailand": "🇹🇭", - "timor-leste": "🇹🇱", - "togo": "🇹🇬", - "tokelau": "🇹🇰", - "tokyo_tower": "🗼", - "tonga": "🇹🇴", - "trinidad_&_tobago": "🇹🇹", - "tristan_da_cunha": "🇹🇦", - "tunisia": "🇹🇳", - "turkey": "🦃", - "turkmenistan": "🇹🇲", - "turks_&_caicos_islands": "🇹🇨", - "tuvalu": "🇹🇻", - "u.s._outlying_islands": "🇺🇲", - "u.s._virgin_islands": "🇻🇮", - "up!_button": "🆙", - "uganda": "🇺🇬", - "ukraine": "🇺🇦", - "united_arab_emirates": "🇦🇪", - "united_kingdom": "🇬🇧", - "united_nations": "🇺🇳", - "united_states": "🇺🇸", - "uruguay": "🇺🇾", - "uzbekistan": "🇺🇿", - "vs_button": "🆚", - "vanuatu": "🇻🇺", - "vatican_city": "🇻🇦", - "venezuela": "🇻🇪", - "vietnam": "🇻🇳", - "virgo": "â™", - "wales": "ðŸ´\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", - "wallis_&_futuna": "🇼🇫", - "western_sahara": "🇪🇭", - "yemen": "🇾🇪", - "zambia": "🇿🇲", - "zimbabwe": "🇿🇼", - "abacus": "🧮", - "adhesive_bandage": "🩹", - "admission_tickets": "🎟", - "adult": "🧑", - "adult_dark_skin_tone": "🧑ðŸ¿", - "adult_light_skin_tone": "🧑ðŸ»", - "adult_medium-dark_skin_tone": "🧑ðŸ¾", - "adult_medium-light_skin_tone": "🧑ðŸ¼", - "adult_medium_skin_tone": "🧑ðŸ½", - "aerial_tramway": "🚡", - "airplane": "✈", - "airplane_arrival": "🛬", - "airplane_departure": "🛫", - "alarm_clock": "â°", - "alembic": "âš—", - "alien": "👽", - "alien_monster": "👾", - "ambulance": "🚑", - "american_football": "ðŸˆ", - "amphora": "ðŸº", - "anchor": "âš“", - "anger_symbol": "💢", - "angry_face": "😠", - "angry_face_with_horns": "👿", - "anguished_face": "😧", - "ant": "ðŸœ", - "antenna_bars": "📶", - "anxious_face_with_sweat": "😰", - "articulated_lorry": "🚛", - "artist_palette": "🎨", - "astonished_face": "😲", - "atom_symbol": "âš›", - "auto_rickshaw": "🛺", - "automobile": "🚗", - "avocado": "🥑", - "axe": "🪓", - "baby": "👶", - "baby_angel": "👼", - "baby_angel_dark_skin_tone": "👼ðŸ¿", - "baby_angel_light_skin_tone": "👼ðŸ»", - "baby_angel_medium-dark_skin_tone": "👼ðŸ¾", - "baby_angel_medium-light_skin_tone": "👼ðŸ¼", - "baby_angel_medium_skin_tone": "👼ðŸ½", - "baby_bottle": "ðŸ¼", - "baby_chick": "ðŸ¤", - "baby_dark_skin_tone": "👶ðŸ¿", - "baby_light_skin_tone": "👶ðŸ»", - "baby_medium-dark_skin_tone": "👶ðŸ¾", - "baby_medium-light_skin_tone": "👶ðŸ¼", - "baby_medium_skin_tone": "👶ðŸ½", - "baby_symbol": "🚼", - "backhand_index_pointing_down": "👇", - "backhand_index_pointing_down_dark_skin_tone": "👇ðŸ¿", - "backhand_index_pointing_down_light_skin_tone": "👇ðŸ»", - "backhand_index_pointing_down_medium-dark_skin_tone": "👇ðŸ¾", - "backhand_index_pointing_down_medium-light_skin_tone": "👇ðŸ¼", - "backhand_index_pointing_down_medium_skin_tone": "👇ðŸ½", - "backhand_index_pointing_left": "👈", - "backhand_index_pointing_left_dark_skin_tone": "👈ðŸ¿", - "backhand_index_pointing_left_light_skin_tone": "👈ðŸ»", - "backhand_index_pointing_left_medium-dark_skin_tone": "👈ðŸ¾", - "backhand_index_pointing_left_medium-light_skin_tone": "👈ðŸ¼", - "backhand_index_pointing_left_medium_skin_tone": "👈ðŸ½", - "backhand_index_pointing_right": "👉", - "backhand_index_pointing_right_dark_skin_tone": "👉ðŸ¿", - "backhand_index_pointing_right_light_skin_tone": "👉ðŸ»", - "backhand_index_pointing_right_medium-dark_skin_tone": "👉ðŸ¾", - "backhand_index_pointing_right_medium-light_skin_tone": "👉ðŸ¼", - "backhand_index_pointing_right_medium_skin_tone": "👉ðŸ½", - "backhand_index_pointing_up": "👆", - "backhand_index_pointing_up_dark_skin_tone": "👆ðŸ¿", - "backhand_index_pointing_up_light_skin_tone": "👆ðŸ»", - "backhand_index_pointing_up_medium-dark_skin_tone": "👆ðŸ¾", - "backhand_index_pointing_up_medium-light_skin_tone": "👆ðŸ¼", - "backhand_index_pointing_up_medium_skin_tone": "👆ðŸ½", - "bacon": "🥓", - "badger": "🦡", - "badminton": "ðŸ¸", - "bagel": "🥯", - "baggage_claim": "🛄", - "baguette_bread": "🥖", - "balance_scale": "âš–", - "bald": "🦲", - "bald_man": "👨\u200d🦲", - "bald_woman": "👩\u200d🦲", - "ballet_shoes": "🩰", - "balloon": "🎈", - "ballot_box_with_ballot": "🗳", - "ballot_box_with_check": "☑", - "banana": "ðŸŒ", - "banjo": "🪕", - "bank": "ðŸ¦", - "bar_chart": "📊", - "barber_pole": "💈", - "baseball": "âš¾", - "basket": "🧺", - "basketball": "ðŸ€", - "bat": "🦇", - "bathtub": "ðŸ›", - "battery": "🔋", - "beach_with_umbrella": "ðŸ–", - "beaming_face_with_smiling_eyes": "ðŸ˜", - "bear_face": "ðŸ»", - "bearded_person": "🧔", - "bearded_person_dark_skin_tone": "🧔ðŸ¿", - "bearded_person_light_skin_tone": "🧔ðŸ»", - "bearded_person_medium-dark_skin_tone": "🧔ðŸ¾", - "bearded_person_medium-light_skin_tone": "🧔ðŸ¼", - "bearded_person_medium_skin_tone": "🧔ðŸ½", - "beating_heart": "💓", - "bed": "ðŸ›", - "beer_mug": "ðŸº", - "bell": "🔔", - "bell_with_slash": "🔕", - "bellhop_bell": "🛎", - "bento_box": "ðŸ±", - "beverage_box": "🧃", - "bicycle": "🚲", - "bikini": "👙", - "billed_cap": "🧢", - "biohazard": "☣", - "bird": "ðŸ¦", - "birthday_cake": "🎂", - "black_circle": "âš«", - "black_flag": "ðŸ´", - "black_heart": "🖤", - "black_large_square": "⬛", - "black_medium-small_square": "â—¾", - "black_medium_square": "â—¼", - "black_nib": "✒", - "black_small_square": "â–ª", - "black_square_button": "🔲", - "blond-haired_man": "👱\u200d♂ï¸", - "blond-haired_man_dark_skin_tone": "👱ðŸ¿\u200d♂ï¸", - "blond-haired_man_light_skin_tone": "👱ðŸ»\u200d♂ï¸", - "blond-haired_man_medium-dark_skin_tone": "👱ðŸ¾\u200d♂ï¸", - "blond-haired_man_medium-light_skin_tone": "👱ðŸ¼\u200d♂ï¸", - "blond-haired_man_medium_skin_tone": "👱ðŸ½\u200d♂ï¸", - "blond-haired_person": "👱", - "blond-haired_person_dark_skin_tone": "👱ðŸ¿", - "blond-haired_person_light_skin_tone": "👱ðŸ»", - "blond-haired_person_medium-dark_skin_tone": "👱ðŸ¾", - "blond-haired_person_medium-light_skin_tone": "👱ðŸ¼", - "blond-haired_person_medium_skin_tone": "👱ðŸ½", - "blond-haired_woman": "👱\u200d♀ï¸", - "blond-haired_woman_dark_skin_tone": "👱ðŸ¿\u200d♀ï¸", - "blond-haired_woman_light_skin_tone": "👱ðŸ»\u200d♀ï¸", - "blond-haired_woman_medium-dark_skin_tone": "👱ðŸ¾\u200d♀ï¸", - "blond-haired_woman_medium-light_skin_tone": "👱ðŸ¼\u200d♀ï¸", - "blond-haired_woman_medium_skin_tone": "👱ðŸ½\u200d♀ï¸", - "blossom": "🌼", - "blowfish": "ðŸ¡", - "blue_book": "📘", - "blue_circle": "🔵", - "blue_heart": "💙", - "blue_square": "🟦", - "boar": "ðŸ—", - "bomb": "💣", - "bone": "🦴", - "bookmark": "🔖", - "bookmark_tabs": "📑", - "books": "📚", - "bottle_with_popping_cork": "ðŸ¾", - "bouquet": "ðŸ’", - "bow_and_arrow": "ðŸ¹", - "bowl_with_spoon": "🥣", - "bowling": "🎳", - "boxing_glove": "🥊", - "boy": "👦", - "boy_dark_skin_tone": "👦ðŸ¿", - "boy_light_skin_tone": "👦ðŸ»", - "boy_medium-dark_skin_tone": "👦ðŸ¾", - "boy_medium-light_skin_tone": "👦ðŸ¼", - "boy_medium_skin_tone": "👦ðŸ½", - "brain": "🧠", - "bread": "ðŸž", - "breast-feeding": "🤱", - "breast-feeding_dark_skin_tone": "🤱ðŸ¿", - "breast-feeding_light_skin_tone": "🤱ðŸ»", - "breast-feeding_medium-dark_skin_tone": "🤱ðŸ¾", - "breast-feeding_medium-light_skin_tone": "🤱ðŸ¼", - "breast-feeding_medium_skin_tone": "🤱ðŸ½", - "brick": "🧱", - "bride_with_veil": "👰", - "bride_with_veil_dark_skin_tone": "👰ðŸ¿", - "bride_with_veil_light_skin_tone": "👰ðŸ»", - "bride_with_veil_medium-dark_skin_tone": "👰ðŸ¾", - "bride_with_veil_medium-light_skin_tone": "👰ðŸ¼", - "bride_with_veil_medium_skin_tone": "👰ðŸ½", - "bridge_at_night": "🌉", - "briefcase": "💼", - "briefs": "🩲", - "bright_button": "🔆", - "broccoli": "🥦", - "broken_heart": "💔", - "broom": "🧹", - "brown_circle": "🟤", - "brown_heart": "🤎", - "brown_square": "🟫", - "bug": "ðŸ›", - "building_construction": "ðŸ—", - "bullet_train": "🚅", - "burrito": "🌯", - "bus": "🚌", - "bus_stop": "ðŸš", - "bust_in_silhouette": "👤", - "busts_in_silhouette": "👥", - "butter": "🧈", - "butterfly": "🦋", - "cactus": "🌵", - "calendar": "📆", - "call_me_hand": "🤙", - "call_me_hand_dark_skin_tone": "🤙ðŸ¿", - "call_me_hand_light_skin_tone": "🤙ðŸ»", - "call_me_hand_medium-dark_skin_tone": "🤙ðŸ¾", - "call_me_hand_medium-light_skin_tone": "🤙ðŸ¼", - "call_me_hand_medium_skin_tone": "🤙ðŸ½", - "camel": "ðŸ«", - "camera": "📷", - "camera_with_flash": "📸", - "camping": "ðŸ•", - "candle": "🕯", - "candy": "ðŸ¬", - "canned_food": "🥫", - "canoe": "🛶", - "card_file_box": "🗃", - "card_index": "📇", - "card_index_dividers": "🗂", - "carousel_horse": "🎠", - "carp_streamer": "ðŸŽ", - "carrot": "🥕", - "castle": "ðŸ°", - "cat": "ðŸ±", - "cat_face": "ðŸ±", - "cat_face_with_tears_of_joy": "😹", - "cat_face_with_wry_smile": "😼", - "chains": "⛓", - "chair": "🪑", - "chart_decreasing": "📉", - "chart_increasing": "📈", - "chart_increasing_with_yen": "💹", - "cheese_wedge": "🧀", - "chequered_flag": "ðŸ", - "cherries": "ðŸ’", - "cherry_blossom": "🌸", - "chess_pawn": "♟", - "chestnut": "🌰", - "chicken": "ðŸ”", - "child": "🧒", - "child_dark_skin_tone": "🧒ðŸ¿", - "child_light_skin_tone": "🧒ðŸ»", - "child_medium-dark_skin_tone": "🧒ðŸ¾", - "child_medium-light_skin_tone": "🧒ðŸ¼", - "child_medium_skin_tone": "🧒ðŸ½", - "children_crossing": "🚸", - "chipmunk": "ðŸ¿", - "chocolate_bar": "ðŸ«", - "chopsticks": "🥢", - "church": "⛪", - "cigarette": "🚬", - "cinema": "🎦", - "circled_m": "â“‚", - "circus_tent": "🎪", - "cityscape": "ðŸ™", - "cityscape_at_dusk": "🌆", - "clamp": "🗜", - "clapper_board": "🎬", - "clapping_hands": "ðŸ‘", - "clapping_hands_dark_skin_tone": "ðŸ‘ðŸ¿", - "clapping_hands_light_skin_tone": "ðŸ‘ðŸ»", - "clapping_hands_medium-dark_skin_tone": "ðŸ‘ðŸ¾", - "clapping_hands_medium-light_skin_tone": "ðŸ‘ðŸ¼", - "clapping_hands_medium_skin_tone": "ðŸ‘ðŸ½", - "classical_building": "ðŸ›", - "clinking_beer_mugs": "ðŸ»", - "clinking_glasses": "🥂", - "clipboard": "📋", - "clockwise_vertical_arrows": "🔃", - "closed_book": "📕", - "closed_mailbox_with_lowered_flag": "📪", - "closed_mailbox_with_raised_flag": "📫", - "closed_umbrella": "🌂", - "cloud": "â˜", - "cloud_with_lightning": "🌩", - "cloud_with_lightning_and_rain": "⛈", - "cloud_with_rain": "🌧", - "cloud_with_snow": "🌨", - "clown_face": "🤡", - "club_suit": "♣", - "clutch_bag": "ðŸ‘", - "coat": "🧥", - "cocktail_glass": "ðŸ¸", - "coconut": "🥥", - "coffin": "âš°", - "cold_face": "🥶", - "collision": "💥", - "comet": "☄", - "compass": "🧭", - "computer_disk": "💽", - "computer_mouse": "🖱", - "confetti_ball": "🎊", - "confounded_face": "😖", - "confused_face": "😕", - "construction": "🚧", - "construction_worker": "👷", - "construction_worker_dark_skin_tone": "👷ðŸ¿", - "construction_worker_light_skin_tone": "👷ðŸ»", - "construction_worker_medium-dark_skin_tone": "👷ðŸ¾", - "construction_worker_medium-light_skin_tone": "👷ðŸ¼", - "construction_worker_medium_skin_tone": "👷ðŸ½", - "control_knobs": "🎛", - "convenience_store": "ðŸª", - "cooked_rice": "ðŸš", - "cookie": "ðŸª", - "cooking": "ðŸ³", - "copyright": "©", - "couch_and_lamp": "🛋", - "counterclockwise_arrows_button": "🔄", - "couple_with_heart": "💑", - "couple_with_heart_man_man": "👨\u200dâ¤ï¸\u200d👨", - "couple_with_heart_woman_man": "👩\u200dâ¤ï¸\u200d👨", - "couple_with_heart_woman_woman": "👩\u200dâ¤ï¸\u200d👩", - "cow": "ðŸ®", - "cow_face": "ðŸ®", - "cowboy_hat_face": "🤠", - "crab": "🦀", - "crayon": "ðŸ–", - "credit_card": "💳", - "crescent_moon": "🌙", - "cricket": "🦗", - "cricket_game": "ðŸ", - "crocodile": "ðŸŠ", - "croissant": "ðŸ¥", - "cross_mark": "âŒ", - "cross_mark_button": "âŽ", - "crossed_fingers": "🤞", - "crossed_fingers_dark_skin_tone": "🤞ðŸ¿", - "crossed_fingers_light_skin_tone": "🤞ðŸ»", - "crossed_fingers_medium-dark_skin_tone": "🤞ðŸ¾", - "crossed_fingers_medium-light_skin_tone": "🤞ðŸ¼", - "crossed_fingers_medium_skin_tone": "🤞ðŸ½", - "crossed_flags": "🎌", - "crossed_swords": "âš”", - "crown": "👑", - "crying_cat_face": "😿", - "crying_face": "😢", - "crystal_ball": "🔮", - "cucumber": "🥒", - "cupcake": "ðŸ§", - "cup_with_straw": "🥤", - "curling_stone": "🥌", - "curly_hair": "🦱", - "curly-haired_man": "👨\u200d🦱", - "curly-haired_woman": "👩\u200d🦱", - "curly_loop": "âž°", - "currency_exchange": "💱", - "curry_rice": "ðŸ›", - "custard": "ðŸ®", - "customs": "🛃", - "cut_of_meat": "🥩", - "cyclone": "🌀", - "dagger": "🗡", - "dango": "ðŸ¡", - "dashing_away": "💨", - "deaf_person": "ðŸ§", - "deciduous_tree": "🌳", - "deer": "🦌", - "delivery_truck": "🚚", - "department_store": "ðŸ¬", - "derelict_house": "ðŸš", - "desert": "ðŸœ", - "desert_island": "ðŸ", - "desktop_computer": "🖥", - "detective": "🕵", - "detective_dark_skin_tone": "🕵ðŸ¿", - "detective_light_skin_tone": "🕵ðŸ»", - "detective_medium-dark_skin_tone": "🕵ðŸ¾", - "detective_medium-light_skin_tone": "🕵ðŸ¼", - "detective_medium_skin_tone": "🕵ðŸ½", - "diamond_suit": "♦", - "diamond_with_a_dot": "💠", - "dim_button": "🔅", - "direct_hit": "🎯", - "disappointed_face": "😞", - "diving_mask": "🤿", - "diya_lamp": "🪔", - "dizzy": "💫", - "dizzy_face": "😵", - "dna": "🧬", - "dog": "ðŸ¶", - "dog_face": "ðŸ¶", - "dollar_banknote": "💵", - "dolphin": "ðŸ¬", - "door": "🚪", - "dotted_six-pointed_star": "🔯", - "double_curly_loop": "âž¿", - "double_exclamation_mark": "‼", - "doughnut": "ðŸ©", - "dove": "🕊", - "down-left_arrow": "↙", - "down-right_arrow": "↘", - "down_arrow": "⬇", - "downcast_face_with_sweat": "😓", - "downwards_button": "🔽", - "dragon": "ðŸ‰", - "dragon_face": "ðŸ²", - "dress": "👗", - "drooling_face": "🤤", - "drop_of_blood": "🩸", - "droplet": "💧", - "drum": "ðŸ¥", - "duck": "🦆", - "dumpling": "🥟", - "dvd": "📀", - "e-mail": "📧", - "eagle": "🦅", - "ear": "👂", - "ear_dark_skin_tone": "👂ðŸ¿", - "ear_light_skin_tone": "👂ðŸ»", - "ear_medium-dark_skin_tone": "👂ðŸ¾", - "ear_medium-light_skin_tone": "👂ðŸ¼", - "ear_medium_skin_tone": "👂ðŸ½", - "ear_of_corn": "🌽", - "ear_with_hearing_aid": "🦻", - "egg": "ðŸ³", - "eggplant": "ðŸ†", - "eight-pointed_star": "✴", - "eight-spoked_asterisk": "✳", - "eight-thirty": "🕣", - "eight_o’clock": "🕗", - "eject_button": "â", - "electric_plug": "🔌", - "elephant": "ðŸ˜", - "eleven-thirty": "🕦", - "eleven_o’clock": "🕚", - "elf": "ðŸ§", - "elf_dark_skin_tone": "ðŸ§ðŸ¿", - "elf_light_skin_tone": "ðŸ§ðŸ»", - "elf_medium-dark_skin_tone": "ðŸ§ðŸ¾", - "elf_medium-light_skin_tone": "ðŸ§ðŸ¼", - "elf_medium_skin_tone": "ðŸ§ðŸ½", - "envelope": "✉", - "envelope_with_arrow": "📩", - "euro_banknote": "💶", - "evergreen_tree": "🌲", - "ewe": "ðŸ‘", - "exclamation_mark": "â—", - "exclamation_question_mark": "â‰", - "exploding_head": "🤯", - "expressionless_face": "😑", - "eye": "ðŸ‘", - "eye_in_speech_bubble": "ðŸ‘ï¸\u200d🗨ï¸", - "eyes": "👀", - "face_blowing_a_kiss": "😘", - "face_savoring_food": "😋", - "face_screaming_in_fear": "😱", - "face_vomiting": "🤮", - "face_with_hand_over_mouth": "🤭", - "face_with_head-bandage": "🤕", - "face_with_medical_mask": "😷", - "face_with_monocle": "ðŸ§", - "face_with_open_mouth": "😮", - "face_with_raised_eyebrow": "🤨", - "face_with_rolling_eyes": "🙄", - "face_with_steam_from_nose": "😤", - "face_with_symbols_on_mouth": "🤬", - "face_with_tears_of_joy": "😂", - "face_with_thermometer": "🤒", - "face_with_tongue": "😛", - "face_without_mouth": "😶", - "factory": "ðŸ­", - "fairy": "🧚", - "fairy_dark_skin_tone": "🧚ðŸ¿", - "fairy_light_skin_tone": "🧚ðŸ»", - "fairy_medium-dark_skin_tone": "🧚ðŸ¾", - "fairy_medium-light_skin_tone": "🧚ðŸ¼", - "fairy_medium_skin_tone": "🧚ðŸ½", - "falafel": "🧆", - "fallen_leaf": "ðŸ‚", - "family": "👪", - "family_man_boy": "👨\u200d👦", - "family_man_boy_boy": "👨\u200d👦\u200d👦", - "family_man_girl": "👨\u200d👧", - "family_man_girl_boy": "👨\u200d👧\u200d👦", - "family_man_girl_girl": "👨\u200d👧\u200d👧", - "family_man_man_boy": "👨\u200d👨\u200d👦", - "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦", - "family_man_man_girl": "👨\u200d👨\u200d👧", - "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦", - "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧", - "family_man_woman_boy": "👨\u200d👩\u200d👦", - "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦", - "family_man_woman_girl": "👨\u200d👩\u200d👧", - "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦", - "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧", - "family_woman_boy": "👩\u200d👦", - "family_woman_boy_boy": "👩\u200d👦\u200d👦", - "family_woman_girl": "👩\u200d👧", - "family_woman_girl_boy": "👩\u200d👧\u200d👦", - "family_woman_girl_girl": "👩\u200d👧\u200d👧", - "family_woman_woman_boy": "👩\u200d👩\u200d👦", - "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦", - "family_woman_woman_girl": "👩\u200d👩\u200d👧", - "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦", - "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧", - "fast-forward_button": "â©", - "fast_down_button": "â¬", - "fast_reverse_button": "âª", - "fast_up_button": "â«", - "fax_machine": "📠", - "fearful_face": "😨", - "female_sign": "♀", - "ferris_wheel": "🎡", - "ferry": "â›´", - "field_hockey": "ðŸ‘", - "file_cabinet": "🗄", - "file_folder": "ðŸ“", - "film_frames": "🎞", - "film_projector": "📽", - "fire": "🔥", - "fire_extinguisher": "🧯", - "firecracker": "🧨", - "fire_engine": "🚒", - "fireworks": "🎆", - "first_quarter_moon": "🌓", - "first_quarter_moon_face": "🌛", - "fish": "ðŸŸ", - "fish_cake_with_swirl": "ðŸ¥", - "fishing_pole": "🎣", - "five-thirty": "🕠", - "five_o’clock": "🕔", - "flag_in_hole": "⛳", - "flamingo": "🦩", - "flashlight": "🔦", - "flat_shoe": "🥿", - "fleur-de-lis": "âšœ", - "flexed_biceps": "💪", - "flexed_biceps_dark_skin_tone": "💪ðŸ¿", - "flexed_biceps_light_skin_tone": "💪ðŸ»", - "flexed_biceps_medium-dark_skin_tone": "💪ðŸ¾", - "flexed_biceps_medium-light_skin_tone": "💪ðŸ¼", - "flexed_biceps_medium_skin_tone": "💪ðŸ½", - "floppy_disk": "💾", - "flower_playing_cards": "🎴", - "flushed_face": "😳", - "flying_disc": "ðŸ¥", - "flying_saucer": "🛸", - "fog": "🌫", - "foggy": "ðŸŒ", - "folded_hands": "ðŸ™", - "folded_hands_dark_skin_tone": "ðŸ™ðŸ¿", - "folded_hands_light_skin_tone": "ðŸ™ðŸ»", - "folded_hands_medium-dark_skin_tone": "ðŸ™ðŸ¾", - "folded_hands_medium-light_skin_tone": "ðŸ™ðŸ¼", - "folded_hands_medium_skin_tone": "ðŸ™ðŸ½", - "foot": "🦶", - "footprints": "👣", - "fork_and_knife": "ðŸ´", - "fork_and_knife_with_plate": "ðŸ½", - "fortune_cookie": "🥠", - "fountain": "⛲", - "fountain_pen": "🖋", - "four-thirty": "🕟", - "four_leaf_clover": "ðŸ€", - "four_o’clock": "🕓", - "fox_face": "🦊", - "framed_picture": "🖼", - "french_fries": "ðŸŸ", - "fried_shrimp": "ðŸ¤", - "frog_face": "ðŸ¸", - "front-facing_baby_chick": "ðŸ¥", - "frowning_face": "☹", - "frowning_face_with_open_mouth": "😦", - "fuel_pump": "⛽", - "full_moon": "🌕", - "full_moon_face": "ðŸŒ", - "funeral_urn": "âš±", - "game_die": "🎲", - "garlic": "🧄", - "gear": "âš™", - "gem_stone": "💎", - "genie": "🧞", - "ghost": "👻", - "giraffe": "🦒", - "girl": "👧", - "girl_dark_skin_tone": "👧ðŸ¿", - "girl_light_skin_tone": "👧ðŸ»", - "girl_medium-dark_skin_tone": "👧ðŸ¾", - "girl_medium-light_skin_tone": "👧ðŸ¼", - "girl_medium_skin_tone": "👧ðŸ½", - "glass_of_milk": "🥛", - "glasses": "👓", - "globe_showing_americas": "🌎", - "globe_showing_asia-australia": "ðŸŒ", - "globe_showing_europe-africa": "ðŸŒ", - "globe_with_meridians": "ðŸŒ", - "gloves": "🧤", - "glowing_star": "🌟", - "goal_net": "🥅", - "goat": "ðŸ", - "goblin": "👺", - "goggles": "🥽", - "gorilla": "ðŸ¦", - "graduation_cap": "🎓", - "grapes": "ðŸ‡", - "green_apple": "ðŸ", - "green_book": "📗", - "green_circle": "🟢", - "green_heart": "💚", - "green_salad": "🥗", - "green_square": "🟩", - "grimacing_face": "😬", - "grinning_cat_face": "😺", - "grinning_cat_face_with_smiling_eyes": "😸", - "grinning_face": "😀", - "grinning_face_with_big_eyes": "😃", - "grinning_face_with_smiling_eyes": "😄", - "grinning_face_with_sweat": "😅", - "grinning_squinting_face": "😆", - "growing_heart": "💗", - "guard": "💂", - "guard_dark_skin_tone": "💂ðŸ¿", - "guard_light_skin_tone": "💂ðŸ»", - "guard_medium-dark_skin_tone": "💂ðŸ¾", - "guard_medium-light_skin_tone": "💂ðŸ¼", - "guard_medium_skin_tone": "💂ðŸ½", - "guide_dog": "🦮", - "guitar": "🎸", - "hamburger": "ðŸ”", - "hammer": "🔨", - "hammer_and_pick": "âš’", - "hammer_and_wrench": "🛠", - "hamster_face": "ðŸ¹", - "hand_with_fingers_splayed": "ðŸ–", - "hand_with_fingers_splayed_dark_skin_tone": "ðŸ–ðŸ¿", - "hand_with_fingers_splayed_light_skin_tone": "ðŸ–ðŸ»", - "hand_with_fingers_splayed_medium-dark_skin_tone": "ðŸ–ðŸ¾", - "hand_with_fingers_splayed_medium-light_skin_tone": "ðŸ–ðŸ¼", - "hand_with_fingers_splayed_medium_skin_tone": "ðŸ–ðŸ½", - "handbag": "👜", - "handshake": "ðŸ¤", - "hatching_chick": "ðŸ£", - "headphone": "🎧", - "hear-no-evil_monkey": "🙉", - "heart_decoration": "💟", - "heart_suit": "♥", - "heart_with_arrow": "💘", - "heart_with_ribbon": "ðŸ’", - "heavy_check_mark": "✔", - "heavy_division_sign": "âž—", - "heavy_dollar_sign": "💲", - "heavy_heart_exclamation": "â£", - "heavy_large_circle": "â­•", - "heavy_minus_sign": "âž–", - "heavy_multiplication_x": "✖", - "heavy_plus_sign": "âž•", - "hedgehog": "🦔", - "helicopter": "ðŸš", - "herb": "🌿", - "hibiscus": "🌺", - "high-heeled_shoe": "👠", - "high-speed_train": "🚄", - "high_voltage": "âš¡", - "hiking_boot": "🥾", - "hindu_temple": "🛕", - "hippopotamus": "🦛", - "hole": "🕳", - "honey_pot": "ðŸ¯", - "honeybee": "ðŸ", - "horizontal_traffic_light": "🚥", - "horse": "ðŸ´", - "horse_face": "ðŸ´", - "horse_racing": "ðŸ‡", - "horse_racing_dark_skin_tone": "ðŸ‡ðŸ¿", - "horse_racing_light_skin_tone": "ðŸ‡ðŸ»", - "horse_racing_medium-dark_skin_tone": "ðŸ‡ðŸ¾", - "horse_racing_medium-light_skin_tone": "ðŸ‡ðŸ¼", - "horse_racing_medium_skin_tone": "ðŸ‡ðŸ½", - "hospital": "ðŸ¥", - "hot_beverage": "☕", - "hot_dog": "🌭", - "hot_face": "🥵", - "hot_pepper": "🌶", - "hot_springs": "♨", - "hotel": "ðŸ¨", - "hourglass_done": "⌛", - "hourglass_not_done": "â³", - "house": "ðŸ ", - "house_with_garden": "ðŸ¡", - "houses": "ðŸ˜", - "hugging_face": "🤗", - "hundred_points": "💯", - "hushed_face": "😯", - "ice": "🧊", - "ice_cream": "ðŸ¨", - "ice_hockey": "ðŸ’", - "ice_skate": "⛸", - "inbox_tray": "📥", - "incoming_envelope": "📨", - "index_pointing_up": "â˜", - "index_pointing_up_dark_skin_tone": "â˜ðŸ¿", - "index_pointing_up_light_skin_tone": "â˜ðŸ»", - "index_pointing_up_medium-dark_skin_tone": "â˜ðŸ¾", - "index_pointing_up_medium-light_skin_tone": "â˜ðŸ¼", - "index_pointing_up_medium_skin_tone": "â˜ðŸ½", - "infinity": "♾", - "information": "ℹ", - "input_latin_letters": "🔤", - "input_latin_lowercase": "🔡", - "input_latin_uppercase": "🔠", - "input_numbers": "🔢", - "input_symbols": "🔣", - "jack-o-lantern": "🎃", - "jeans": "👖", - "jigsaw": "🧩", - "joker": "ðŸƒ", - "joystick": "🕹", - "kaaba": "🕋", - "kangaroo": "🦘", - "key": "🔑", - "keyboard": "⌨", - "keycap_#": "#ï¸âƒ£", - "keycap_*": "*ï¸âƒ£", - "keycap_0": "0ï¸âƒ£", - "keycap_1": "1ï¸âƒ£", - "keycap_10": "🔟", - "keycap_2": "2ï¸âƒ£", - "keycap_3": "3ï¸âƒ£", - "keycap_4": "4ï¸âƒ£", - "keycap_5": "5ï¸âƒ£", - "keycap_6": "6ï¸âƒ£", - "keycap_7": "7ï¸âƒ£", - "keycap_8": "8ï¸âƒ£", - "keycap_9": "9ï¸âƒ£", - "kick_scooter": "🛴", - "kimono": "👘", - "kiss": "💋", - "kiss_man_man": "👨\u200dâ¤ï¸\u200d💋\u200d👨", - "kiss_mark": "💋", - "kiss_woman_man": "👩\u200dâ¤ï¸\u200d💋\u200d👨", - "kiss_woman_woman": "👩\u200dâ¤ï¸\u200d💋\u200d👩", - "kissing_cat_face": "😽", - "kissing_face": "😗", - "kissing_face_with_closed_eyes": "😚", - "kissing_face_with_smiling_eyes": "😙", - "kitchen_knife": "🔪", - "kite": "ðŸª", - "kiwi_fruit": "ðŸ¥", - "koala": "ðŸ¨", - "lab_coat": "🥼", - "label": "ðŸ·", - "lacrosse": "ðŸ¥", - "lady_beetle": "ðŸž", - "laptop_computer": "💻", - "large_blue_diamond": "🔷", - "large_orange_diamond": "🔶", - "last_quarter_moon": "🌗", - "last_quarter_moon_face": "🌜", - "last_track_button": "â®", - "latin_cross": "âœ", - "leaf_fluttering_in_wind": "ðŸƒ", - "leafy_green": "🥬", - "ledger": "📒", - "left-facing_fist": "🤛", - "left-facing_fist_dark_skin_tone": "🤛ðŸ¿", - "left-facing_fist_light_skin_tone": "🤛ðŸ»", - "left-facing_fist_medium-dark_skin_tone": "🤛ðŸ¾", - "left-facing_fist_medium-light_skin_tone": "🤛ðŸ¼", - "left-facing_fist_medium_skin_tone": "🤛ðŸ½", - "left-right_arrow": "↔", - "left_arrow": "⬅", - "left_arrow_curving_right": "↪", - "left_luggage": "🛅", - "left_speech_bubble": "🗨", - "leg": "🦵", - "lemon": "ðŸ‹", - "leopard": "ðŸ†", - "level_slider": "🎚", - "light_bulb": "💡", - "light_rail": "🚈", - "link": "🔗", - "linked_paperclips": "🖇", - "lion_face": "ðŸ¦", - "lipstick": "💄", - "litter_in_bin_sign": "🚮", - "lizard": "🦎", - "llama": "🦙", - "lobster": "🦞", - "locked": "🔒", - "locked_with_key": "ðŸ”", - "locked_with_pen": "ðŸ”", - "locomotive": "🚂", - "lollipop": "ðŸ­", - "lotion_bottle": "🧴", - "loudly_crying_face": "😭", - "loudspeaker": "📢", - "love-you_gesture": "🤟", - "love-you_gesture_dark_skin_tone": "🤟ðŸ¿", - "love-you_gesture_light_skin_tone": "🤟ðŸ»", - "love-you_gesture_medium-dark_skin_tone": "🤟ðŸ¾", - "love-you_gesture_medium-light_skin_tone": "🤟ðŸ¼", - "love-you_gesture_medium_skin_tone": "🤟ðŸ½", - "love_hotel": "ðŸ©", - "love_letter": "💌", - "luggage": "🧳", - "lying_face": "🤥", - "mage": "🧙", - "mage_dark_skin_tone": "🧙ðŸ¿", - "mage_light_skin_tone": "🧙ðŸ»", - "mage_medium-dark_skin_tone": "🧙ðŸ¾", - "mage_medium-light_skin_tone": "🧙ðŸ¼", - "mage_medium_skin_tone": "🧙ðŸ½", - "magnet": "🧲", - "magnifying_glass_tilted_left": "ðŸ”", - "magnifying_glass_tilted_right": "🔎", - "mahjong_red_dragon": "🀄", - "male_sign": "♂", - "man": "👨", - "man_and_woman_holding_hands": "👫", - "man_artist": "👨\u200d🎨", - "man_artist_dark_skin_tone": "👨ðŸ¿\u200d🎨", - "man_artist_light_skin_tone": "👨ðŸ»\u200d🎨", - "man_artist_medium-dark_skin_tone": "👨ðŸ¾\u200d🎨", - "man_artist_medium-light_skin_tone": "👨ðŸ¼\u200d🎨", - "man_artist_medium_skin_tone": "👨ðŸ½\u200d🎨", - "man_astronaut": "👨\u200d🚀", - "man_astronaut_dark_skin_tone": "👨ðŸ¿\u200d🚀", - "man_astronaut_light_skin_tone": "👨ðŸ»\u200d🚀", - "man_astronaut_medium-dark_skin_tone": "👨ðŸ¾\u200d🚀", - "man_astronaut_medium-light_skin_tone": "👨ðŸ¼\u200d🚀", - "man_astronaut_medium_skin_tone": "👨ðŸ½\u200d🚀", - "man_biking": "🚴\u200d♂ï¸", - "man_biking_dark_skin_tone": "🚴ðŸ¿\u200d♂ï¸", - "man_biking_light_skin_tone": "🚴ðŸ»\u200d♂ï¸", - "man_biking_medium-dark_skin_tone": "🚴ðŸ¾\u200d♂ï¸", - "man_biking_medium-light_skin_tone": "🚴ðŸ¼\u200d♂ï¸", - "man_biking_medium_skin_tone": "🚴ðŸ½\u200d♂ï¸", - "man_bouncing_ball": "⛹ï¸\u200d♂ï¸", - "man_bouncing_ball_dark_skin_tone": "⛹ðŸ¿\u200d♂ï¸", - "man_bouncing_ball_light_skin_tone": "⛹ðŸ»\u200d♂ï¸", - "man_bouncing_ball_medium-dark_skin_tone": "⛹ðŸ¾\u200d♂ï¸", - "man_bouncing_ball_medium-light_skin_tone": "⛹ðŸ¼\u200d♂ï¸", - "man_bouncing_ball_medium_skin_tone": "⛹ðŸ½\u200d♂ï¸", - "man_bowing": "🙇\u200d♂ï¸", - "man_bowing_dark_skin_tone": "🙇ðŸ¿\u200d♂ï¸", - "man_bowing_light_skin_tone": "🙇ðŸ»\u200d♂ï¸", - "man_bowing_medium-dark_skin_tone": "🙇ðŸ¾\u200d♂ï¸", - "man_bowing_medium-light_skin_tone": "🙇ðŸ¼\u200d♂ï¸", - "man_bowing_medium_skin_tone": "🙇ðŸ½\u200d♂ï¸", - "man_cartwheeling": "🤸\u200d♂ï¸", - "man_cartwheeling_dark_skin_tone": "🤸ðŸ¿\u200d♂ï¸", - "man_cartwheeling_light_skin_tone": "🤸ðŸ»\u200d♂ï¸", - "man_cartwheeling_medium-dark_skin_tone": "🤸ðŸ¾\u200d♂ï¸", - "man_cartwheeling_medium-light_skin_tone": "🤸ðŸ¼\u200d♂ï¸", - "man_cartwheeling_medium_skin_tone": "🤸ðŸ½\u200d♂ï¸", - "man_climbing": "🧗\u200d♂ï¸", - "man_climbing_dark_skin_tone": "🧗ðŸ¿\u200d♂ï¸", - "man_climbing_light_skin_tone": "🧗ðŸ»\u200d♂ï¸", - "man_climbing_medium-dark_skin_tone": "🧗ðŸ¾\u200d♂ï¸", - "man_climbing_medium-light_skin_tone": "🧗ðŸ¼\u200d♂ï¸", - "man_climbing_medium_skin_tone": "🧗ðŸ½\u200d♂ï¸", - "man_construction_worker": "👷\u200d♂ï¸", - "man_construction_worker_dark_skin_tone": "👷ðŸ¿\u200d♂ï¸", - "man_construction_worker_light_skin_tone": "👷ðŸ»\u200d♂ï¸", - "man_construction_worker_medium-dark_skin_tone": "👷ðŸ¾\u200d♂ï¸", - "man_construction_worker_medium-light_skin_tone": "👷ðŸ¼\u200d♂ï¸", - "man_construction_worker_medium_skin_tone": "👷ðŸ½\u200d♂ï¸", - "man_cook": "👨\u200dðŸ³", - "man_cook_dark_skin_tone": "👨ðŸ¿\u200dðŸ³", - "man_cook_light_skin_tone": "👨ðŸ»\u200dðŸ³", - "man_cook_medium-dark_skin_tone": "👨ðŸ¾\u200dðŸ³", - "man_cook_medium-light_skin_tone": "👨ðŸ¼\u200dðŸ³", - "man_cook_medium_skin_tone": "👨ðŸ½\u200dðŸ³", - "man_dancing": "🕺", - "man_dancing_dark_skin_tone": "🕺ðŸ¿", - "man_dancing_light_skin_tone": "🕺ðŸ»", - "man_dancing_medium-dark_skin_tone": "🕺ðŸ¾", - "man_dancing_medium-light_skin_tone": "🕺ðŸ¼", - "man_dancing_medium_skin_tone": "🕺ðŸ½", - "man_dark_skin_tone": "👨ðŸ¿", - "man_detective": "🕵ï¸\u200d♂ï¸", - "man_detective_dark_skin_tone": "🕵ðŸ¿\u200d♂ï¸", - "man_detective_light_skin_tone": "🕵ðŸ»\u200d♂ï¸", - "man_detective_medium-dark_skin_tone": "🕵ðŸ¾\u200d♂ï¸", - "man_detective_medium-light_skin_tone": "🕵ðŸ¼\u200d♂ï¸", - "man_detective_medium_skin_tone": "🕵ðŸ½\u200d♂ï¸", - "man_elf": "ðŸ§\u200d♂ï¸", - "man_elf_dark_skin_tone": "ðŸ§ðŸ¿\u200d♂ï¸", - "man_elf_light_skin_tone": "ðŸ§ðŸ»\u200d♂ï¸", - "man_elf_medium-dark_skin_tone": "ðŸ§ðŸ¾\u200d♂ï¸", - "man_elf_medium-light_skin_tone": "ðŸ§ðŸ¼\u200d♂ï¸", - "man_elf_medium_skin_tone": "ðŸ§ðŸ½\u200d♂ï¸", - "man_facepalming": "🤦\u200d♂ï¸", - "man_facepalming_dark_skin_tone": "🤦ðŸ¿\u200d♂ï¸", - "man_facepalming_light_skin_tone": "🤦ðŸ»\u200d♂ï¸", - "man_facepalming_medium-dark_skin_tone": "🤦ðŸ¾\u200d♂ï¸", - "man_facepalming_medium-light_skin_tone": "🤦ðŸ¼\u200d♂ï¸", - "man_facepalming_medium_skin_tone": "🤦ðŸ½\u200d♂ï¸", - "man_factory_worker": "👨\u200dðŸ­", - "man_factory_worker_dark_skin_tone": "👨ðŸ¿\u200dðŸ­", - "man_factory_worker_light_skin_tone": "👨ðŸ»\u200dðŸ­", - "man_factory_worker_medium-dark_skin_tone": "👨ðŸ¾\u200dðŸ­", - "man_factory_worker_medium-light_skin_tone": "👨ðŸ¼\u200dðŸ­", - "man_factory_worker_medium_skin_tone": "👨ðŸ½\u200dðŸ­", - "man_fairy": "🧚\u200d♂ï¸", - "man_fairy_dark_skin_tone": "🧚ðŸ¿\u200d♂ï¸", - "man_fairy_light_skin_tone": "🧚ðŸ»\u200d♂ï¸", - "man_fairy_medium-dark_skin_tone": "🧚ðŸ¾\u200d♂ï¸", - "man_fairy_medium-light_skin_tone": "🧚ðŸ¼\u200d♂ï¸", - "man_fairy_medium_skin_tone": "🧚ðŸ½\u200d♂ï¸", - "man_farmer": "👨\u200d🌾", - "man_farmer_dark_skin_tone": "👨ðŸ¿\u200d🌾", - "man_farmer_light_skin_tone": "👨ðŸ»\u200d🌾", - "man_farmer_medium-dark_skin_tone": "👨ðŸ¾\u200d🌾", - "man_farmer_medium-light_skin_tone": "👨ðŸ¼\u200d🌾", - "man_farmer_medium_skin_tone": "👨ðŸ½\u200d🌾", - "man_firefighter": "👨\u200d🚒", - "man_firefighter_dark_skin_tone": "👨ðŸ¿\u200d🚒", - "man_firefighter_light_skin_tone": "👨ðŸ»\u200d🚒", - "man_firefighter_medium-dark_skin_tone": "👨ðŸ¾\u200d🚒", - "man_firefighter_medium-light_skin_tone": "👨ðŸ¼\u200d🚒", - "man_firefighter_medium_skin_tone": "👨ðŸ½\u200d🚒", - "man_frowning": "ðŸ™\u200d♂ï¸", - "man_frowning_dark_skin_tone": "ðŸ™ðŸ¿\u200d♂ï¸", - "man_frowning_light_skin_tone": "ðŸ™ðŸ»\u200d♂ï¸", - "man_frowning_medium-dark_skin_tone": "ðŸ™ðŸ¾\u200d♂ï¸", - "man_frowning_medium-light_skin_tone": "ðŸ™ðŸ¼\u200d♂ï¸", - "man_frowning_medium_skin_tone": "ðŸ™ðŸ½\u200d♂ï¸", - "man_genie": "🧞\u200d♂ï¸", - "man_gesturing_no": "🙅\u200d♂ï¸", - "man_gesturing_no_dark_skin_tone": "🙅ðŸ¿\u200d♂ï¸", - "man_gesturing_no_light_skin_tone": "🙅ðŸ»\u200d♂ï¸", - "man_gesturing_no_medium-dark_skin_tone": "🙅ðŸ¾\u200d♂ï¸", - "man_gesturing_no_medium-light_skin_tone": "🙅ðŸ¼\u200d♂ï¸", - "man_gesturing_no_medium_skin_tone": "🙅ðŸ½\u200d♂ï¸", - "man_gesturing_ok": "🙆\u200d♂ï¸", - "man_gesturing_ok_dark_skin_tone": "🙆ðŸ¿\u200d♂ï¸", - "man_gesturing_ok_light_skin_tone": "🙆ðŸ»\u200d♂ï¸", - "man_gesturing_ok_medium-dark_skin_tone": "🙆ðŸ¾\u200d♂ï¸", - "man_gesturing_ok_medium-light_skin_tone": "🙆ðŸ¼\u200d♂ï¸", - "man_gesturing_ok_medium_skin_tone": "🙆ðŸ½\u200d♂ï¸", - "man_getting_haircut": "💇\u200d♂ï¸", - "man_getting_haircut_dark_skin_tone": "💇ðŸ¿\u200d♂ï¸", - "man_getting_haircut_light_skin_tone": "💇ðŸ»\u200d♂ï¸", - "man_getting_haircut_medium-dark_skin_tone": "💇ðŸ¾\u200d♂ï¸", - "man_getting_haircut_medium-light_skin_tone": "💇ðŸ¼\u200d♂ï¸", - "man_getting_haircut_medium_skin_tone": "💇ðŸ½\u200d♂ï¸", - "man_getting_massage": "💆\u200d♂ï¸", - "man_getting_massage_dark_skin_tone": "💆ðŸ¿\u200d♂ï¸", - "man_getting_massage_light_skin_tone": "💆ðŸ»\u200d♂ï¸", - "man_getting_massage_medium-dark_skin_tone": "💆ðŸ¾\u200d♂ï¸", - "man_getting_massage_medium-light_skin_tone": "💆ðŸ¼\u200d♂ï¸", - "man_getting_massage_medium_skin_tone": "💆ðŸ½\u200d♂ï¸", - "man_golfing": "ðŸŒï¸\u200d♂ï¸", - "man_golfing_dark_skin_tone": "ðŸŒðŸ¿\u200d♂ï¸", - "man_golfing_light_skin_tone": "ðŸŒðŸ»\u200d♂ï¸", - "man_golfing_medium-dark_skin_tone": "ðŸŒðŸ¾\u200d♂ï¸", - "man_golfing_medium-light_skin_tone": "ðŸŒðŸ¼\u200d♂ï¸", - "man_golfing_medium_skin_tone": "ðŸŒðŸ½\u200d♂ï¸", - "man_guard": "💂\u200d♂ï¸", - "man_guard_dark_skin_tone": "💂ðŸ¿\u200d♂ï¸", - "man_guard_light_skin_tone": "💂ðŸ»\u200d♂ï¸", - "man_guard_medium-dark_skin_tone": "💂ðŸ¾\u200d♂ï¸", - "man_guard_medium-light_skin_tone": "💂ðŸ¼\u200d♂ï¸", - "man_guard_medium_skin_tone": "💂ðŸ½\u200d♂ï¸", - "man_health_worker": "👨\u200dâš•ï¸", - "man_health_worker_dark_skin_tone": "👨ðŸ¿\u200dâš•ï¸", - "man_health_worker_light_skin_tone": "👨ðŸ»\u200dâš•ï¸", - "man_health_worker_medium-dark_skin_tone": "👨ðŸ¾\u200dâš•ï¸", - "man_health_worker_medium-light_skin_tone": "👨ðŸ¼\u200dâš•ï¸", - "man_health_worker_medium_skin_tone": "👨ðŸ½\u200dâš•ï¸", - "man_in_lotus_position": "🧘\u200d♂ï¸", - "man_in_lotus_position_dark_skin_tone": "🧘ðŸ¿\u200d♂ï¸", - "man_in_lotus_position_light_skin_tone": "🧘ðŸ»\u200d♂ï¸", - "man_in_lotus_position_medium-dark_skin_tone": "🧘ðŸ¾\u200d♂ï¸", - "man_in_lotus_position_medium-light_skin_tone": "🧘ðŸ¼\u200d♂ï¸", - "man_in_lotus_position_medium_skin_tone": "🧘ðŸ½\u200d♂ï¸", - "man_in_manual_wheelchair": "👨\u200d🦽", - "man_in_motorized_wheelchair": "👨\u200d🦼", - "man_in_steamy_room": "🧖\u200d♂ï¸", - "man_in_steamy_room_dark_skin_tone": "🧖ðŸ¿\u200d♂ï¸", - "man_in_steamy_room_light_skin_tone": "🧖ðŸ»\u200d♂ï¸", - "man_in_steamy_room_medium-dark_skin_tone": "🧖ðŸ¾\u200d♂ï¸", - "man_in_steamy_room_medium-light_skin_tone": "🧖ðŸ¼\u200d♂ï¸", - "man_in_steamy_room_medium_skin_tone": "🧖ðŸ½\u200d♂ï¸", - "man_in_suit_levitating": "🕴", - "man_in_suit_levitating_dark_skin_tone": "🕴ðŸ¿", - "man_in_suit_levitating_light_skin_tone": "🕴ðŸ»", - "man_in_suit_levitating_medium-dark_skin_tone": "🕴ðŸ¾", - "man_in_suit_levitating_medium-light_skin_tone": "🕴ðŸ¼", - "man_in_suit_levitating_medium_skin_tone": "🕴ðŸ½", - "man_in_tuxedo": "🤵", - "man_in_tuxedo_dark_skin_tone": "🤵ðŸ¿", - "man_in_tuxedo_light_skin_tone": "🤵ðŸ»", - "man_in_tuxedo_medium-dark_skin_tone": "🤵ðŸ¾", - "man_in_tuxedo_medium-light_skin_tone": "🤵ðŸ¼", - "man_in_tuxedo_medium_skin_tone": "🤵ðŸ½", - "man_judge": "👨\u200dâš–ï¸", - "man_judge_dark_skin_tone": "👨ðŸ¿\u200dâš–ï¸", - "man_judge_light_skin_tone": "👨ðŸ»\u200dâš–ï¸", - "man_judge_medium-dark_skin_tone": "👨ðŸ¾\u200dâš–ï¸", - "man_judge_medium-light_skin_tone": "👨ðŸ¼\u200dâš–ï¸", - "man_judge_medium_skin_tone": "👨ðŸ½\u200dâš–ï¸", - "man_juggling": "🤹\u200d♂ï¸", - "man_juggling_dark_skin_tone": "🤹ðŸ¿\u200d♂ï¸", - "man_juggling_light_skin_tone": "🤹ðŸ»\u200d♂ï¸", - "man_juggling_medium-dark_skin_tone": "🤹ðŸ¾\u200d♂ï¸", - "man_juggling_medium-light_skin_tone": "🤹ðŸ¼\u200d♂ï¸", - "man_juggling_medium_skin_tone": "🤹ðŸ½\u200d♂ï¸", - "man_lifting_weights": "ðŸ‹ï¸\u200d♂ï¸", - "man_lifting_weights_dark_skin_tone": "ðŸ‹ðŸ¿\u200d♂ï¸", - "man_lifting_weights_light_skin_tone": "ðŸ‹ðŸ»\u200d♂ï¸", - "man_lifting_weights_medium-dark_skin_tone": "ðŸ‹ðŸ¾\u200d♂ï¸", - "man_lifting_weights_medium-light_skin_tone": "ðŸ‹ðŸ¼\u200d♂ï¸", - "man_lifting_weights_medium_skin_tone": "ðŸ‹ðŸ½\u200d♂ï¸", - "man_light_skin_tone": "👨ðŸ»", - "man_mage": "🧙\u200d♂ï¸", - "man_mage_dark_skin_tone": "🧙ðŸ¿\u200d♂ï¸", - "man_mage_light_skin_tone": "🧙ðŸ»\u200d♂ï¸", - "man_mage_medium-dark_skin_tone": "🧙ðŸ¾\u200d♂ï¸", - "man_mage_medium-light_skin_tone": "🧙ðŸ¼\u200d♂ï¸", - "man_mage_medium_skin_tone": "🧙ðŸ½\u200d♂ï¸", - "man_mechanic": "👨\u200d🔧", - "man_mechanic_dark_skin_tone": "👨ðŸ¿\u200d🔧", - "man_mechanic_light_skin_tone": "👨ðŸ»\u200d🔧", - "man_mechanic_medium-dark_skin_tone": "👨ðŸ¾\u200d🔧", - "man_mechanic_medium-light_skin_tone": "👨ðŸ¼\u200d🔧", - "man_mechanic_medium_skin_tone": "👨ðŸ½\u200d🔧", - "man_medium-dark_skin_tone": "👨ðŸ¾", - "man_medium-light_skin_tone": "👨ðŸ¼", - "man_medium_skin_tone": "👨ðŸ½", - "man_mountain_biking": "🚵\u200d♂ï¸", - "man_mountain_biking_dark_skin_tone": "🚵ðŸ¿\u200d♂ï¸", - "man_mountain_biking_light_skin_tone": "🚵ðŸ»\u200d♂ï¸", - "man_mountain_biking_medium-dark_skin_tone": "🚵ðŸ¾\u200d♂ï¸", - "man_mountain_biking_medium-light_skin_tone": "🚵ðŸ¼\u200d♂ï¸", - "man_mountain_biking_medium_skin_tone": "🚵ðŸ½\u200d♂ï¸", - "man_office_worker": "👨\u200d💼", - "man_office_worker_dark_skin_tone": "👨ðŸ¿\u200d💼", - "man_office_worker_light_skin_tone": "👨ðŸ»\u200d💼", - "man_office_worker_medium-dark_skin_tone": "👨ðŸ¾\u200d💼", - "man_office_worker_medium-light_skin_tone": "👨ðŸ¼\u200d💼", - "man_office_worker_medium_skin_tone": "👨ðŸ½\u200d💼", - "man_pilot": "👨\u200d✈ï¸", - "man_pilot_dark_skin_tone": "👨ðŸ¿\u200d✈ï¸", - "man_pilot_light_skin_tone": "👨ðŸ»\u200d✈ï¸", - "man_pilot_medium-dark_skin_tone": "👨ðŸ¾\u200d✈ï¸", - "man_pilot_medium-light_skin_tone": "👨ðŸ¼\u200d✈ï¸", - "man_pilot_medium_skin_tone": "👨ðŸ½\u200d✈ï¸", - "man_playing_handball": "🤾\u200d♂ï¸", - "man_playing_handball_dark_skin_tone": "🤾ðŸ¿\u200d♂ï¸", - "man_playing_handball_light_skin_tone": "🤾ðŸ»\u200d♂ï¸", - "man_playing_handball_medium-dark_skin_tone": "🤾ðŸ¾\u200d♂ï¸", - "man_playing_handball_medium-light_skin_tone": "🤾ðŸ¼\u200d♂ï¸", - "man_playing_handball_medium_skin_tone": "🤾ðŸ½\u200d♂ï¸", - "man_playing_water_polo": "🤽\u200d♂ï¸", - "man_playing_water_polo_dark_skin_tone": "🤽ðŸ¿\u200d♂ï¸", - "man_playing_water_polo_light_skin_tone": "🤽ðŸ»\u200d♂ï¸", - "man_playing_water_polo_medium-dark_skin_tone": "🤽ðŸ¾\u200d♂ï¸", - "man_playing_water_polo_medium-light_skin_tone": "🤽ðŸ¼\u200d♂ï¸", - "man_playing_water_polo_medium_skin_tone": "🤽ðŸ½\u200d♂ï¸", - "man_police_officer": "👮\u200d♂ï¸", - "man_police_officer_dark_skin_tone": "👮ðŸ¿\u200d♂ï¸", - "man_police_officer_light_skin_tone": "👮ðŸ»\u200d♂ï¸", - "man_police_officer_medium-dark_skin_tone": "👮ðŸ¾\u200d♂ï¸", - "man_police_officer_medium-light_skin_tone": "👮ðŸ¼\u200d♂ï¸", - "man_police_officer_medium_skin_tone": "👮ðŸ½\u200d♂ï¸", - "man_pouting": "🙎\u200d♂ï¸", - "man_pouting_dark_skin_tone": "🙎ðŸ¿\u200d♂ï¸", - "man_pouting_light_skin_tone": "🙎ðŸ»\u200d♂ï¸", - "man_pouting_medium-dark_skin_tone": "🙎ðŸ¾\u200d♂ï¸", - "man_pouting_medium-light_skin_tone": "🙎ðŸ¼\u200d♂ï¸", - "man_pouting_medium_skin_tone": "🙎ðŸ½\u200d♂ï¸", - "man_raising_hand": "🙋\u200d♂ï¸", - "man_raising_hand_dark_skin_tone": "🙋ðŸ¿\u200d♂ï¸", - "man_raising_hand_light_skin_tone": "🙋ðŸ»\u200d♂ï¸", - "man_raising_hand_medium-dark_skin_tone": "🙋ðŸ¾\u200d♂ï¸", - "man_raising_hand_medium-light_skin_tone": "🙋ðŸ¼\u200d♂ï¸", - "man_raising_hand_medium_skin_tone": "🙋ðŸ½\u200d♂ï¸", - "man_rowing_boat": "🚣\u200d♂ï¸", - "man_rowing_boat_dark_skin_tone": "🚣ðŸ¿\u200d♂ï¸", - "man_rowing_boat_light_skin_tone": "🚣ðŸ»\u200d♂ï¸", - "man_rowing_boat_medium-dark_skin_tone": "🚣ðŸ¾\u200d♂ï¸", - "man_rowing_boat_medium-light_skin_tone": "🚣ðŸ¼\u200d♂ï¸", - "man_rowing_boat_medium_skin_tone": "🚣ðŸ½\u200d♂ï¸", - "man_running": "ðŸƒ\u200d♂ï¸", - "man_running_dark_skin_tone": "ðŸƒðŸ¿\u200d♂ï¸", - "man_running_light_skin_tone": "ðŸƒðŸ»\u200d♂ï¸", - "man_running_medium-dark_skin_tone": "ðŸƒðŸ¾\u200d♂ï¸", - "man_running_medium-light_skin_tone": "ðŸƒðŸ¼\u200d♂ï¸", - "man_running_medium_skin_tone": "ðŸƒðŸ½\u200d♂ï¸", - "man_scientist": "👨\u200d🔬", - "man_scientist_dark_skin_tone": "👨ðŸ¿\u200d🔬", - "man_scientist_light_skin_tone": "👨ðŸ»\u200d🔬", - "man_scientist_medium-dark_skin_tone": "👨ðŸ¾\u200d🔬", - "man_scientist_medium-light_skin_tone": "👨ðŸ¼\u200d🔬", - "man_scientist_medium_skin_tone": "👨ðŸ½\u200d🔬", - "man_shrugging": "🤷\u200d♂ï¸", - "man_shrugging_dark_skin_tone": "🤷ðŸ¿\u200d♂ï¸", - "man_shrugging_light_skin_tone": "🤷ðŸ»\u200d♂ï¸", - "man_shrugging_medium-dark_skin_tone": "🤷ðŸ¾\u200d♂ï¸", - "man_shrugging_medium-light_skin_tone": "🤷ðŸ¼\u200d♂ï¸", - "man_shrugging_medium_skin_tone": "🤷ðŸ½\u200d♂ï¸", - "man_singer": "👨\u200d🎤", - "man_singer_dark_skin_tone": "👨ðŸ¿\u200d🎤", - "man_singer_light_skin_tone": "👨ðŸ»\u200d🎤", - "man_singer_medium-dark_skin_tone": "👨ðŸ¾\u200d🎤", - "man_singer_medium-light_skin_tone": "👨ðŸ¼\u200d🎤", - "man_singer_medium_skin_tone": "👨ðŸ½\u200d🎤", - "man_student": "👨\u200d🎓", - "man_student_dark_skin_tone": "👨ðŸ¿\u200d🎓", - "man_student_light_skin_tone": "👨ðŸ»\u200d🎓", - "man_student_medium-dark_skin_tone": "👨ðŸ¾\u200d🎓", - "man_student_medium-light_skin_tone": "👨ðŸ¼\u200d🎓", - "man_student_medium_skin_tone": "👨ðŸ½\u200d🎓", - "man_surfing": "ðŸ„\u200d♂ï¸", - "man_surfing_dark_skin_tone": "ðŸ„ðŸ¿\u200d♂ï¸", - "man_surfing_light_skin_tone": "ðŸ„ðŸ»\u200d♂ï¸", - "man_surfing_medium-dark_skin_tone": "ðŸ„ðŸ¾\u200d♂ï¸", - "man_surfing_medium-light_skin_tone": "ðŸ„ðŸ¼\u200d♂ï¸", - "man_surfing_medium_skin_tone": "ðŸ„ðŸ½\u200d♂ï¸", - "man_swimming": "ðŸŠ\u200d♂ï¸", - "man_swimming_dark_skin_tone": "ðŸŠðŸ¿\u200d♂ï¸", - "man_swimming_light_skin_tone": "ðŸŠðŸ»\u200d♂ï¸", - "man_swimming_medium-dark_skin_tone": "ðŸŠðŸ¾\u200d♂ï¸", - "man_swimming_medium-light_skin_tone": "ðŸŠðŸ¼\u200d♂ï¸", - "man_swimming_medium_skin_tone": "ðŸŠðŸ½\u200d♂ï¸", - "man_teacher": "👨\u200dðŸ«", - "man_teacher_dark_skin_tone": "👨ðŸ¿\u200dðŸ«", - "man_teacher_light_skin_tone": "👨ðŸ»\u200dðŸ«", - "man_teacher_medium-dark_skin_tone": "👨ðŸ¾\u200dðŸ«", - "man_teacher_medium-light_skin_tone": "👨ðŸ¼\u200dðŸ«", - "man_teacher_medium_skin_tone": "👨ðŸ½\u200dðŸ«", - "man_technologist": "👨\u200d💻", - "man_technologist_dark_skin_tone": "👨ðŸ¿\u200d💻", - "man_technologist_light_skin_tone": "👨ðŸ»\u200d💻", - "man_technologist_medium-dark_skin_tone": "👨ðŸ¾\u200d💻", - "man_technologist_medium-light_skin_tone": "👨ðŸ¼\u200d💻", - "man_technologist_medium_skin_tone": "👨ðŸ½\u200d💻", - "man_tipping_hand": "ðŸ’\u200d♂ï¸", - "man_tipping_hand_dark_skin_tone": "ðŸ’ðŸ¿\u200d♂ï¸", - "man_tipping_hand_light_skin_tone": "ðŸ’ðŸ»\u200d♂ï¸", - "man_tipping_hand_medium-dark_skin_tone": "ðŸ’ðŸ¾\u200d♂ï¸", - "man_tipping_hand_medium-light_skin_tone": "ðŸ’ðŸ¼\u200d♂ï¸", - "man_tipping_hand_medium_skin_tone": "ðŸ’ðŸ½\u200d♂ï¸", - "man_vampire": "🧛\u200d♂ï¸", - "man_vampire_dark_skin_tone": "🧛ðŸ¿\u200d♂ï¸", - "man_vampire_light_skin_tone": "🧛ðŸ»\u200d♂ï¸", - "man_vampire_medium-dark_skin_tone": "🧛ðŸ¾\u200d♂ï¸", - "man_vampire_medium-light_skin_tone": "🧛ðŸ¼\u200d♂ï¸", - "man_vampire_medium_skin_tone": "🧛ðŸ½\u200d♂ï¸", - "man_walking": "🚶\u200d♂ï¸", - "man_walking_dark_skin_tone": "🚶ðŸ¿\u200d♂ï¸", - "man_walking_light_skin_tone": "🚶ðŸ»\u200d♂ï¸", - "man_walking_medium-dark_skin_tone": "🚶ðŸ¾\u200d♂ï¸", - "man_walking_medium-light_skin_tone": "🚶ðŸ¼\u200d♂ï¸", - "man_walking_medium_skin_tone": "🚶ðŸ½\u200d♂ï¸", - "man_wearing_turban": "👳\u200d♂ï¸", - "man_wearing_turban_dark_skin_tone": "👳ðŸ¿\u200d♂ï¸", - "man_wearing_turban_light_skin_tone": "👳ðŸ»\u200d♂ï¸", - "man_wearing_turban_medium-dark_skin_tone": "👳ðŸ¾\u200d♂ï¸", - "man_wearing_turban_medium-light_skin_tone": "👳ðŸ¼\u200d♂ï¸", - "man_wearing_turban_medium_skin_tone": "👳ðŸ½\u200d♂ï¸", - "man_with_probing_cane": "👨\u200d🦯", - "man_with_chinese_cap": "👲", - "man_with_chinese_cap_dark_skin_tone": "👲ðŸ¿", - "man_with_chinese_cap_light_skin_tone": "👲ðŸ»", - "man_with_chinese_cap_medium-dark_skin_tone": "👲ðŸ¾", - "man_with_chinese_cap_medium-light_skin_tone": "👲ðŸ¼", - "man_with_chinese_cap_medium_skin_tone": "👲ðŸ½", - "man_zombie": "🧟\u200d♂ï¸", - "mango": "🥭", - "mantelpiece_clock": "🕰", - "manual_wheelchair": "🦽", - "man’s_shoe": "👞", - "map_of_japan": "🗾", - "maple_leaf": "ðŸ", - "martial_arts_uniform": "🥋", - "mate": "🧉", - "meat_on_bone": "ðŸ–", - "mechanical_arm": "🦾", - "mechanical_leg": "🦿", - "medical_symbol": "âš•", - "megaphone": "📣", - "melon": "ðŸˆ", - "memo": "ðŸ“", - "men_with_bunny_ears": "👯\u200d♂ï¸", - "men_wrestling": "🤼\u200d♂ï¸", - "menorah": "🕎", - "men’s_room": "🚹", - "mermaid": "🧜\u200d♀ï¸", - "mermaid_dark_skin_tone": "🧜ðŸ¿\u200d♀ï¸", - "mermaid_light_skin_tone": "🧜ðŸ»\u200d♀ï¸", - "mermaid_medium-dark_skin_tone": "🧜ðŸ¾\u200d♀ï¸", - "mermaid_medium-light_skin_tone": "🧜ðŸ¼\u200d♀ï¸", - "mermaid_medium_skin_tone": "🧜ðŸ½\u200d♀ï¸", - "merman": "🧜\u200d♂ï¸", - "merman_dark_skin_tone": "🧜ðŸ¿\u200d♂ï¸", - "merman_light_skin_tone": "🧜ðŸ»\u200d♂ï¸", - "merman_medium-dark_skin_tone": "🧜ðŸ¾\u200d♂ï¸", - "merman_medium-light_skin_tone": "🧜ðŸ¼\u200d♂ï¸", - "merman_medium_skin_tone": "🧜ðŸ½\u200d♂ï¸", - "merperson": "🧜", - "merperson_dark_skin_tone": "🧜ðŸ¿", - "merperson_light_skin_tone": "🧜ðŸ»", - "merperson_medium-dark_skin_tone": "🧜ðŸ¾", - "merperson_medium-light_skin_tone": "🧜ðŸ¼", - "merperson_medium_skin_tone": "🧜ðŸ½", - "metro": "🚇", - "microbe": "🦠", - "microphone": "🎤", - "microscope": "🔬", - "middle_finger": "🖕", - "middle_finger_dark_skin_tone": "🖕ðŸ¿", - "middle_finger_light_skin_tone": "🖕ðŸ»", - "middle_finger_medium-dark_skin_tone": "🖕ðŸ¾", - "middle_finger_medium-light_skin_tone": "🖕ðŸ¼", - "middle_finger_medium_skin_tone": "🖕ðŸ½", - "military_medal": "🎖", - "milky_way": "🌌", - "minibus": "ðŸš", - "moai": "🗿", - "mobile_phone": "📱", - "mobile_phone_off": "📴", - "mobile_phone_with_arrow": "📲", - "money-mouth_face": "🤑", - "money_bag": "💰", - "money_with_wings": "💸", - "monkey": "ðŸ’", - "monkey_face": "ðŸµ", - "monorail": "ðŸš", - "moon_cake": "🥮", - "moon_viewing_ceremony": "🎑", - "mosque": "🕌", - "mosquito": "🦟", - "motor_boat": "🛥", - "motor_scooter": "🛵", - "motorcycle": "ðŸ", - "motorized_wheelchair": "🦼", - "motorway": "🛣", - "mount_fuji": "🗻", - "mountain": "â›°", - "mountain_cableway": "🚠", - "mountain_railway": "🚞", - "mouse": "ðŸ­", - "mouse_face": "ðŸ­", - "mouth": "👄", - "movie_camera": "🎥", - "mushroom": "ðŸ„", - "musical_keyboard": "🎹", - "musical_note": "🎵", - "musical_notes": "🎶", - "musical_score": "🎼", - "muted_speaker": "🔇", - "nail_polish": "💅", - "nail_polish_dark_skin_tone": "💅ðŸ¿", - "nail_polish_light_skin_tone": "💅ðŸ»", - "nail_polish_medium-dark_skin_tone": "💅ðŸ¾", - "nail_polish_medium-light_skin_tone": "💅ðŸ¼", - "nail_polish_medium_skin_tone": "💅ðŸ½", - "name_badge": "📛", - "national_park": "ðŸž", - "nauseated_face": "🤢", - "nazar_amulet": "🧿", - "necktie": "👔", - "nerd_face": "🤓", - "neutral_face": "ðŸ˜", - "new_moon": "🌑", - "new_moon_face": "🌚", - "newspaper": "📰", - "next_track_button": "â­", - "night_with_stars": "🌃", - "nine-thirty": "🕤", - "nine_o’clock": "🕘", - "no_bicycles": "🚳", - "no_entry": "â›”", - "no_littering": "🚯", - "no_mobile_phones": "📵", - "no_one_under_eighteen": "🔞", - "no_pedestrians": "🚷", - "no_smoking": "🚭", - "non-potable_water": "🚱", - "nose": "👃", - "nose_dark_skin_tone": "👃ðŸ¿", - "nose_light_skin_tone": "👃ðŸ»", - "nose_medium-dark_skin_tone": "👃ðŸ¾", - "nose_medium-light_skin_tone": "👃ðŸ¼", - "nose_medium_skin_tone": "👃ðŸ½", - "notebook": "📓", - "notebook_with_decorative_cover": "📔", - "nut_and_bolt": "🔩", - "octopus": "ðŸ™", - "oden": "ðŸ¢", - "office_building": "ðŸ¢", - "ogre": "👹", - "oil_drum": "🛢", - "old_key": "ðŸ—", - "old_man": "👴", - "old_man_dark_skin_tone": "👴ðŸ¿", - "old_man_light_skin_tone": "👴ðŸ»", - "old_man_medium-dark_skin_tone": "👴ðŸ¾", - "old_man_medium-light_skin_tone": "👴ðŸ¼", - "old_man_medium_skin_tone": "👴ðŸ½", - "old_woman": "👵", - "old_woman_dark_skin_tone": "👵ðŸ¿", - "old_woman_light_skin_tone": "👵ðŸ»", - "old_woman_medium-dark_skin_tone": "👵ðŸ¾", - "old_woman_medium-light_skin_tone": "👵ðŸ¼", - "old_woman_medium_skin_tone": "👵ðŸ½", - "older_adult": "🧓", - "older_adult_dark_skin_tone": "🧓ðŸ¿", - "older_adult_light_skin_tone": "🧓ðŸ»", - "older_adult_medium-dark_skin_tone": "🧓ðŸ¾", - "older_adult_medium-light_skin_tone": "🧓ðŸ¼", - "older_adult_medium_skin_tone": "🧓ðŸ½", - "om": "🕉", - "oncoming_automobile": "🚘", - "oncoming_bus": "ðŸš", - "oncoming_fist": "👊", - "oncoming_fist_dark_skin_tone": "👊ðŸ¿", - "oncoming_fist_light_skin_tone": "👊ðŸ»", - "oncoming_fist_medium-dark_skin_tone": "👊ðŸ¾", - "oncoming_fist_medium-light_skin_tone": "👊ðŸ¼", - "oncoming_fist_medium_skin_tone": "👊ðŸ½", - "oncoming_police_car": "🚔", - "oncoming_taxi": "🚖", - "one-piece_swimsuit": "🩱", - "one-thirty": "🕜", - "one_o’clock": "ðŸ•", - "onion": "🧅", - "open_book": "📖", - "open_file_folder": "📂", - "open_hands": "ðŸ‘", - "open_hands_dark_skin_tone": "ðŸ‘ðŸ¿", - "open_hands_light_skin_tone": "ðŸ‘ðŸ»", - "open_hands_medium-dark_skin_tone": "ðŸ‘ðŸ¾", - "open_hands_medium-light_skin_tone": "ðŸ‘ðŸ¼", - "open_hands_medium_skin_tone": "ðŸ‘ðŸ½", - "open_mailbox_with_lowered_flag": "📭", - "open_mailbox_with_raised_flag": "📬", - "optical_disk": "💿", - "orange_book": "📙", - "orange_circle": "🟠", - "orange_heart": "🧡", - "orange_square": "🟧", - "orangutan": "🦧", - "orthodox_cross": "☦", - "otter": "🦦", - "outbox_tray": "📤", - "owl": "🦉", - "ox": "ðŸ‚", - "oyster": "🦪", - "package": "📦", - "page_facing_up": "📄", - "page_with_curl": "📃", - "pager": "📟", - "paintbrush": "🖌", - "palm_tree": "🌴", - "palms_up_together": "🤲", - "palms_up_together_dark_skin_tone": "🤲ðŸ¿", - "palms_up_together_light_skin_tone": "🤲ðŸ»", - "palms_up_together_medium-dark_skin_tone": "🤲ðŸ¾", - "palms_up_together_medium-light_skin_tone": "🤲ðŸ¼", - "palms_up_together_medium_skin_tone": "🤲ðŸ½", - "pancakes": "🥞", - "panda_face": "ðŸ¼", - "paperclip": "📎", - "parrot": "🦜", - "part_alternation_mark": "〽", - "party_popper": "🎉", - "partying_face": "🥳", - "passenger_ship": "🛳", - "passport_control": "🛂", - "pause_button": "â¸", - "paw_prints": "ðŸ¾", - "peace_symbol": "☮", - "peach": "ðŸ‘", - "peacock": "🦚", - "peanuts": "🥜", - "pear": "ðŸ", - "pen": "🖊", - "pencil": "ðŸ“", - "penguin": "ðŸ§", - "pensive_face": "😔", - "people_holding_hands": "🧑\u200dðŸ¤\u200d🧑", - "people_with_bunny_ears": "👯", - "people_wrestling": "🤼", - "performing_arts": "🎭", - "persevering_face": "😣", - "person_biking": "🚴", - "person_biking_dark_skin_tone": "🚴ðŸ¿", - "person_biking_light_skin_tone": "🚴ðŸ»", - "person_biking_medium-dark_skin_tone": "🚴ðŸ¾", - "person_biking_medium-light_skin_tone": "🚴ðŸ¼", - "person_biking_medium_skin_tone": "🚴ðŸ½", - "person_bouncing_ball": "⛹", - "person_bouncing_ball_dark_skin_tone": "⛹ðŸ¿", - "person_bouncing_ball_light_skin_tone": "⛹ðŸ»", - "person_bouncing_ball_medium-dark_skin_tone": "⛹ðŸ¾", - "person_bouncing_ball_medium-light_skin_tone": "⛹ðŸ¼", - "person_bouncing_ball_medium_skin_tone": "⛹ðŸ½", - "person_bowing": "🙇", - "person_bowing_dark_skin_tone": "🙇ðŸ¿", - "person_bowing_light_skin_tone": "🙇ðŸ»", - "person_bowing_medium-dark_skin_tone": "🙇ðŸ¾", - "person_bowing_medium-light_skin_tone": "🙇ðŸ¼", - "person_bowing_medium_skin_tone": "🙇ðŸ½", - "person_cartwheeling": "🤸", - "person_cartwheeling_dark_skin_tone": "🤸ðŸ¿", - "person_cartwheeling_light_skin_tone": "🤸ðŸ»", - "person_cartwheeling_medium-dark_skin_tone": "🤸ðŸ¾", - "person_cartwheeling_medium-light_skin_tone": "🤸ðŸ¼", - "person_cartwheeling_medium_skin_tone": "🤸ðŸ½", - "person_climbing": "🧗", - "person_climbing_dark_skin_tone": "🧗ðŸ¿", - "person_climbing_light_skin_tone": "🧗ðŸ»", - "person_climbing_medium-dark_skin_tone": "🧗ðŸ¾", - "person_climbing_medium-light_skin_tone": "🧗ðŸ¼", - "person_climbing_medium_skin_tone": "🧗ðŸ½", - "person_facepalming": "🤦", - "person_facepalming_dark_skin_tone": "🤦ðŸ¿", - "person_facepalming_light_skin_tone": "🤦ðŸ»", - "person_facepalming_medium-dark_skin_tone": "🤦ðŸ¾", - "person_facepalming_medium-light_skin_tone": "🤦ðŸ¼", - "person_facepalming_medium_skin_tone": "🤦ðŸ½", - "person_fencing": "🤺", - "person_frowning": "ðŸ™", - "person_frowning_dark_skin_tone": "ðŸ™ðŸ¿", - "person_frowning_light_skin_tone": "ðŸ™ðŸ»", - "person_frowning_medium-dark_skin_tone": "ðŸ™ðŸ¾", - "person_frowning_medium-light_skin_tone": "ðŸ™ðŸ¼", - "person_frowning_medium_skin_tone": "ðŸ™ðŸ½", - "person_gesturing_no": "🙅", - "person_gesturing_no_dark_skin_tone": "🙅ðŸ¿", - "person_gesturing_no_light_skin_tone": "🙅ðŸ»", - "person_gesturing_no_medium-dark_skin_tone": "🙅ðŸ¾", - "person_gesturing_no_medium-light_skin_tone": "🙅ðŸ¼", - "person_gesturing_no_medium_skin_tone": "🙅ðŸ½", - "person_gesturing_ok": "🙆", - "person_gesturing_ok_dark_skin_tone": "🙆ðŸ¿", - "person_gesturing_ok_light_skin_tone": "🙆ðŸ»", - "person_gesturing_ok_medium-dark_skin_tone": "🙆ðŸ¾", - "person_gesturing_ok_medium-light_skin_tone": "🙆ðŸ¼", - "person_gesturing_ok_medium_skin_tone": "🙆ðŸ½", - "person_getting_haircut": "💇", - "person_getting_haircut_dark_skin_tone": "💇ðŸ¿", - "person_getting_haircut_light_skin_tone": "💇ðŸ»", - "person_getting_haircut_medium-dark_skin_tone": "💇ðŸ¾", - "person_getting_haircut_medium-light_skin_tone": "💇ðŸ¼", - "person_getting_haircut_medium_skin_tone": "💇ðŸ½", - "person_getting_massage": "💆", - "person_getting_massage_dark_skin_tone": "💆ðŸ¿", - "person_getting_massage_light_skin_tone": "💆ðŸ»", - "person_getting_massage_medium-dark_skin_tone": "💆ðŸ¾", - "person_getting_massage_medium-light_skin_tone": "💆ðŸ¼", - "person_getting_massage_medium_skin_tone": "💆ðŸ½", - "person_golfing": "ðŸŒ", - "person_golfing_dark_skin_tone": "ðŸŒðŸ¿", - "person_golfing_light_skin_tone": "ðŸŒðŸ»", - "person_golfing_medium-dark_skin_tone": "ðŸŒðŸ¾", - "person_golfing_medium-light_skin_tone": "ðŸŒðŸ¼", - "person_golfing_medium_skin_tone": "ðŸŒðŸ½", - "person_in_bed": "🛌", - "person_in_bed_dark_skin_tone": "🛌ðŸ¿", - "person_in_bed_light_skin_tone": "🛌ðŸ»", - "person_in_bed_medium-dark_skin_tone": "🛌ðŸ¾", - "person_in_bed_medium-light_skin_tone": "🛌ðŸ¼", - "person_in_bed_medium_skin_tone": "🛌ðŸ½", - "person_in_lotus_position": "🧘", - "person_in_lotus_position_dark_skin_tone": "🧘ðŸ¿", - "person_in_lotus_position_light_skin_tone": "🧘ðŸ»", - "person_in_lotus_position_medium-dark_skin_tone": "🧘ðŸ¾", - "person_in_lotus_position_medium-light_skin_tone": "🧘ðŸ¼", - "person_in_lotus_position_medium_skin_tone": "🧘ðŸ½", - "person_in_steamy_room": "🧖", - "person_in_steamy_room_dark_skin_tone": "🧖ðŸ¿", - "person_in_steamy_room_light_skin_tone": "🧖ðŸ»", - "person_in_steamy_room_medium-dark_skin_tone": "🧖ðŸ¾", - "person_in_steamy_room_medium-light_skin_tone": "🧖ðŸ¼", - "person_in_steamy_room_medium_skin_tone": "🧖ðŸ½", - "person_juggling": "🤹", - "person_juggling_dark_skin_tone": "🤹ðŸ¿", - "person_juggling_light_skin_tone": "🤹ðŸ»", - "person_juggling_medium-dark_skin_tone": "🤹ðŸ¾", - "person_juggling_medium-light_skin_tone": "🤹ðŸ¼", - "person_juggling_medium_skin_tone": "🤹ðŸ½", - "person_kneeling": "🧎", - "person_lifting_weights": "ðŸ‹", - "person_lifting_weights_dark_skin_tone": "ðŸ‹ðŸ¿", - "person_lifting_weights_light_skin_tone": "ðŸ‹ðŸ»", - "person_lifting_weights_medium-dark_skin_tone": "ðŸ‹ðŸ¾", - "person_lifting_weights_medium-light_skin_tone": "ðŸ‹ðŸ¼", - "person_lifting_weights_medium_skin_tone": "ðŸ‹ðŸ½", - "person_mountain_biking": "🚵", - "person_mountain_biking_dark_skin_tone": "🚵ðŸ¿", - "person_mountain_biking_light_skin_tone": "🚵ðŸ»", - "person_mountain_biking_medium-dark_skin_tone": "🚵ðŸ¾", - "person_mountain_biking_medium-light_skin_tone": "🚵ðŸ¼", - "person_mountain_biking_medium_skin_tone": "🚵ðŸ½", - "person_playing_handball": "🤾", - "person_playing_handball_dark_skin_tone": "🤾ðŸ¿", - "person_playing_handball_light_skin_tone": "🤾ðŸ»", - "person_playing_handball_medium-dark_skin_tone": "🤾ðŸ¾", - "person_playing_handball_medium-light_skin_tone": "🤾ðŸ¼", - "person_playing_handball_medium_skin_tone": "🤾ðŸ½", - "person_playing_water_polo": "🤽", - "person_playing_water_polo_dark_skin_tone": "🤽ðŸ¿", - "person_playing_water_polo_light_skin_tone": "🤽ðŸ»", - "person_playing_water_polo_medium-dark_skin_tone": "🤽ðŸ¾", - "person_playing_water_polo_medium-light_skin_tone": "🤽ðŸ¼", - "person_playing_water_polo_medium_skin_tone": "🤽ðŸ½", - "person_pouting": "🙎", - "person_pouting_dark_skin_tone": "🙎ðŸ¿", - "person_pouting_light_skin_tone": "🙎ðŸ»", - "person_pouting_medium-dark_skin_tone": "🙎ðŸ¾", - "person_pouting_medium-light_skin_tone": "🙎ðŸ¼", - "person_pouting_medium_skin_tone": "🙎ðŸ½", - "person_raising_hand": "🙋", - "person_raising_hand_dark_skin_tone": "🙋ðŸ¿", - "person_raising_hand_light_skin_tone": "🙋ðŸ»", - "person_raising_hand_medium-dark_skin_tone": "🙋ðŸ¾", - "person_raising_hand_medium-light_skin_tone": "🙋ðŸ¼", - "person_raising_hand_medium_skin_tone": "🙋ðŸ½", - "person_rowing_boat": "🚣", - "person_rowing_boat_dark_skin_tone": "🚣ðŸ¿", - "person_rowing_boat_light_skin_tone": "🚣ðŸ»", - "person_rowing_boat_medium-dark_skin_tone": "🚣ðŸ¾", - "person_rowing_boat_medium-light_skin_tone": "🚣ðŸ¼", - "person_rowing_boat_medium_skin_tone": "🚣ðŸ½", - "person_running": "ðŸƒ", - "person_running_dark_skin_tone": "ðŸƒðŸ¿", - "person_running_light_skin_tone": "ðŸƒðŸ»", - "person_running_medium-dark_skin_tone": "ðŸƒðŸ¾", - "person_running_medium-light_skin_tone": "ðŸƒðŸ¼", - "person_running_medium_skin_tone": "ðŸƒðŸ½", - "person_shrugging": "🤷", - "person_shrugging_dark_skin_tone": "🤷ðŸ¿", - "person_shrugging_light_skin_tone": "🤷ðŸ»", - "person_shrugging_medium-dark_skin_tone": "🤷ðŸ¾", - "person_shrugging_medium-light_skin_tone": "🤷ðŸ¼", - "person_shrugging_medium_skin_tone": "🤷ðŸ½", - "person_standing": "ðŸ§", - "person_surfing": "ðŸ„", - "person_surfing_dark_skin_tone": "ðŸ„ðŸ¿", - "person_surfing_light_skin_tone": "ðŸ„ðŸ»", - "person_surfing_medium-dark_skin_tone": "ðŸ„ðŸ¾", - "person_surfing_medium-light_skin_tone": "ðŸ„ðŸ¼", - "person_surfing_medium_skin_tone": "ðŸ„ðŸ½", - "person_swimming": "ðŸŠ", - "person_swimming_dark_skin_tone": "ðŸŠðŸ¿", - "person_swimming_light_skin_tone": "ðŸŠðŸ»", - "person_swimming_medium-dark_skin_tone": "ðŸŠðŸ¾", - "person_swimming_medium-light_skin_tone": "ðŸŠðŸ¼", - "person_swimming_medium_skin_tone": "ðŸŠðŸ½", - "person_taking_bath": "🛀", - "person_taking_bath_dark_skin_tone": "🛀ðŸ¿", - "person_taking_bath_light_skin_tone": "🛀ðŸ»", - "person_taking_bath_medium-dark_skin_tone": "🛀ðŸ¾", - "person_taking_bath_medium-light_skin_tone": "🛀ðŸ¼", - "person_taking_bath_medium_skin_tone": "🛀ðŸ½", - "person_tipping_hand": "ðŸ’", - "person_tipping_hand_dark_skin_tone": "ðŸ’ðŸ¿", - "person_tipping_hand_light_skin_tone": "ðŸ’ðŸ»", - "person_tipping_hand_medium-dark_skin_tone": "ðŸ’ðŸ¾", - "person_tipping_hand_medium-light_skin_tone": "ðŸ’ðŸ¼", - "person_tipping_hand_medium_skin_tone": "ðŸ’ðŸ½", - "person_walking": "🚶", - "person_walking_dark_skin_tone": "🚶ðŸ¿", - "person_walking_light_skin_tone": "🚶ðŸ»", - "person_walking_medium-dark_skin_tone": "🚶ðŸ¾", - "person_walking_medium-light_skin_tone": "🚶ðŸ¼", - "person_walking_medium_skin_tone": "🚶ðŸ½", - "person_wearing_turban": "👳", - "person_wearing_turban_dark_skin_tone": "👳ðŸ¿", - "person_wearing_turban_light_skin_tone": "👳ðŸ»", - "person_wearing_turban_medium-dark_skin_tone": "👳ðŸ¾", - "person_wearing_turban_medium-light_skin_tone": "👳ðŸ¼", - "person_wearing_turban_medium_skin_tone": "👳ðŸ½", - "petri_dish": "🧫", - "pick": "â›", - "pie": "🥧", - "pig": "ðŸ·", - "pig_face": "ðŸ·", - "pig_nose": "ðŸ½", - "pile_of_poo": "💩", - "pill": "💊", - "pinching_hand": "ðŸ¤", - "pine_decoration": "ðŸŽ", - "pineapple": "ðŸ", - "ping_pong": "ðŸ“", - "pirate_flag": "ðŸ´\u200d☠ï¸", - "pistol": "🔫", - "pizza": "ðŸ•", - "place_of_worship": "ðŸ›", - "play_button": "â–¶", - "play_or_pause_button": "â¯", - "pleading_face": "🥺", - "police_car": "🚓", - "police_car_light": "🚨", - "police_officer": "👮", - "police_officer_dark_skin_tone": "👮ðŸ¿", - "police_officer_light_skin_tone": "👮ðŸ»", - "police_officer_medium-dark_skin_tone": "👮ðŸ¾", - "police_officer_medium-light_skin_tone": "👮ðŸ¼", - "police_officer_medium_skin_tone": "👮ðŸ½", - "poodle": "ðŸ©", - "pool_8_ball": "🎱", - "popcorn": "ðŸ¿", - "post_office": "ðŸ£", - "postal_horn": "📯", - "postbox": "📮", - "pot_of_food": "ðŸ²", - "potable_water": "🚰", - "potato": "🥔", - "poultry_leg": "ðŸ—", - "pound_banknote": "💷", - "pouting_cat_face": "😾", - "pouting_face": "😡", - "prayer_beads": "📿", - "pregnant_woman": "🤰", - "pregnant_woman_dark_skin_tone": "🤰ðŸ¿", - "pregnant_woman_light_skin_tone": "🤰ðŸ»", - "pregnant_woman_medium-dark_skin_tone": "🤰ðŸ¾", - "pregnant_woman_medium-light_skin_tone": "🤰ðŸ¼", - "pregnant_woman_medium_skin_tone": "🤰ðŸ½", - "pretzel": "🥨", - "probing_cane": "🦯", - "prince": "🤴", - "prince_dark_skin_tone": "🤴ðŸ¿", - "prince_light_skin_tone": "🤴ðŸ»", - "prince_medium-dark_skin_tone": "🤴ðŸ¾", - "prince_medium-light_skin_tone": "🤴ðŸ¼", - "prince_medium_skin_tone": "🤴ðŸ½", - "princess": "👸", - "princess_dark_skin_tone": "👸ðŸ¿", - "princess_light_skin_tone": "👸ðŸ»", - "princess_medium-dark_skin_tone": "👸ðŸ¾", - "princess_medium-light_skin_tone": "👸ðŸ¼", - "princess_medium_skin_tone": "👸ðŸ½", - "printer": "🖨", - "prohibited": "🚫", - "purple_circle": "🟣", - "purple_heart": "💜", - "purple_square": "🟪", - "purse": "👛", - "pushpin": "📌", - "question_mark": "â“", - "rabbit": "ðŸ°", - "rabbit_face": "ðŸ°", - "raccoon": "ðŸ¦", - "racing_car": "ðŸŽ", - "radio": "📻", - "radio_button": "🔘", - "radioactive": "☢", - "railway_car": "🚃", - "railway_track": "🛤", - "rainbow": "🌈", - "rainbow_flag": "ðŸ³ï¸\u200d🌈", - "raised_back_of_hand": "🤚", - "raised_back_of_hand_dark_skin_tone": "🤚ðŸ¿", - "raised_back_of_hand_light_skin_tone": "🤚ðŸ»", - "raised_back_of_hand_medium-dark_skin_tone": "🤚ðŸ¾", - "raised_back_of_hand_medium-light_skin_tone": "🤚ðŸ¼", - "raised_back_of_hand_medium_skin_tone": "🤚ðŸ½", - "raised_fist": "✊", - "raised_fist_dark_skin_tone": "✊ðŸ¿", - "raised_fist_light_skin_tone": "✊ðŸ»", - "raised_fist_medium-dark_skin_tone": "✊ðŸ¾", - "raised_fist_medium-light_skin_tone": "✊ðŸ¼", - "raised_fist_medium_skin_tone": "✊ðŸ½", - "raised_hand": "✋", - "raised_hand_dark_skin_tone": "✋ðŸ¿", - "raised_hand_light_skin_tone": "✋ðŸ»", - "raised_hand_medium-dark_skin_tone": "✋ðŸ¾", - "raised_hand_medium-light_skin_tone": "✋ðŸ¼", - "raised_hand_medium_skin_tone": "✋ðŸ½", - "raising_hands": "🙌", - "raising_hands_dark_skin_tone": "🙌ðŸ¿", - "raising_hands_light_skin_tone": "🙌ðŸ»", - "raising_hands_medium-dark_skin_tone": "🙌ðŸ¾", - "raising_hands_medium-light_skin_tone": "🙌ðŸ¼", - "raising_hands_medium_skin_tone": "🙌ðŸ½", - "ram": "ðŸ", - "rat": "ðŸ€", - "razor": "🪒", - "ringed_planet": "ðŸª", - "receipt": "🧾", - "record_button": "âº", - "recycling_symbol": "â™»", - "red_apple": "ðŸŽ", - "red_circle": "🔴", - "red_envelope": "🧧", - "red_hair": "🦰", - "red-haired_man": "👨\u200d🦰", - "red-haired_woman": "👩\u200d🦰", - "red_heart": "â¤", - "red_paper_lantern": "ðŸ®", - "red_square": "🟥", - "red_triangle_pointed_down": "🔻", - "red_triangle_pointed_up": "🔺", - "registered": "®", - "relieved_face": "😌", - "reminder_ribbon": "🎗", - "repeat_button": "ðŸ”", - "repeat_single_button": "🔂", - "rescue_worker’s_helmet": "⛑", - "restroom": "🚻", - "reverse_button": "â—€", - "revolving_hearts": "💞", - "rhinoceros": "ðŸ¦", - "ribbon": "🎀", - "rice_ball": "ðŸ™", - "rice_cracker": "ðŸ˜", - "right-facing_fist": "🤜", - "right-facing_fist_dark_skin_tone": "🤜ðŸ¿", - "right-facing_fist_light_skin_tone": "🤜ðŸ»", - "right-facing_fist_medium-dark_skin_tone": "🤜ðŸ¾", - "right-facing_fist_medium-light_skin_tone": "🤜ðŸ¼", - "right-facing_fist_medium_skin_tone": "🤜ðŸ½", - "right_anger_bubble": "🗯", - "right_arrow": "âž¡", - "right_arrow_curving_down": "⤵", - "right_arrow_curving_left": "↩", - "right_arrow_curving_up": "⤴", - "ring": "ðŸ’", - "roasted_sweet_potato": "ðŸ ", - "robot_face": "🤖", - "rocket": "🚀", - "roll_of_paper": "🧻", - "rolled-up_newspaper": "🗞", - "roller_coaster": "🎢", - "rolling_on_the_floor_laughing": "🤣", - "rooster": "ðŸ“", - "rose": "🌹", - "rosette": "ðŸµ", - "round_pushpin": "ðŸ“", - "rugby_football": "ðŸ‰", - "running_shirt": "🎽", - "running_shoe": "👟", - "sad_but_relieved_face": "😥", - "safety_pin": "🧷", - "safety_vest": "🦺", - "salt": "🧂", - "sailboat": "⛵", - "sake": "ðŸ¶", - "sandwich": "🥪", - "sari": "🥻", - "satellite": "📡", - "satellite_antenna": "📡", - "sauropod": "🦕", - "saxophone": "🎷", - "scarf": "🧣", - "school": "ðŸ«", - "school_backpack": "🎒", - "scissors": "✂", - "scorpion": "🦂", - "scroll": "📜", - "seat": "💺", - "see-no-evil_monkey": "🙈", - "seedling": "🌱", - "selfie": "🤳", - "selfie_dark_skin_tone": "🤳ðŸ¿", - "selfie_light_skin_tone": "🤳ðŸ»", - "selfie_medium-dark_skin_tone": "🤳ðŸ¾", - "selfie_medium-light_skin_tone": "🤳ðŸ¼", - "selfie_medium_skin_tone": "🤳ðŸ½", - "service_dog": "ðŸ•\u200d🦺", - "seven-thirty": "🕢", - "seven_o’clock": "🕖", - "shallow_pan_of_food": "🥘", - "shamrock": "☘", - "shark": "🦈", - "shaved_ice": "ðŸ§", - "sheaf_of_rice": "🌾", - "shield": "🛡", - "shinto_shrine": "⛩", - "ship": "🚢", - "shooting_star": "🌠", - "shopping_bags": "ðŸ›", - "shopping_cart": "🛒", - "shortcake": "ðŸ°", - "shorts": "🩳", - "shower": "🚿", - "shrimp": "ðŸ¦", - "shuffle_tracks_button": "🔀", - "shushing_face": "🤫", - "sign_of_the_horns": "🤘", - "sign_of_the_horns_dark_skin_tone": "🤘ðŸ¿", - "sign_of_the_horns_light_skin_tone": "🤘ðŸ»", - "sign_of_the_horns_medium-dark_skin_tone": "🤘ðŸ¾", - "sign_of_the_horns_medium-light_skin_tone": "🤘ðŸ¼", - "sign_of_the_horns_medium_skin_tone": "🤘ðŸ½", - "six-thirty": "🕡", - "six_o’clock": "🕕", - "skateboard": "🛹", - "skier": "â›·", - "skis": "🎿", - "skull": "💀", - "skull_and_crossbones": "☠", - "skunk": "🦨", - "sled": "🛷", - "sleeping_face": "😴", - "sleepy_face": "😪", - "slightly_frowning_face": "ðŸ™", - "slightly_smiling_face": "🙂", - "slot_machine": "🎰", - "sloth": "🦥", - "small_airplane": "🛩", - "small_blue_diamond": "🔹", - "small_orange_diamond": "🔸", - "smiling_cat_face_with_heart-eyes": "😻", - "smiling_face": "☺", - "smiling_face_with_halo": "😇", - "smiling_face_with_3_hearts": "🥰", - "smiling_face_with_heart-eyes": "ðŸ˜", - "smiling_face_with_horns": "😈", - "smiling_face_with_smiling_eyes": "😊", - "smiling_face_with_sunglasses": "😎", - "smirking_face": "ðŸ˜", - "snail": "ðŸŒ", - "snake": "ðŸ", - "sneezing_face": "🤧", - "snow-capped_mountain": "ðŸ”", - "snowboarder": "ðŸ‚", - "snowboarder_dark_skin_tone": "ðŸ‚ðŸ¿", - "snowboarder_light_skin_tone": "ðŸ‚ðŸ»", - "snowboarder_medium-dark_skin_tone": "ðŸ‚ðŸ¾", - "snowboarder_medium-light_skin_tone": "ðŸ‚ðŸ¼", - "snowboarder_medium_skin_tone": "ðŸ‚ðŸ½", - "snowflake": "â„", - "snowman": "☃", - "snowman_without_snow": "⛄", - "soap": "🧼", - "soccer_ball": "âš½", - "socks": "🧦", - "softball": "🥎", - "soft_ice_cream": "ðŸ¦", - "spade_suit": "â™ ", - "spaghetti": "ðŸ", - "sparkle": "â‡", - "sparkler": "🎇", - "sparkles": "✨", - "sparkling_heart": "💖", - "speak-no-evil_monkey": "🙊", - "speaker_high_volume": "🔊", - "speaker_low_volume": "🔈", - "speaker_medium_volume": "🔉", - "speaking_head": "🗣", - "speech_balloon": "💬", - "speedboat": "🚤", - "spider": "🕷", - "spider_web": "🕸", - "spiral_calendar": "🗓", - "spiral_notepad": "🗒", - "spiral_shell": "ðŸš", - "spoon": "🥄", - "sponge": "🧽", - "sport_utility_vehicle": "🚙", - "sports_medal": "ðŸ…", - "spouting_whale": "ðŸ³", - "squid": "🦑", - "squinting_face_with_tongue": "ðŸ˜", - "stadium": "ðŸŸ", - "star-struck": "🤩", - "star_and_crescent": "☪", - "star_of_david": "✡", - "station": "🚉", - "steaming_bowl": "ðŸœ", - "stethoscope": "🩺", - "stop_button": "â¹", - "stop_sign": "🛑", - "stopwatch": "â±", - "straight_ruler": "ðŸ“", - "strawberry": "ðŸ“", - "studio_microphone": "🎙", - "stuffed_flatbread": "🥙", - "sun": "☀", - "sun_behind_cloud": "â›…", - "sun_behind_large_cloud": "🌥", - "sun_behind_rain_cloud": "🌦", - "sun_behind_small_cloud": "🌤", - "sun_with_face": "🌞", - "sunflower": "🌻", - "sunglasses": "😎", - "sunrise": "🌅", - "sunrise_over_mountains": "🌄", - "sunset": "🌇", - "superhero": "🦸", - "supervillain": "🦹", - "sushi": "ðŸ£", - "suspension_railway": "🚟", - "swan": "🦢", - "sweat_droplets": "💦", - "synagogue": "ðŸ•", - "syringe": "💉", - "t-shirt": "👕", - "taco": "🌮", - "takeout_box": "🥡", - "tanabata_tree": "🎋", - "tangerine": "ðŸŠ", - "taxi": "🚕", - "teacup_without_handle": "ðŸµ", - "tear-off_calendar": "📆", - "teddy_bear": "🧸", - "telephone": "☎", - "telephone_receiver": "📞", - "telescope": "🔭", - "television": "📺", - "ten-thirty": "🕥", - "ten_o’clock": "🕙", - "tennis": "🎾", - "tent": "⛺", - "test_tube": "🧪", - "thermometer": "🌡", - "thinking_face": "🤔", - "thought_balloon": "💭", - "thread": "🧵", - "three-thirty": "🕞", - "three_o’clock": "🕒", - "thumbs_down": "👎", - "thumbs_down_dark_skin_tone": "👎ðŸ¿", - "thumbs_down_light_skin_tone": "👎ðŸ»", - "thumbs_down_medium-dark_skin_tone": "👎ðŸ¾", - "thumbs_down_medium-light_skin_tone": "👎ðŸ¼", - "thumbs_down_medium_skin_tone": "👎ðŸ½", - "thumbs_up": "ðŸ‘", - "thumbs_up_dark_skin_tone": "ðŸ‘ðŸ¿", - "thumbs_up_light_skin_tone": "ðŸ‘ðŸ»", - "thumbs_up_medium-dark_skin_tone": "ðŸ‘ðŸ¾", - "thumbs_up_medium-light_skin_tone": "ðŸ‘ðŸ¼", - "thumbs_up_medium_skin_tone": "ðŸ‘ðŸ½", - "ticket": "🎫", - "tiger": "ðŸ¯", - "tiger_face": "ðŸ¯", - "timer_clock": "â²", - "tired_face": "😫", - "toolbox": "🧰", - "toilet": "🚽", - "tomato": "ðŸ…", - "tongue": "👅", - "tooth": "🦷", - "top_hat": "🎩", - "tornado": "🌪", - "trackball": "🖲", - "tractor": "🚜", - "trade_mark": "â„¢", - "train": "🚋", - "tram": "🚊", - "tram_car": "🚋", - "triangular_flag": "🚩", - "triangular_ruler": "ðŸ“", - "trident_emblem": "🔱", - "trolleybus": "🚎", - "trophy": "ðŸ†", - "tropical_drink": "ðŸ¹", - "tropical_fish": "ðŸ ", - "trumpet": "🎺", - "tulip": "🌷", - "tumbler_glass": "🥃", - "turtle": "ðŸ¢", - "twelve-thirty": "🕧", - "twelve_o’clock": "🕛", - "two-hump_camel": "ðŸ«", - "two-thirty": "ðŸ•", - "two_hearts": "💕", - "two_men_holding_hands": "👬", - "two_o’clock": "🕑", - "two_women_holding_hands": "👭", - "umbrella": "☂", - "umbrella_on_ground": "â›±", - "umbrella_with_rain_drops": "☔", - "unamused_face": "😒", - "unicorn_face": "🦄", - "unlocked": "🔓", - "up-down_arrow": "↕", - "up-left_arrow": "↖", - "up-right_arrow": "↗", - "up_arrow": "⬆", - "upside-down_face": "🙃", - "upwards_button": "🔼", - "vampire": "🧛", - "vampire_dark_skin_tone": "🧛ðŸ¿", - "vampire_light_skin_tone": "🧛ðŸ»", - "vampire_medium-dark_skin_tone": "🧛ðŸ¾", - "vampire_medium-light_skin_tone": "🧛ðŸ¼", - "vampire_medium_skin_tone": "🧛ðŸ½", - "vertical_traffic_light": "🚦", - "vibration_mode": "📳", - "victory_hand": "✌", - "victory_hand_dark_skin_tone": "✌ðŸ¿", - "victory_hand_light_skin_tone": "✌ðŸ»", - "victory_hand_medium-dark_skin_tone": "✌ðŸ¾", - "victory_hand_medium-light_skin_tone": "✌ðŸ¼", - "victory_hand_medium_skin_tone": "✌ðŸ½", - "video_camera": "📹", - "video_game": "🎮", - "videocassette": "📼", - "violin": "🎻", - "volcano": "🌋", - "volleyball": "ðŸ", - "vulcan_salute": "🖖", - "vulcan_salute_dark_skin_tone": "🖖ðŸ¿", - "vulcan_salute_light_skin_tone": "🖖ðŸ»", - "vulcan_salute_medium-dark_skin_tone": "🖖ðŸ¾", - "vulcan_salute_medium-light_skin_tone": "🖖ðŸ¼", - "vulcan_salute_medium_skin_tone": "🖖ðŸ½", - "waffle": "🧇", - "waning_crescent_moon": "🌘", - "waning_gibbous_moon": "🌖", - "warning": "âš ", - "wastebasket": "🗑", - "watch": "⌚", - "water_buffalo": "ðŸƒ", - "water_closet": "🚾", - "water_wave": "🌊", - "watermelon": "ðŸ‰", - "waving_hand": "👋", - "waving_hand_dark_skin_tone": "👋ðŸ¿", - "waving_hand_light_skin_tone": "👋ðŸ»", - "waving_hand_medium-dark_skin_tone": "👋ðŸ¾", - "waving_hand_medium-light_skin_tone": "👋ðŸ¼", - "waving_hand_medium_skin_tone": "👋ðŸ½", - "wavy_dash": "〰", - "waxing_crescent_moon": "🌒", - "waxing_gibbous_moon": "🌔", - "weary_cat_face": "🙀", - "weary_face": "😩", - "wedding": "💒", - "whale": "ðŸ³", - "wheel_of_dharma": "☸", - "wheelchair_symbol": "♿", - "white_circle": "⚪", - "white_exclamation_mark": "â•", - "white_flag": "ðŸ³", - "white_flower": "💮", - "white_hair": "🦳", - "white-haired_man": "👨\u200d🦳", - "white-haired_woman": "👩\u200d🦳", - "white_heart": "ðŸ¤", - "white_heavy_check_mark": "✅", - "white_large_square": "⬜", - "white_medium-small_square": "â—½", - "white_medium_square": "â—»", - "white_medium_star": "â­", - "white_question_mark": "â”", - "white_small_square": "â–«", - "white_square_button": "🔳", - "wilted_flower": "🥀", - "wind_chime": "ðŸŽ", - "wind_face": "🌬", - "wine_glass": "ðŸ·", - "winking_face": "😉", - "winking_face_with_tongue": "😜", - "wolf_face": "ðŸº", - "woman": "👩", - "woman_artist": "👩\u200d🎨", - "woman_artist_dark_skin_tone": "👩ðŸ¿\u200d🎨", - "woman_artist_light_skin_tone": "👩ðŸ»\u200d🎨", - "woman_artist_medium-dark_skin_tone": "👩ðŸ¾\u200d🎨", - "woman_artist_medium-light_skin_tone": "👩ðŸ¼\u200d🎨", - "woman_artist_medium_skin_tone": "👩ðŸ½\u200d🎨", - "woman_astronaut": "👩\u200d🚀", - "woman_astronaut_dark_skin_tone": "👩ðŸ¿\u200d🚀", - "woman_astronaut_light_skin_tone": "👩ðŸ»\u200d🚀", - "woman_astronaut_medium-dark_skin_tone": "👩ðŸ¾\u200d🚀", - "woman_astronaut_medium-light_skin_tone": "👩ðŸ¼\u200d🚀", - "woman_astronaut_medium_skin_tone": "👩ðŸ½\u200d🚀", - "woman_biking": "🚴\u200d♀ï¸", - "woman_biking_dark_skin_tone": "🚴ðŸ¿\u200d♀ï¸", - "woman_biking_light_skin_tone": "🚴ðŸ»\u200d♀ï¸", - "woman_biking_medium-dark_skin_tone": "🚴ðŸ¾\u200d♀ï¸", - "woman_biking_medium-light_skin_tone": "🚴ðŸ¼\u200d♀ï¸", - "woman_biking_medium_skin_tone": "🚴ðŸ½\u200d♀ï¸", - "woman_bouncing_ball": "⛹ï¸\u200d♀ï¸", - "woman_bouncing_ball_dark_skin_tone": "⛹ðŸ¿\u200d♀ï¸", - "woman_bouncing_ball_light_skin_tone": "⛹ðŸ»\u200d♀ï¸", - "woman_bouncing_ball_medium-dark_skin_tone": "⛹ðŸ¾\u200d♀ï¸", - "woman_bouncing_ball_medium-light_skin_tone": "⛹ðŸ¼\u200d♀ï¸", - "woman_bouncing_ball_medium_skin_tone": "⛹ðŸ½\u200d♀ï¸", - "woman_bowing": "🙇\u200d♀ï¸", - "woman_bowing_dark_skin_tone": "🙇ðŸ¿\u200d♀ï¸", - "woman_bowing_light_skin_tone": "🙇ðŸ»\u200d♀ï¸", - "woman_bowing_medium-dark_skin_tone": "🙇ðŸ¾\u200d♀ï¸", - "woman_bowing_medium-light_skin_tone": "🙇ðŸ¼\u200d♀ï¸", - "woman_bowing_medium_skin_tone": "🙇ðŸ½\u200d♀ï¸", - "woman_cartwheeling": "🤸\u200d♀ï¸", - "woman_cartwheeling_dark_skin_tone": "🤸ðŸ¿\u200d♀ï¸", - "woman_cartwheeling_light_skin_tone": "🤸ðŸ»\u200d♀ï¸", - "woman_cartwheeling_medium-dark_skin_tone": "🤸ðŸ¾\u200d♀ï¸", - "woman_cartwheeling_medium-light_skin_tone": "🤸ðŸ¼\u200d♀ï¸", - "woman_cartwheeling_medium_skin_tone": "🤸ðŸ½\u200d♀ï¸", - "woman_climbing": "🧗\u200d♀ï¸", - "woman_climbing_dark_skin_tone": "🧗ðŸ¿\u200d♀ï¸", - "woman_climbing_light_skin_tone": "🧗ðŸ»\u200d♀ï¸", - "woman_climbing_medium-dark_skin_tone": "🧗ðŸ¾\u200d♀ï¸", - "woman_climbing_medium-light_skin_tone": "🧗ðŸ¼\u200d♀ï¸", - "woman_climbing_medium_skin_tone": "🧗ðŸ½\u200d♀ï¸", - "woman_construction_worker": "👷\u200d♀ï¸", - "woman_construction_worker_dark_skin_tone": "👷ðŸ¿\u200d♀ï¸", - "woman_construction_worker_light_skin_tone": "👷ðŸ»\u200d♀ï¸", - "woman_construction_worker_medium-dark_skin_tone": "👷ðŸ¾\u200d♀ï¸", - "woman_construction_worker_medium-light_skin_tone": "👷ðŸ¼\u200d♀ï¸", - "woman_construction_worker_medium_skin_tone": "👷ðŸ½\u200d♀ï¸", - "woman_cook": "👩\u200dðŸ³", - "woman_cook_dark_skin_tone": "👩ðŸ¿\u200dðŸ³", - "woman_cook_light_skin_tone": "👩ðŸ»\u200dðŸ³", - "woman_cook_medium-dark_skin_tone": "👩ðŸ¾\u200dðŸ³", - "woman_cook_medium-light_skin_tone": "👩ðŸ¼\u200dðŸ³", - "woman_cook_medium_skin_tone": "👩ðŸ½\u200dðŸ³", - "woman_dancing": "💃", - "woman_dancing_dark_skin_tone": "💃ðŸ¿", - "woman_dancing_light_skin_tone": "💃ðŸ»", - "woman_dancing_medium-dark_skin_tone": "💃ðŸ¾", - "woman_dancing_medium-light_skin_tone": "💃ðŸ¼", - "woman_dancing_medium_skin_tone": "💃ðŸ½", - "woman_dark_skin_tone": "👩ðŸ¿", - "woman_detective": "🕵ï¸\u200d♀ï¸", - "woman_detective_dark_skin_tone": "🕵ðŸ¿\u200d♀ï¸", - "woman_detective_light_skin_tone": "🕵ðŸ»\u200d♀ï¸", - "woman_detective_medium-dark_skin_tone": "🕵ðŸ¾\u200d♀ï¸", - "woman_detective_medium-light_skin_tone": "🕵ðŸ¼\u200d♀ï¸", - "woman_detective_medium_skin_tone": "🕵ðŸ½\u200d♀ï¸", - "woman_elf": "ðŸ§\u200d♀ï¸", - "woman_elf_dark_skin_tone": "ðŸ§ðŸ¿\u200d♀ï¸", - "woman_elf_light_skin_tone": "ðŸ§ðŸ»\u200d♀ï¸", - "woman_elf_medium-dark_skin_tone": "ðŸ§ðŸ¾\u200d♀ï¸", - "woman_elf_medium-light_skin_tone": "ðŸ§ðŸ¼\u200d♀ï¸", - "woman_elf_medium_skin_tone": "ðŸ§ðŸ½\u200d♀ï¸", - "woman_facepalming": "🤦\u200d♀ï¸", - "woman_facepalming_dark_skin_tone": "🤦ðŸ¿\u200d♀ï¸", - "woman_facepalming_light_skin_tone": "🤦ðŸ»\u200d♀ï¸", - "woman_facepalming_medium-dark_skin_tone": "🤦ðŸ¾\u200d♀ï¸", - "woman_facepalming_medium-light_skin_tone": "🤦ðŸ¼\u200d♀ï¸", - "woman_facepalming_medium_skin_tone": "🤦ðŸ½\u200d♀ï¸", - "woman_factory_worker": "👩\u200dðŸ­", - "woman_factory_worker_dark_skin_tone": "👩ðŸ¿\u200dðŸ­", - "woman_factory_worker_light_skin_tone": "👩ðŸ»\u200dðŸ­", - "woman_factory_worker_medium-dark_skin_tone": "👩ðŸ¾\u200dðŸ­", - "woman_factory_worker_medium-light_skin_tone": "👩ðŸ¼\u200dðŸ­", - "woman_factory_worker_medium_skin_tone": "👩ðŸ½\u200dðŸ­", - "woman_fairy": "🧚\u200d♀ï¸", - "woman_fairy_dark_skin_tone": "🧚ðŸ¿\u200d♀ï¸", - "woman_fairy_light_skin_tone": "🧚ðŸ»\u200d♀ï¸", - "woman_fairy_medium-dark_skin_tone": "🧚ðŸ¾\u200d♀ï¸", - "woman_fairy_medium-light_skin_tone": "🧚ðŸ¼\u200d♀ï¸", - "woman_fairy_medium_skin_tone": "🧚ðŸ½\u200d♀ï¸", - "woman_farmer": "👩\u200d🌾", - "woman_farmer_dark_skin_tone": "👩ðŸ¿\u200d🌾", - "woman_farmer_light_skin_tone": "👩ðŸ»\u200d🌾", - "woman_farmer_medium-dark_skin_tone": "👩ðŸ¾\u200d🌾", - "woman_farmer_medium-light_skin_tone": "👩ðŸ¼\u200d🌾", - "woman_farmer_medium_skin_tone": "👩ðŸ½\u200d🌾", - "woman_firefighter": "👩\u200d🚒", - "woman_firefighter_dark_skin_tone": "👩ðŸ¿\u200d🚒", - "woman_firefighter_light_skin_tone": "👩ðŸ»\u200d🚒", - "woman_firefighter_medium-dark_skin_tone": "👩ðŸ¾\u200d🚒", - "woman_firefighter_medium-light_skin_tone": "👩ðŸ¼\u200d🚒", - "woman_firefighter_medium_skin_tone": "👩ðŸ½\u200d🚒", - "woman_frowning": "ðŸ™\u200d♀ï¸", - "woman_frowning_dark_skin_tone": "ðŸ™ðŸ¿\u200d♀ï¸", - "woman_frowning_light_skin_tone": "ðŸ™ðŸ»\u200d♀ï¸", - "woman_frowning_medium-dark_skin_tone": "ðŸ™ðŸ¾\u200d♀ï¸", - "woman_frowning_medium-light_skin_tone": "ðŸ™ðŸ¼\u200d♀ï¸", - "woman_frowning_medium_skin_tone": "ðŸ™ðŸ½\u200d♀ï¸", - "woman_genie": "🧞\u200d♀ï¸", - "woman_gesturing_no": "🙅\u200d♀ï¸", - "woman_gesturing_no_dark_skin_tone": "🙅ðŸ¿\u200d♀ï¸", - "woman_gesturing_no_light_skin_tone": "🙅ðŸ»\u200d♀ï¸", - "woman_gesturing_no_medium-dark_skin_tone": "🙅ðŸ¾\u200d♀ï¸", - "woman_gesturing_no_medium-light_skin_tone": "🙅ðŸ¼\u200d♀ï¸", - "woman_gesturing_no_medium_skin_tone": "🙅ðŸ½\u200d♀ï¸", - "woman_gesturing_ok": "🙆\u200d♀ï¸", - "woman_gesturing_ok_dark_skin_tone": "🙆ðŸ¿\u200d♀ï¸", - "woman_gesturing_ok_light_skin_tone": "🙆ðŸ»\u200d♀ï¸", - "woman_gesturing_ok_medium-dark_skin_tone": "🙆ðŸ¾\u200d♀ï¸", - "woman_gesturing_ok_medium-light_skin_tone": "🙆ðŸ¼\u200d♀ï¸", - "woman_gesturing_ok_medium_skin_tone": "🙆ðŸ½\u200d♀ï¸", - "woman_getting_haircut": "💇\u200d♀ï¸", - "woman_getting_haircut_dark_skin_tone": "💇ðŸ¿\u200d♀ï¸", - "woman_getting_haircut_light_skin_tone": "💇ðŸ»\u200d♀ï¸", - "woman_getting_haircut_medium-dark_skin_tone": "💇ðŸ¾\u200d♀ï¸", - "woman_getting_haircut_medium-light_skin_tone": "💇ðŸ¼\u200d♀ï¸", - "woman_getting_haircut_medium_skin_tone": "💇ðŸ½\u200d♀ï¸", - "woman_getting_massage": "💆\u200d♀ï¸", - "woman_getting_massage_dark_skin_tone": "💆ðŸ¿\u200d♀ï¸", - "woman_getting_massage_light_skin_tone": "💆ðŸ»\u200d♀ï¸", - "woman_getting_massage_medium-dark_skin_tone": "💆ðŸ¾\u200d♀ï¸", - "woman_getting_massage_medium-light_skin_tone": "💆ðŸ¼\u200d♀ï¸", - "woman_getting_massage_medium_skin_tone": "💆ðŸ½\u200d♀ï¸", - "woman_golfing": "ðŸŒï¸\u200d♀ï¸", - "woman_golfing_dark_skin_tone": "ðŸŒðŸ¿\u200d♀ï¸", - "woman_golfing_light_skin_tone": "ðŸŒðŸ»\u200d♀ï¸", - "woman_golfing_medium-dark_skin_tone": "ðŸŒðŸ¾\u200d♀ï¸", - "woman_golfing_medium-light_skin_tone": "ðŸŒðŸ¼\u200d♀ï¸", - "woman_golfing_medium_skin_tone": "ðŸŒðŸ½\u200d♀ï¸", - "woman_guard": "💂\u200d♀ï¸", - "woman_guard_dark_skin_tone": "💂ðŸ¿\u200d♀ï¸", - "woman_guard_light_skin_tone": "💂ðŸ»\u200d♀ï¸", - "woman_guard_medium-dark_skin_tone": "💂ðŸ¾\u200d♀ï¸", - "woman_guard_medium-light_skin_tone": "💂ðŸ¼\u200d♀ï¸", - "woman_guard_medium_skin_tone": "💂ðŸ½\u200d♀ï¸", - "woman_health_worker": "👩\u200dâš•ï¸", - "woman_health_worker_dark_skin_tone": "👩ðŸ¿\u200dâš•ï¸", - "woman_health_worker_light_skin_tone": "👩ðŸ»\u200dâš•ï¸", - "woman_health_worker_medium-dark_skin_tone": "👩ðŸ¾\u200dâš•ï¸", - "woman_health_worker_medium-light_skin_tone": "👩ðŸ¼\u200dâš•ï¸", - "woman_health_worker_medium_skin_tone": "👩ðŸ½\u200dâš•ï¸", - "woman_in_lotus_position": "🧘\u200d♀ï¸", - "woman_in_lotus_position_dark_skin_tone": "🧘ðŸ¿\u200d♀ï¸", - "woman_in_lotus_position_light_skin_tone": "🧘ðŸ»\u200d♀ï¸", - "woman_in_lotus_position_medium-dark_skin_tone": "🧘ðŸ¾\u200d♀ï¸", - "woman_in_lotus_position_medium-light_skin_tone": "🧘ðŸ¼\u200d♀ï¸", - "woman_in_lotus_position_medium_skin_tone": "🧘ðŸ½\u200d♀ï¸", - "woman_in_manual_wheelchair": "👩\u200d🦽", - "woman_in_motorized_wheelchair": "👩\u200d🦼", - "woman_in_steamy_room": "🧖\u200d♀ï¸", - "woman_in_steamy_room_dark_skin_tone": "🧖ðŸ¿\u200d♀ï¸", - "woman_in_steamy_room_light_skin_tone": "🧖ðŸ»\u200d♀ï¸", - "woman_in_steamy_room_medium-dark_skin_tone": "🧖ðŸ¾\u200d♀ï¸", - "woman_in_steamy_room_medium-light_skin_tone": "🧖ðŸ¼\u200d♀ï¸", - "woman_in_steamy_room_medium_skin_tone": "🧖ðŸ½\u200d♀ï¸", - "woman_judge": "👩\u200dâš–ï¸", - "woman_judge_dark_skin_tone": "👩ðŸ¿\u200dâš–ï¸", - "woman_judge_light_skin_tone": "👩ðŸ»\u200dâš–ï¸", - "woman_judge_medium-dark_skin_tone": "👩ðŸ¾\u200dâš–ï¸", - "woman_judge_medium-light_skin_tone": "👩ðŸ¼\u200dâš–ï¸", - "woman_judge_medium_skin_tone": "👩ðŸ½\u200dâš–ï¸", - "woman_juggling": "🤹\u200d♀ï¸", - "woman_juggling_dark_skin_tone": "🤹ðŸ¿\u200d♀ï¸", - "woman_juggling_light_skin_tone": "🤹ðŸ»\u200d♀ï¸", - "woman_juggling_medium-dark_skin_tone": "🤹ðŸ¾\u200d♀ï¸", - "woman_juggling_medium-light_skin_tone": "🤹ðŸ¼\u200d♀ï¸", - "woman_juggling_medium_skin_tone": "🤹ðŸ½\u200d♀ï¸", - "woman_lifting_weights": "ðŸ‹ï¸\u200d♀ï¸", - "woman_lifting_weights_dark_skin_tone": "ðŸ‹ðŸ¿\u200d♀ï¸", - "woman_lifting_weights_light_skin_tone": "ðŸ‹ðŸ»\u200d♀ï¸", - "woman_lifting_weights_medium-dark_skin_tone": "ðŸ‹ðŸ¾\u200d♀ï¸", - "woman_lifting_weights_medium-light_skin_tone": "ðŸ‹ðŸ¼\u200d♀ï¸", - "woman_lifting_weights_medium_skin_tone": "ðŸ‹ðŸ½\u200d♀ï¸", - "woman_light_skin_tone": "👩ðŸ»", - "woman_mage": "🧙\u200d♀ï¸", - "woman_mage_dark_skin_tone": "🧙ðŸ¿\u200d♀ï¸", - "woman_mage_light_skin_tone": "🧙ðŸ»\u200d♀ï¸", - "woman_mage_medium-dark_skin_tone": "🧙ðŸ¾\u200d♀ï¸", - "woman_mage_medium-light_skin_tone": "🧙ðŸ¼\u200d♀ï¸", - "woman_mage_medium_skin_tone": "🧙ðŸ½\u200d♀ï¸", - "woman_mechanic": "👩\u200d🔧", - "woman_mechanic_dark_skin_tone": "👩ðŸ¿\u200d🔧", - "woman_mechanic_light_skin_tone": "👩ðŸ»\u200d🔧", - "woman_mechanic_medium-dark_skin_tone": "👩ðŸ¾\u200d🔧", - "woman_mechanic_medium-light_skin_tone": "👩ðŸ¼\u200d🔧", - "woman_mechanic_medium_skin_tone": "👩ðŸ½\u200d🔧", - "woman_medium-dark_skin_tone": "👩ðŸ¾", - "woman_medium-light_skin_tone": "👩ðŸ¼", - "woman_medium_skin_tone": "👩ðŸ½", - "woman_mountain_biking": "🚵\u200d♀ï¸", - "woman_mountain_biking_dark_skin_tone": "🚵ðŸ¿\u200d♀ï¸", - "woman_mountain_biking_light_skin_tone": "🚵ðŸ»\u200d♀ï¸", - "woman_mountain_biking_medium-dark_skin_tone": "🚵ðŸ¾\u200d♀ï¸", - "woman_mountain_biking_medium-light_skin_tone": "🚵ðŸ¼\u200d♀ï¸", - "woman_mountain_biking_medium_skin_tone": "🚵ðŸ½\u200d♀ï¸", - "woman_office_worker": "👩\u200d💼", - "woman_office_worker_dark_skin_tone": "👩ðŸ¿\u200d💼", - "woman_office_worker_light_skin_tone": "👩ðŸ»\u200d💼", - "woman_office_worker_medium-dark_skin_tone": "👩ðŸ¾\u200d💼", - "woman_office_worker_medium-light_skin_tone": "👩ðŸ¼\u200d💼", - "woman_office_worker_medium_skin_tone": "👩ðŸ½\u200d💼", - "woman_pilot": "👩\u200d✈ï¸", - "woman_pilot_dark_skin_tone": "👩ðŸ¿\u200d✈ï¸", - "woman_pilot_light_skin_tone": "👩ðŸ»\u200d✈ï¸", - "woman_pilot_medium-dark_skin_tone": "👩ðŸ¾\u200d✈ï¸", - "woman_pilot_medium-light_skin_tone": "👩ðŸ¼\u200d✈ï¸", - "woman_pilot_medium_skin_tone": "👩ðŸ½\u200d✈ï¸", - "woman_playing_handball": "🤾\u200d♀ï¸", - "woman_playing_handball_dark_skin_tone": "🤾ðŸ¿\u200d♀ï¸", - "woman_playing_handball_light_skin_tone": "🤾ðŸ»\u200d♀ï¸", - "woman_playing_handball_medium-dark_skin_tone": "🤾ðŸ¾\u200d♀ï¸", - "woman_playing_handball_medium-light_skin_tone": "🤾ðŸ¼\u200d♀ï¸", - "woman_playing_handball_medium_skin_tone": "🤾ðŸ½\u200d♀ï¸", - "woman_playing_water_polo": "🤽\u200d♀ï¸", - "woman_playing_water_polo_dark_skin_tone": "🤽ðŸ¿\u200d♀ï¸", - "woman_playing_water_polo_light_skin_tone": "🤽ðŸ»\u200d♀ï¸", - "woman_playing_water_polo_medium-dark_skin_tone": "🤽ðŸ¾\u200d♀ï¸", - "woman_playing_water_polo_medium-light_skin_tone": "🤽ðŸ¼\u200d♀ï¸", - "woman_playing_water_polo_medium_skin_tone": "🤽ðŸ½\u200d♀ï¸", - "woman_police_officer": "👮\u200d♀ï¸", - "woman_police_officer_dark_skin_tone": "👮ðŸ¿\u200d♀ï¸", - "woman_police_officer_light_skin_tone": "👮ðŸ»\u200d♀ï¸", - "woman_police_officer_medium-dark_skin_tone": "👮ðŸ¾\u200d♀ï¸", - "woman_police_officer_medium-light_skin_tone": "👮ðŸ¼\u200d♀ï¸", - "woman_police_officer_medium_skin_tone": "👮ðŸ½\u200d♀ï¸", - "woman_pouting": "🙎\u200d♀ï¸", - "woman_pouting_dark_skin_tone": "🙎ðŸ¿\u200d♀ï¸", - "woman_pouting_light_skin_tone": "🙎ðŸ»\u200d♀ï¸", - "woman_pouting_medium-dark_skin_tone": "🙎ðŸ¾\u200d♀ï¸", - "woman_pouting_medium-light_skin_tone": "🙎ðŸ¼\u200d♀ï¸", - "woman_pouting_medium_skin_tone": "🙎ðŸ½\u200d♀ï¸", - "woman_raising_hand": "🙋\u200d♀ï¸", - "woman_raising_hand_dark_skin_tone": "🙋ðŸ¿\u200d♀ï¸", - "woman_raising_hand_light_skin_tone": "🙋ðŸ»\u200d♀ï¸", - "woman_raising_hand_medium-dark_skin_tone": "🙋ðŸ¾\u200d♀ï¸", - "woman_raising_hand_medium-light_skin_tone": "🙋ðŸ¼\u200d♀ï¸", - "woman_raising_hand_medium_skin_tone": "🙋ðŸ½\u200d♀ï¸", - "woman_rowing_boat": "🚣\u200d♀ï¸", - "woman_rowing_boat_dark_skin_tone": "🚣ðŸ¿\u200d♀ï¸", - "woman_rowing_boat_light_skin_tone": "🚣ðŸ»\u200d♀ï¸", - "woman_rowing_boat_medium-dark_skin_tone": "🚣ðŸ¾\u200d♀ï¸", - "woman_rowing_boat_medium-light_skin_tone": "🚣ðŸ¼\u200d♀ï¸", - "woman_rowing_boat_medium_skin_tone": "🚣ðŸ½\u200d♀ï¸", - "woman_running": "ðŸƒ\u200d♀ï¸", - "woman_running_dark_skin_tone": "ðŸƒðŸ¿\u200d♀ï¸", - "woman_running_light_skin_tone": "ðŸƒðŸ»\u200d♀ï¸", - "woman_running_medium-dark_skin_tone": "ðŸƒðŸ¾\u200d♀ï¸", - "woman_running_medium-light_skin_tone": "ðŸƒðŸ¼\u200d♀ï¸", - "woman_running_medium_skin_tone": "ðŸƒðŸ½\u200d♀ï¸", - "woman_scientist": "👩\u200d🔬", - "woman_scientist_dark_skin_tone": "👩ðŸ¿\u200d🔬", - "woman_scientist_light_skin_tone": "👩ðŸ»\u200d🔬", - "woman_scientist_medium-dark_skin_tone": "👩ðŸ¾\u200d🔬", - "woman_scientist_medium-light_skin_tone": "👩ðŸ¼\u200d🔬", - "woman_scientist_medium_skin_tone": "👩ðŸ½\u200d🔬", - "woman_shrugging": "🤷\u200d♀ï¸", - "woman_shrugging_dark_skin_tone": "🤷ðŸ¿\u200d♀ï¸", - "woman_shrugging_light_skin_tone": "🤷ðŸ»\u200d♀ï¸", - "woman_shrugging_medium-dark_skin_tone": "🤷ðŸ¾\u200d♀ï¸", - "woman_shrugging_medium-light_skin_tone": "🤷ðŸ¼\u200d♀ï¸", - "woman_shrugging_medium_skin_tone": "🤷ðŸ½\u200d♀ï¸", - "woman_singer": "👩\u200d🎤", - "woman_singer_dark_skin_tone": "👩ðŸ¿\u200d🎤", - "woman_singer_light_skin_tone": "👩ðŸ»\u200d🎤", - "woman_singer_medium-dark_skin_tone": "👩ðŸ¾\u200d🎤", - "woman_singer_medium-light_skin_tone": "👩ðŸ¼\u200d🎤", - "woman_singer_medium_skin_tone": "👩ðŸ½\u200d🎤", - "woman_student": "👩\u200d🎓", - "woman_student_dark_skin_tone": "👩ðŸ¿\u200d🎓", - "woman_student_light_skin_tone": "👩ðŸ»\u200d🎓", - "woman_student_medium-dark_skin_tone": "👩ðŸ¾\u200d🎓", - "woman_student_medium-light_skin_tone": "👩ðŸ¼\u200d🎓", - "woman_student_medium_skin_tone": "👩ðŸ½\u200d🎓", - "woman_surfing": "ðŸ„\u200d♀ï¸", - "woman_surfing_dark_skin_tone": "ðŸ„ðŸ¿\u200d♀ï¸", - "woman_surfing_light_skin_tone": "ðŸ„ðŸ»\u200d♀ï¸", - "woman_surfing_medium-dark_skin_tone": "ðŸ„ðŸ¾\u200d♀ï¸", - "woman_surfing_medium-light_skin_tone": "ðŸ„ðŸ¼\u200d♀ï¸", - "woman_surfing_medium_skin_tone": "ðŸ„ðŸ½\u200d♀ï¸", - "woman_swimming": "ðŸŠ\u200d♀ï¸", - "woman_swimming_dark_skin_tone": "ðŸŠðŸ¿\u200d♀ï¸", - "woman_swimming_light_skin_tone": "ðŸŠðŸ»\u200d♀ï¸", - "woman_swimming_medium-dark_skin_tone": "ðŸŠðŸ¾\u200d♀ï¸", - "woman_swimming_medium-light_skin_tone": "ðŸŠðŸ¼\u200d♀ï¸", - "woman_swimming_medium_skin_tone": "ðŸŠðŸ½\u200d♀ï¸", - "woman_teacher": "👩\u200dðŸ«", - "woman_teacher_dark_skin_tone": "👩ðŸ¿\u200dðŸ«", - "woman_teacher_light_skin_tone": "👩ðŸ»\u200dðŸ«", - "woman_teacher_medium-dark_skin_tone": "👩ðŸ¾\u200dðŸ«", - "woman_teacher_medium-light_skin_tone": "👩ðŸ¼\u200dðŸ«", - "woman_teacher_medium_skin_tone": "👩ðŸ½\u200dðŸ«", - "woman_technologist": "👩\u200d💻", - "woman_technologist_dark_skin_tone": "👩ðŸ¿\u200d💻", - "woman_technologist_light_skin_tone": "👩ðŸ»\u200d💻", - "woman_technologist_medium-dark_skin_tone": "👩ðŸ¾\u200d💻", - "woman_technologist_medium-light_skin_tone": "👩ðŸ¼\u200d💻", - "woman_technologist_medium_skin_tone": "👩ðŸ½\u200d💻", - "woman_tipping_hand": "ðŸ’\u200d♀ï¸", - "woman_tipping_hand_dark_skin_tone": "ðŸ’ðŸ¿\u200d♀ï¸", - "woman_tipping_hand_light_skin_tone": "ðŸ’ðŸ»\u200d♀ï¸", - "woman_tipping_hand_medium-dark_skin_tone": "ðŸ’ðŸ¾\u200d♀ï¸", - "woman_tipping_hand_medium-light_skin_tone": "ðŸ’ðŸ¼\u200d♀ï¸", - "woman_tipping_hand_medium_skin_tone": "ðŸ’ðŸ½\u200d♀ï¸", - "woman_vampire": "🧛\u200d♀ï¸", - "woman_vampire_dark_skin_tone": "🧛ðŸ¿\u200d♀ï¸", - "woman_vampire_light_skin_tone": "🧛ðŸ»\u200d♀ï¸", - "woman_vampire_medium-dark_skin_tone": "🧛ðŸ¾\u200d♀ï¸", - "woman_vampire_medium-light_skin_tone": "🧛ðŸ¼\u200d♀ï¸", - "woman_vampire_medium_skin_tone": "🧛ðŸ½\u200d♀ï¸", - "woman_walking": "🚶\u200d♀ï¸", - "woman_walking_dark_skin_tone": "🚶ðŸ¿\u200d♀ï¸", - "woman_walking_light_skin_tone": "🚶ðŸ»\u200d♀ï¸", - "woman_walking_medium-dark_skin_tone": "🚶ðŸ¾\u200d♀ï¸", - "woman_walking_medium-light_skin_tone": "🚶ðŸ¼\u200d♀ï¸", - "woman_walking_medium_skin_tone": "🚶ðŸ½\u200d♀ï¸", - "woman_wearing_turban": "👳\u200d♀ï¸", - "woman_wearing_turban_dark_skin_tone": "👳ðŸ¿\u200d♀ï¸", - "woman_wearing_turban_light_skin_tone": "👳ðŸ»\u200d♀ï¸", - "woman_wearing_turban_medium-dark_skin_tone": "👳ðŸ¾\u200d♀ï¸", - "woman_wearing_turban_medium-light_skin_tone": "👳ðŸ¼\u200d♀ï¸", - "woman_wearing_turban_medium_skin_tone": "👳ðŸ½\u200d♀ï¸", - "woman_with_headscarf": "🧕", - "woman_with_headscarf_dark_skin_tone": "🧕ðŸ¿", - "woman_with_headscarf_light_skin_tone": "🧕ðŸ»", - "woman_with_headscarf_medium-dark_skin_tone": "🧕ðŸ¾", - "woman_with_headscarf_medium-light_skin_tone": "🧕ðŸ¼", - "woman_with_headscarf_medium_skin_tone": "🧕ðŸ½", - "woman_with_probing_cane": "👩\u200d🦯", - "woman_zombie": "🧟\u200d♀ï¸", - "woman’s_boot": "👢", - "woman’s_clothes": "👚", - "woman’s_hat": "👒", - "woman’s_sandal": "👡", - "women_with_bunny_ears": "👯\u200d♀ï¸", - "women_wrestling": "🤼\u200d♀ï¸", - "women’s_room": "🚺", - "woozy_face": "🥴", - "world_map": "🗺", - "worried_face": "😟", - "wrapped_gift": "ðŸŽ", - "wrench": "🔧", - "writing_hand": "âœ", - "writing_hand_dark_skin_tone": "âœðŸ¿", - "writing_hand_light_skin_tone": "âœðŸ»", - "writing_hand_medium-dark_skin_tone": "âœðŸ¾", - "writing_hand_medium-light_skin_tone": "âœðŸ¼", - "writing_hand_medium_skin_tone": "âœðŸ½", - "yarn": "🧶", - "yawning_face": "🥱", - "yellow_circle": "🟡", - "yellow_heart": "💛", - "yellow_square": "🟨", - "yen_banknote": "💴", - "yo-yo": "🪀", - "yin_yang": "☯", - "zany_face": "🤪", - "zebra": "🦓", - "zipper-mouth_face": "ðŸ¤", - "zombie": "🧟", - "zzz": "💤", - "Ã¥land_islands": "🇦🇽", - "keycap_asterisk": "*⃣", - "keycap_digit_eight": "8⃣", - "keycap_digit_five": "5⃣", - "keycap_digit_four": "4⃣", - "keycap_digit_nine": "9⃣", - "keycap_digit_one": "1⃣", - "keycap_digit_seven": "7⃣", - "keycap_digit_six": "6⃣", - "keycap_digit_three": "3⃣", - "keycap_digit_two": "2⃣", - "keycap_digit_zero": "0⃣", - "keycap_number_sign": "#⃣", - "light_skin_tone": "ðŸ»", - "medium_light_skin_tone": "ðŸ¼", - "medium_skin_tone": "ðŸ½", - "medium_dark_skin_tone": "ðŸ¾", - "dark_skin_tone": "ðŸ¿", - "regional_indicator_symbol_letter_a": "🇦", - "regional_indicator_symbol_letter_b": "🇧", - "regional_indicator_symbol_letter_c": "🇨", - "regional_indicator_symbol_letter_d": "🇩", - "regional_indicator_symbol_letter_e": "🇪", - "regional_indicator_symbol_letter_f": "🇫", - "regional_indicator_symbol_letter_g": "🇬", - "regional_indicator_symbol_letter_h": "🇭", - "regional_indicator_symbol_letter_i": "🇮", - "regional_indicator_symbol_letter_j": "🇯", - "regional_indicator_symbol_letter_k": "🇰", - "regional_indicator_symbol_letter_l": "🇱", - "regional_indicator_symbol_letter_m": "🇲", - "regional_indicator_symbol_letter_n": "🇳", - "regional_indicator_symbol_letter_o": "🇴", - "regional_indicator_symbol_letter_p": "🇵", - "regional_indicator_symbol_letter_q": "🇶", - "regional_indicator_symbol_letter_r": "🇷", - "regional_indicator_symbol_letter_s": "🇸", - "regional_indicator_symbol_letter_t": "🇹", - "regional_indicator_symbol_letter_u": "🇺", - "regional_indicator_symbol_letter_v": "🇻", - "regional_indicator_symbol_letter_w": "🇼", - "regional_indicator_symbol_letter_x": "🇽", - "regional_indicator_symbol_letter_y": "🇾", - "regional_indicator_symbol_letter_z": "🇿", - "airplane_arriving": "🛬", - "space_invader": "👾", - "football": "ðŸˆ", - "anger": "💢", - "angry": "😠", - "anguished": "😧", - "signal_strength": "📶", - "arrows_counterclockwise": "🔄", - "arrow_heading_down": "⤵", - "arrow_heading_up": "⤴", - "art": "🎨", - "astonished": "😲", - "athletic_shoe": "👟", - "atm": "ðŸ§", - "car": "🚗", - "red_car": "🚗", - "angel": "👼", - "back": "🔙", - "badminton_racquet_and_shuttlecock": "ðŸ¸", - "dollar": "💵", - "euro": "💶", - "pound": "💷", - "yen": "💴", - "barber": "💈", - "bath": "🛀", - "bear": "ðŸ»", - "heartbeat": "💓", - "beer": "ðŸº", - "no_bell": "🔕", - "bento": "ðŸ±", - "bike": "🚲", - "bicyclist": "🚴", - "8ball": "🎱", - "biohazard_sign": "☣", - "birthday": "🎂", - "black_circle_for_record": "âº", - "clubs": "♣", - "diamonds": "♦", - "arrow_double_down": "â¬", - "hearts": "♥", - "rewind": "âª", - "black_left__pointing_double_triangle_with_vertical_bar": "â®", - "arrow_backward": "â—€", - "black_medium_small_square": "â—¾", - "question": "â“", - "fast_forward": "â©", - "black_right__pointing_double_triangle_with_vertical_bar": "â­", - "arrow_forward": "â–¶", - "black_right__pointing_triangle_with_double_vertical_bar": "â¯", - "arrow_right": "âž¡", - "spades": "â™ ", - "black_square_for_stop": "â¹", - "sunny": "☀", - "phone": "☎", - "recycle": "â™»", - "arrow_double_up": "â«", - "busstop": "ðŸš", - "date": "📅", - "flags": "ðŸŽ", - "cat2": "ðŸˆ", - "joy_cat": "😹", - "smirk_cat": "😼", - "chart_with_downwards_trend": "📉", - "chart_with_upwards_trend": "📈", - "chart": "💹", - "mega": "📣", - "checkered_flag": "ðŸ", - "accept": "🉑", - "ideograph_advantage": "ðŸ‰", - "congratulations": "㊗", - "secret": "㊙", - "m": "â“‚", - "city_sunset": "🌆", - "clapper": "🎬", - "clap": "ðŸ‘", - "beers": "ðŸ»", - "clock830": "🕣", - "clock8": "🕗", - "clock1130": "🕦", - "clock11": "🕚", - "clock530": "🕠", - "clock5": "🕔", - "clock430": "🕟", - "clock4": "🕓", - "clock930": "🕤", - "clock9": "🕘", - "clock130": "🕜", - "clock1": "ðŸ•", - "clock730": "🕢", - "clock7": "🕖", - "clock630": "🕡", - "clock6": "🕕", - "clock1030": "🕥", - "clock10": "🕙", - "clock330": "🕞", - "clock3": "🕒", - "clock1230": "🕧", - "clock12": "🕛", - "clock230": "ðŸ•", - "clock2": "🕑", - "arrows_clockwise": "🔃", - "repeat": "ðŸ”", - "repeat_one": "🔂", - "closed_lock_with_key": "ðŸ”", - "mailbox_closed": "📪", - "mailbox": "📫", - "cloud_with_tornado": "🌪", - "cocktail": "ðŸ¸", - "boom": "💥", - "compression": "🗜", - "confounded": "😖", - "confused": "😕", - "rice": "ðŸš", - "cow2": "ðŸ„", - "cricket_bat_and_ball": "ðŸ", - "x": "âŒ", - "cry": "😢", - "curry": "ðŸ›", - "dagger_knife": "🗡", - "dancer": "💃", - "dark_sunglasses": "🕶", - "dash": "💨", - "truck": "🚚", - "derelict_house_building": "ðŸš", - "diamond_shape_with_a_dot_inside": "💠", - "dart": "🎯", - "disappointed_relieved": "😥", - "disappointed": "😞", - "do_not_litter": "🚯", - "dog2": "ðŸ•", - "flipper": "ðŸ¬", - "loop": "âž¿", - "bangbang": "‼", - "double_vertical_bar": "â¸", - "dove_of_peace": "🕊", - "small_red_triangle_down": "🔻", - "arrow_down_small": "🔽", - "arrow_down": "⬇", - "dromedary_camel": "ðŸª", - "e__mail": "📧", - "corn": "🌽", - "ear_of_rice": "🌾", - "earth_americas": "🌎", - "earth_asia": "ðŸŒ", - "earth_africa": "ðŸŒ", - "eight_pointed_black_star": "✴", - "eight_spoked_asterisk": "✳", - "eject_symbol": "â", - "bulb": "💡", - "emoji_modifier_fitzpatrick_type__1__2": "ðŸ»", - "emoji_modifier_fitzpatrick_type__3": "ðŸ¼", - "emoji_modifier_fitzpatrick_type__4": "ðŸ½", - "emoji_modifier_fitzpatrick_type__5": "ðŸ¾", - "emoji_modifier_fitzpatrick_type__6": "ðŸ¿", - "end": "🔚", - "email": "✉", - "european_castle": "ðŸ°", - "european_post_office": "ðŸ¤", - "interrobang": "â‰", - "expressionless": "😑", - "eyeglasses": "👓", - "massage": "💆", - "yum": "😋", - "scream": "😱", - "kissing_heart": "😘", - "sweat": "😓", - "face_with_head__bandage": "🤕", - "triumph": "😤", - "mask": "😷", - "no_good": "🙅", - "ok_woman": "🙆", - "open_mouth": "😮", - "cold_sweat": "😰", - "stuck_out_tongue": "😛", - "stuck_out_tongue_closed_eyes": "ðŸ˜", - "stuck_out_tongue_winking_eye": "😜", - "joy": "😂", - "no_mouth": "😶", - "santa": "🎅", - "fax": "📠", - "fearful": "😨", - "field_hockey_stick_and_ball": "ðŸ‘", - "first_quarter_moon_with_face": "🌛", - "fish_cake": "ðŸ¥", - "fishing_pole_and_fish": "🎣", - "facepunch": "👊", - "punch": "👊", - "flag_for_afghanistan": "🇦🇫", - "flag_for_albania": "🇦🇱", - "flag_for_algeria": "🇩🇿", - "flag_for_american_samoa": "🇦🇸", - "flag_for_andorra": "🇦🇩", - "flag_for_angola": "🇦🇴", - "flag_for_anguilla": "🇦🇮", - "flag_for_antarctica": "🇦🇶", - "flag_for_antigua_&_barbuda": "🇦🇬", - "flag_for_argentina": "🇦🇷", - "flag_for_armenia": "🇦🇲", - "flag_for_aruba": "🇦🇼", - "flag_for_ascension_island": "🇦🇨", - "flag_for_australia": "🇦🇺", - "flag_for_austria": "🇦🇹", - "flag_for_azerbaijan": "🇦🇿", - "flag_for_bahamas": "🇧🇸", - "flag_for_bahrain": "🇧🇭", - "flag_for_bangladesh": "🇧🇩", - "flag_for_barbados": "🇧🇧", - "flag_for_belarus": "🇧🇾", - "flag_for_belgium": "🇧🇪", - "flag_for_belize": "🇧🇿", - "flag_for_benin": "🇧🇯", - "flag_for_bermuda": "🇧🇲", - "flag_for_bhutan": "🇧🇹", - "flag_for_bolivia": "🇧🇴", - "flag_for_bosnia_&_herzegovina": "🇧🇦", - "flag_for_botswana": "🇧🇼", - "flag_for_bouvet_island": "🇧🇻", - "flag_for_brazil": "🇧🇷", - "flag_for_british_indian_ocean_territory": "🇮🇴", - "flag_for_british_virgin_islands": "🇻🇬", - "flag_for_brunei": "🇧🇳", - "flag_for_bulgaria": "🇧🇬", - "flag_for_burkina_faso": "🇧🇫", - "flag_for_burundi": "🇧🇮", - "flag_for_cambodia": "🇰🇭", - "flag_for_cameroon": "🇨🇲", - "flag_for_canada": "🇨🇦", - "flag_for_canary_islands": "🇮🇨", - "flag_for_cape_verde": "🇨🇻", - "flag_for_caribbean_netherlands": "🇧🇶", - "flag_for_cayman_islands": "🇰🇾", - "flag_for_central_african_republic": "🇨🇫", - "flag_for_ceuta_&_melilla": "🇪🇦", - "flag_for_chad": "🇹🇩", - "flag_for_chile": "🇨🇱", - "flag_for_china": "🇨🇳", - "flag_for_christmas_island": "🇨🇽", - "flag_for_clipperton_island": "🇨🇵", - "flag_for_cocos__islands": "🇨🇨", - "flag_for_colombia": "🇨🇴", - "flag_for_comoros": "🇰🇲", - "flag_for_congo____brazzaville": "🇨🇬", - "flag_for_congo____kinshasa": "🇨🇩", - "flag_for_cook_islands": "🇨🇰", - "flag_for_costa_rica": "🇨🇷", - "flag_for_croatia": "🇭🇷", - "flag_for_cuba": "🇨🇺", - "flag_for_curaçao": "🇨🇼", - "flag_for_cyprus": "🇨🇾", - "flag_for_czech_republic": "🇨🇿", - "flag_for_côte_d’ivoire": "🇨🇮", - "flag_for_denmark": "🇩🇰", - "flag_for_diego_garcia": "🇩🇬", - "flag_for_djibouti": "🇩🇯", - "flag_for_dominica": "🇩🇲", - "flag_for_dominican_republic": "🇩🇴", - "flag_for_ecuador": "🇪🇨", - "flag_for_egypt": "🇪🇬", - "flag_for_el_salvador": "🇸🇻", - "flag_for_equatorial_guinea": "🇬🇶", - "flag_for_eritrea": "🇪🇷", - "flag_for_estonia": "🇪🇪", - "flag_for_ethiopia": "🇪🇹", - "flag_for_european_union": "🇪🇺", - "flag_for_falkland_islands": "🇫🇰", - "flag_for_faroe_islands": "🇫🇴", - "flag_for_fiji": "🇫🇯", - "flag_for_finland": "🇫🇮", - "flag_for_france": "🇫🇷", - "flag_for_french_guiana": "🇬🇫", - "flag_for_french_polynesia": "🇵🇫", - "flag_for_french_southern_territories": "🇹🇫", - "flag_for_gabon": "🇬🇦", - "flag_for_gambia": "🇬🇲", - "flag_for_georgia": "🇬🇪", - "flag_for_germany": "🇩🇪", - "flag_for_ghana": "🇬🇭", - "flag_for_gibraltar": "🇬🇮", - "flag_for_greece": "🇬🇷", - "flag_for_greenland": "🇬🇱", - "flag_for_grenada": "🇬🇩", - "flag_for_guadeloupe": "🇬🇵", - "flag_for_guam": "🇬🇺", - "flag_for_guatemala": "🇬🇹", - "flag_for_guernsey": "🇬🇬", - "flag_for_guinea": "🇬🇳", - "flag_for_guinea__bissau": "🇬🇼", - "flag_for_guyana": "🇬🇾", - "flag_for_haiti": "🇭🇹", - "flag_for_heard_&_mcdonald_islands": "🇭🇲", - "flag_for_honduras": "🇭🇳", - "flag_for_hong_kong": "🇭🇰", - "flag_for_hungary": "🇭🇺", - "flag_for_iceland": "🇮🇸", - "flag_for_india": "🇮🇳", - "flag_for_indonesia": "🇮🇩", - "flag_for_iran": "🇮🇷", - "flag_for_iraq": "🇮🇶", - "flag_for_ireland": "🇮🇪", - "flag_for_isle_of_man": "🇮🇲", - "flag_for_israel": "🇮🇱", - "flag_for_italy": "🇮🇹", - "flag_for_jamaica": "🇯🇲", - "flag_for_japan": "🇯🇵", - "flag_for_jersey": "🇯🇪", - "flag_for_jordan": "🇯🇴", - "flag_for_kazakhstan": "🇰🇿", - "flag_for_kenya": "🇰🇪", - "flag_for_kiribati": "🇰🇮", - "flag_for_kosovo": "🇽🇰", - "flag_for_kuwait": "🇰🇼", - "flag_for_kyrgyzstan": "🇰🇬", - "flag_for_laos": "🇱🇦", - "flag_for_latvia": "🇱🇻", - "flag_for_lebanon": "🇱🇧", - "flag_for_lesotho": "🇱🇸", - "flag_for_liberia": "🇱🇷", - "flag_for_libya": "🇱🇾", - "flag_for_liechtenstein": "🇱🇮", - "flag_for_lithuania": "🇱🇹", - "flag_for_luxembourg": "🇱🇺", - "flag_for_macau": "🇲🇴", - "flag_for_macedonia": "🇲🇰", - "flag_for_madagascar": "🇲🇬", - "flag_for_malawi": "🇲🇼", - "flag_for_malaysia": "🇲🇾", - "flag_for_maldives": "🇲🇻", - "flag_for_mali": "🇲🇱", - "flag_for_malta": "🇲🇹", - "flag_for_marshall_islands": "🇲🇭", - "flag_for_martinique": "🇲🇶", - "flag_for_mauritania": "🇲🇷", - "flag_for_mauritius": "🇲🇺", - "flag_for_mayotte": "🇾🇹", - "flag_for_mexico": "🇲🇽", - "flag_for_micronesia": "🇫🇲", - "flag_for_moldova": "🇲🇩", - "flag_for_monaco": "🇲🇨", - "flag_for_mongolia": "🇲🇳", - "flag_for_montenegro": "🇲🇪", - "flag_for_montserrat": "🇲🇸", - "flag_for_morocco": "🇲🇦", - "flag_for_mozambique": "🇲🇿", - "flag_for_myanmar": "🇲🇲", - "flag_for_namibia": "🇳🇦", - "flag_for_nauru": "🇳🇷", - "flag_for_nepal": "🇳🇵", - "flag_for_netherlands": "🇳🇱", - "flag_for_new_caledonia": "🇳🇨", - "flag_for_new_zealand": "🇳🇿", - "flag_for_nicaragua": "🇳🇮", - "flag_for_niger": "🇳🇪", - "flag_for_nigeria": "🇳🇬", - "flag_for_niue": "🇳🇺", - "flag_for_norfolk_island": "🇳🇫", - "flag_for_north_korea": "🇰🇵", - "flag_for_northern_mariana_islands": "🇲🇵", - "flag_for_norway": "🇳🇴", - "flag_for_oman": "🇴🇲", - "flag_for_pakistan": "🇵🇰", - "flag_for_palau": "🇵🇼", - "flag_for_palestinian_territories": "🇵🇸", - "flag_for_panama": "🇵🇦", - "flag_for_papua_new_guinea": "🇵🇬", - "flag_for_paraguay": "🇵🇾", - "flag_for_peru": "🇵🇪", - "flag_for_philippines": "🇵🇭", - "flag_for_pitcairn_islands": "🇵🇳", - "flag_for_poland": "🇵🇱", - "flag_for_portugal": "🇵🇹", - "flag_for_puerto_rico": "🇵🇷", - "flag_for_qatar": "🇶🇦", - "flag_for_romania": "🇷🇴", - "flag_for_russia": "🇷🇺", - "flag_for_rwanda": "🇷🇼", - "flag_for_réunion": "🇷🇪", - "flag_for_samoa": "🇼🇸", - "flag_for_san_marino": "🇸🇲", - "flag_for_saudi_arabia": "🇸🇦", - "flag_for_senegal": "🇸🇳", - "flag_for_serbia": "🇷🇸", - "flag_for_seychelles": "🇸🇨", - "flag_for_sierra_leone": "🇸🇱", - "flag_for_singapore": "🇸🇬", - "flag_for_sint_maarten": "🇸🇽", - "flag_for_slovakia": "🇸🇰", - "flag_for_slovenia": "🇸🇮", - "flag_for_solomon_islands": "🇸🇧", - "flag_for_somalia": "🇸🇴", - "flag_for_south_africa": "🇿🇦", - "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸", - "flag_for_south_korea": "🇰🇷", - "flag_for_south_sudan": "🇸🇸", - "flag_for_spain": "🇪🇸", - "flag_for_sri_lanka": "🇱🇰", - "flag_for_st._barthélemy": "🇧🇱", - "flag_for_st._helena": "🇸🇭", - "flag_for_st._kitts_&_nevis": "🇰🇳", - "flag_for_st._lucia": "🇱🇨", - "flag_for_st._martin": "🇲🇫", - "flag_for_st._pierre_&_miquelon": "🇵🇲", - "flag_for_st._vincent_&_grenadines": "🇻🇨", - "flag_for_sudan": "🇸🇩", - "flag_for_suriname": "🇸🇷", - "flag_for_svalbard_&_jan_mayen": "🇸🇯", - "flag_for_swaziland": "🇸🇿", - "flag_for_sweden": "🇸🇪", - "flag_for_switzerland": "🇨🇭", - "flag_for_syria": "🇸🇾", - "flag_for_são_tomé_&_príncipe": "🇸🇹", - "flag_for_taiwan": "🇹🇼", - "flag_for_tajikistan": "🇹🇯", - "flag_for_tanzania": "🇹🇿", - "flag_for_thailand": "🇹🇭", - "flag_for_timor__leste": "🇹🇱", - "flag_for_togo": "🇹🇬", - "flag_for_tokelau": "🇹🇰", - "flag_for_tonga": "🇹🇴", - "flag_for_trinidad_&_tobago": "🇹🇹", - "flag_for_tristan_da_cunha": "🇹🇦", - "flag_for_tunisia": "🇹🇳", - "flag_for_turkey": "🇹🇷", - "flag_for_turkmenistan": "🇹🇲", - "flag_for_turks_&_caicos_islands": "🇹🇨", - "flag_for_tuvalu": "🇹🇻", - "flag_for_u.s._outlying_islands": "🇺🇲", - "flag_for_u.s._virgin_islands": "🇻🇮", - "flag_for_uganda": "🇺🇬", - "flag_for_ukraine": "🇺🇦", - "flag_for_united_arab_emirates": "🇦🇪", - "flag_for_united_kingdom": "🇬🇧", - "flag_for_united_states": "🇺🇸", - "flag_for_uruguay": "🇺🇾", - "flag_for_uzbekistan": "🇺🇿", - "flag_for_vanuatu": "🇻🇺", - "flag_for_vatican_city": "🇻🇦", - "flag_for_venezuela": "🇻🇪", - "flag_for_vietnam": "🇻🇳", - "flag_for_wallis_&_futuna": "🇼🇫", - "flag_for_western_sahara": "🇪🇭", - "flag_for_yemen": "🇾🇪", - "flag_for_zambia": "🇿🇲", - "flag_for_zimbabwe": "🇿🇼", - "flag_for_Ã¥land_islands": "🇦🇽", - "golf": "⛳", - "fleur__de__lis": "âšœ", - "muscle": "💪", - "flushed": "😳", - "frame_with_picture": "🖼", - "fries": "ðŸŸ", - "frog": "ðŸ¸", - "hatched_chick": "ðŸ¥", - "frowning": "😦", - "fuelpump": "⛽", - "full_moon_with_face": "ðŸŒ", - "gem": "💎", - "star2": "🌟", - "golfer": "ðŸŒ", - "mortar_board": "🎓", - "grimacing": "😬", - "smile_cat": "😸", - "grinning": "😀", - "grin": "ðŸ˜", - "heartpulse": "💗", - "guardsman": "💂", - "haircut": "💇", - "hamster": "ðŸ¹", - "raising_hand": "🙋", - "headphones": "🎧", - "hear_no_evil": "🙉", - "cupid": "💘", - "gift_heart": "ðŸ’", - "heart": "â¤", - "exclamation": "â—", - "heavy_exclamation_mark": "â—", - "heavy_heart_exclamation_mark_ornament": "â£", - "o": "â­•", - "helm_symbol": "⎈", - "helmet_with_white_cross": "⛑", - "high_heel": "👠", - "bullettrain_side": "🚄", - "bullettrain_front": "🚅", - "high_brightness": "🔆", - "zap": "âš¡", - "hocho": "🔪", - "knife": "🔪", - "bee": "ðŸ", - "traffic_light": "🚥", - "racehorse": "ðŸŽ", - "coffee": "☕", - "hotsprings": "♨", - "hourglass": "⌛", - "hourglass_flowing_sand": "â³", - "house_buildings": "ðŸ˜", - "100": "💯", - "hushed": "😯", - "ice_hockey_stick_and_puck": "ðŸ’", - "imp": "👿", - "information_desk_person": "ðŸ’", - "information_source": "ℹ", - "capital_abcd": "🔠", - "abc": "🔤", - "abcd": "🔡", - "1234": "🔢", - "symbols": "🔣", - "izakaya_lantern": "ðŸ®", - "lantern": "ðŸ®", - "jack_o_lantern": "🎃", - "dolls": "🎎", - "japanese_goblin": "👺", - "japanese_ogre": "👹", - "beginner": "🔰", - "zero": "0ï¸âƒ£", - "one": "1ï¸âƒ£", - "ten": "🔟", - "two": "2ï¸âƒ£", - "three": "3ï¸âƒ£", - "four": "4ï¸âƒ£", - "five": "5ï¸âƒ£", - "six": "6ï¸âƒ£", - "seven": "7ï¸âƒ£", - "eight": "8ï¸âƒ£", - "nine": "9ï¸âƒ£", - "couplekiss": "ðŸ’", - "kissing_cat": "😽", - "kissing": "😗", - "kissing_closed_eyes": "😚", - "kissing_smiling_eyes": "😙", - "beetle": "ðŸž", - "large_blue_circle": "🔵", - "last_quarter_moon_with_face": "🌜", - "leaves": "ðŸƒ", - "mag": "ðŸ”", - "left_right_arrow": "↔", - "leftwards_arrow_with_hook": "↩", - "arrow_left": "⬅", - "lock": "🔒", - "lock_with_ink_pen": "ðŸ”", - "sob": "😭", - "low_brightness": "🔅", - "lower_left_ballpoint_pen": "🖊", - "lower_left_crayon": "ðŸ–", - "lower_left_fountain_pen": "🖋", - "lower_left_paintbrush": "🖌", - "mahjong": "🀄", - "couple": "👫", - "man_in_business_suit_levitating": "🕴", - "man_with_gua_pi_mao": "👲", - "man_with_turban": "👳", - "mans_shoe": "👞", - "shoe": "👞", - "menorah_with_nine_branches": "🕎", - "mens": "🚹", - "minidisc": "💽", - "iphone": "📱", - "calling": "📲", - "money__mouth_face": "🤑", - "moneybag": "💰", - "rice_scene": "🎑", - "mountain_bicyclist": "🚵", - "mouse2": "ðŸ", - "lips": "👄", - "moyai": "🗿", - "notes": "🎶", - "nail_care": "💅", - "ab": "🆎", - "negative_squared_cross_mark": "âŽ", - "a": "🅰", - "b": "🅱", - "o2": "🅾", - "parking": "🅿", - "new_moon_with_face": "🌚", - "no_entry_sign": "🚫", - "underage": "🔞", - "non__potable_water": "🚱", - "arrow_upper_right": "↗", - "arrow_upper_left": "↖", - "office": "ðŸ¢", - "older_man": "👴", - "older_woman": "👵", - "om_symbol": "🕉", - "on": "🔛", - "book": "📖", - "unlock": "🔓", - "mailbox_with_no_mail": "📭", - "mailbox_with_mail": "📬", - "cd": "💿", - "tada": "🎉", - "feet": "ðŸ¾", - "walking": "🚶", - "pencil2": "âœ", - "pensive": "😔", - "persevere": "😣", - "bow": "🙇", - "raised_hands": "🙌", - "person_with_ball": "⛹", - "person_with_blond_hair": "👱", - "pray": "ðŸ™", - "person_with_pouting_face": "🙎", - "computer": "💻", - "pig2": "ðŸ–", - "hankey": "💩", - "poop": "💩", - "shit": "💩", - "bamboo": "ðŸŽ", - "gun": "🔫", - "black_joker": "ðŸƒ", - "rotating_light": "🚨", - "cop": "👮", - "stew": "ðŸ²", - "pouch": "ðŸ‘", - "pouting_cat": "😾", - "rage": "😡", - "put_litter_in_its_place": "🚮", - "rabbit2": "ðŸ‡", - "racing_motorcycle": "ðŸ", - "radioactive_sign": "☢", - "fist": "✊", - "hand": "✋", - "raised_hand_with_fingers_splayed": "ðŸ–", - "raised_hand_with_part_between_middle_and_ring_fingers": "🖖", - "blue_car": "🚙", - "apple": "ðŸŽ", - "relieved": "😌", - "reversed_hand_with_middle_finger_extended": "🖕", - "mag_right": "🔎", - "arrow_right_hook": "↪", - "sweet_potato": "ðŸ ", - "robot": "🤖", - "rolled__up_newspaper": "🗞", - "rowboat": "🚣", - "runner": "ðŸƒ", - "running": "ðŸƒ", - "running_shirt_with_sash": "🎽", - "boat": "⛵", - "scales": "âš–", - "school_satchel": "🎒", - "scorpius": "â™", - "see_no_evil": "🙈", - "sheep": "ðŸ‘", - "stars": "🌠", - "cake": "ðŸ°", - "six_pointed_star": "🔯", - "ski": "🎿", - "sleeping_accommodation": "🛌", - "sleeping": "😴", - "sleepy": "😪", - "sleuth_or_spy": "🕵", - "heart_eyes_cat": "😻", - "smiley_cat": "😺", - "innocent": "😇", - "heart_eyes": "ðŸ˜", - "smiling_imp": "😈", - "smiley": "😃", - "sweat_smile": "😅", - "smile": "😄", - "laughing": "😆", - "satisfied": "😆", - "blush": "😊", - "smirk": "ðŸ˜", - "smoking": "🚬", - "snow_capped_mountain": "ðŸ”", - "soccer": "âš½", - "icecream": "ðŸ¦", - "soon": "🔜", - "arrow_lower_right": "↘", - "arrow_lower_left": "↙", - "speak_no_evil": "🙊", - "speaker": "🔈", - "mute": "🔇", - "sound": "🔉", - "loud_sound": "🔊", - "speaking_head_in_silhouette": "🗣", - "spiral_calendar_pad": "🗓", - "spiral_note_pad": "🗒", - "shell": "ðŸš", - "sweat_drops": "💦", - "u5272": "🈹", - "u5408": "🈴", - "u55b6": "🈺", - "u6307": "🈯", - "u6708": "🈷", - "u6709": "🈶", - "u6e80": "🈵", - "u7121": "🈚", - "u7533": "🈸", - "u7981": "🈲", - "u7a7a": "🈳", - "cl": "🆑", - "cool": "🆒", - "free": "🆓", - "id": "🆔", - "koko": "ðŸˆ", - "sa": "🈂", - "new": "🆕", - "ng": "🆖", - "ok": "🆗", - "sos": "🆘", - "up": "🆙", - "vs": "🆚", - "steam_locomotive": "🚂", - "ramen": "ðŸœ", - "partly_sunny": "â›…", - "city_sunrise": "🌇", - "surfer": "ðŸ„", - "swimmer": "ðŸŠ", - "shirt": "👕", - "tshirt": "👕", - "table_tennis_paddle_and_ball": "ðŸ“", - "tea": "ðŸµ", - "tv": "📺", - "three_button_mouse": "🖱", - "+1": "ðŸ‘", - "thumbsup": "ðŸ‘", - "__1": "👎", - "-1": "👎", - "thumbsdown": "👎", - "thunder_cloud_and_rain": "⛈", - "tiger2": "ðŸ…", - "tophat": "🎩", - "top": "ðŸ”", - "tm": "â„¢", - "train2": "🚆", - "triangular_flag_on_post": "🚩", - "trident": "🔱", - "twisted_rightwards_arrows": "🔀", - "unamused": "😒", - "small_red_triangle": "🔺", - "arrow_up_small": "🔼", - "arrow_up_down": "↕", - "upside__down_face": "🙃", - "arrow_up": "⬆", - "v": "✌", - "vhs": "📼", - "wc": "🚾", - "ocean": "🌊", - "waving_black_flag": "ðŸ´", - "wave": "👋", - "waving_white_flag": "ðŸ³", - "moon": "🌔", - "scream_cat": "🙀", - "weary": "😩", - "weight_lifter": "ðŸ‹", - "whale2": "ðŸ‹", - "wheelchair": "♿", - "point_down": "👇", - "grey_exclamation": "â•", - "white_frowning_face": "☹", - "white_check_mark": "✅", - "point_left": "👈", - "white_medium_small_square": "â—½", - "star": "â­", - "grey_question": "â”", - "point_right": "👉", - "relaxed": "☺", - "white_sun_behind_cloud": "🌥", - "white_sun_behind_cloud_with_rain": "🌦", - "white_sun_with_small_cloud": "🌤", - "point_up_2": "👆", - "point_up": "â˜", - "wind_blowing_face": "🌬", - "wink": "😉", - "wolf": "ðŸº", - "dancers": "👯", - "boot": "👢", - "womans_clothes": "👚", - "womans_hat": "👒", - "sandal": "👡", - "womens": "🚺", - "worried": "😟", - "gift": "ðŸŽ", - "zipper__mouth_face": "ðŸ¤", - "regional_indicator_a": "🇦", - "regional_indicator_b": "🇧", - "regional_indicator_c": "🇨", - "regional_indicator_d": "🇩", - "regional_indicator_e": "🇪", - "regional_indicator_f": "🇫", - "regional_indicator_g": "🇬", - "regional_indicator_h": "🇭", - "regional_indicator_i": "🇮", - "regional_indicator_j": "🇯", - "regional_indicator_k": "🇰", - "regional_indicator_l": "🇱", - "regional_indicator_m": "🇲", - "regional_indicator_n": "🇳", - "regional_indicator_o": "🇴", - "regional_indicator_p": "🇵", - "regional_indicator_q": "🇶", - "regional_indicator_r": "🇷", - "regional_indicator_s": "🇸", - "regional_indicator_t": "🇹", - "regional_indicator_u": "🇺", - "regional_indicator_v": "🇻", - "regional_indicator_w": "🇼", - "regional_indicator_x": "🇽", - "regional_indicator_y": "🇾", - "regional_indicator_z": "🇿", -} diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py deleted file mode 100644 index bb2cafa..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py +++ /dev/null @@ -1,32 +0,0 @@ -from typing import Callable, Match, Optional -import re - -from ._emoji_codes import EMOJI - - -_ReStringMatch = Match[str] # regex match object -_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub -_EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re - - -def _emoji_replace( - text: str, - default_variant: Optional[str] = None, - _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub, -) -> str: - """Replace emoji code in text.""" - get_emoji = EMOJI.__getitem__ - variants = {"text": "\uFE0E", "emoji": "\uFE0F"} - get_variant = variants.get - default_variant_code = variants.get(default_variant, "") if default_variant else "" - - def do_replace(match: Match[str]) -> str: - emoji_code, emoji_name, variant = match.groups() - try: - return get_emoji(emoji_name.lower()) + get_variant( - variant, default_variant_code - ) - except KeyError: - return emoji_code - - return _emoji_sub(do_replace, text) diff --git a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py b/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py deleted file mode 100644 index 094d2dc..0000000 --- a/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py +++ /dev/null @@ -1,76 +0,0 @@ -CONSOLE_HTML_FORMAT = """\ - - - - - - - -