This is page 90 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/commands/install.py:
--------------------------------------------------------------------------------
```python
1 | import errno
2 | import json
3 | import operator
4 | import os
5 | import shutil
6 | import site
7 | from optparse import SUPPRESS_HELP, Values
8 | from typing import List, Optional
9 |
10 | from pip._vendor.packaging.utils import canonicalize_name
11 | from pip._vendor.rich import print_json
12 |
13 | from pip._internal.cache import WheelCache
14 | from pip._internal.cli import cmdoptions
15 | from pip._internal.cli.cmdoptions import make_target_python
16 | from pip._internal.cli.req_command import (
17 | RequirementCommand,
18 | with_cleanup,
19 | )
20 | from pip._internal.cli.status_codes import ERROR, SUCCESS
21 | from pip._internal.exceptions import CommandError, InstallationError
22 | from pip._internal.locations import get_scheme
23 | from pip._internal.metadata import get_environment
24 | from pip._internal.models.installation_report import InstallationReport
25 | from pip._internal.operations.build.build_tracker import get_build_tracker
26 | from pip._internal.operations.check import ConflictDetails, check_install_conflicts
27 | from pip._internal.req import install_given_reqs
28 | from pip._internal.req.req_install import (
29 | InstallRequirement,
30 | check_legacy_setup_py_options,
31 | )
32 | from pip._internal.utils.compat import WINDOWS
33 | from pip._internal.utils.filesystem import test_writable_dir
34 | from pip._internal.utils.logging import getLogger
35 | from pip._internal.utils.misc import (
36 | check_externally_managed,
37 | ensure_dir,
38 | get_pip_version,
39 | protect_pip_from_modification_on_windows,
40 | warn_if_run_as_root,
41 | write_output,
42 | )
43 | from pip._internal.utils.temp_dir import TempDirectory
44 | from pip._internal.utils.virtualenv import (
45 | running_under_virtualenv,
46 | virtualenv_no_global,
47 | )
48 | from pip._internal.wheel_builder import build, should_build_for_install_command
49 |
50 | logger = getLogger(__name__)
51 |
52 |
53 | class InstallCommand(RequirementCommand):
54 | """
55 | Install packages from:
56 |
57 | - PyPI (and other indexes) using requirement specifiers.
58 | - VCS project urls.
59 | - Local project directories.
60 | - Local or remote source archives.
61 |
62 | pip also supports installing from "requirements files", which provide
63 | an easy way to specify a whole environment to be installed.
64 | """
65 |
66 | usage = """
67 | %prog [options] <requirement specifier> [package-index-options] ...
68 | %prog [options] -r <requirements file> [package-index-options] ...
69 | %prog [options] [-e] <vcs project url> ...
70 | %prog [options] [-e] <local project path> ...
71 | %prog [options] <archive url/path> ..."""
72 |
73 | def add_options(self) -> None:
74 | self.cmd_opts.add_option(cmdoptions.requirements())
75 | self.cmd_opts.add_option(cmdoptions.constraints())
76 | self.cmd_opts.add_option(cmdoptions.no_deps())
77 | self.cmd_opts.add_option(cmdoptions.pre())
78 |
79 | self.cmd_opts.add_option(cmdoptions.editable())
80 | self.cmd_opts.add_option(
81 | "--dry-run",
82 | action="store_true",
83 | dest="dry_run",
84 | default=False,
85 | help=(
86 | "Don't actually install anything, just print what would be. "
87 | "Can be used in combination with --ignore-installed "
88 | "to 'resolve' the requirements."
89 | ),
90 | )
91 | self.cmd_opts.add_option(
92 | "-t",
93 | "--target",
94 | dest="target_dir",
95 | metavar="dir",
96 | default=None,
97 | help=(
98 | "Install packages into <dir>. "
99 | "By default this will not replace existing files/folders in "
100 | "<dir>. Use --upgrade to replace existing packages in <dir> "
101 | "with new versions."
102 | ),
103 | )
104 | cmdoptions.add_target_python_options(self.cmd_opts)
105 |
106 | self.cmd_opts.add_option(
107 | "--user",
108 | dest="use_user_site",
109 | action="store_true",
110 | help=(
111 | "Install to the Python user install directory for your "
112 | "platform. Typically ~/.local/, or %APPDATA%\\Python on "
113 | "Windows. (See the Python documentation for site.USER_BASE "
114 | "for full details.)"
115 | ),
116 | )
117 | self.cmd_opts.add_option(
118 | "--no-user",
119 | dest="use_user_site",
120 | action="store_false",
121 | help=SUPPRESS_HELP,
122 | )
123 | self.cmd_opts.add_option(
124 | "--root",
125 | dest="root_path",
126 | metavar="dir",
127 | default=None,
128 | help="Install everything relative to this alternate root directory.",
129 | )
130 | self.cmd_opts.add_option(
131 | "--prefix",
132 | dest="prefix_path",
133 | metavar="dir",
134 | default=None,
135 | help=(
136 | "Installation prefix where lib, bin and other top-level "
137 | "folders are placed. Note that the resulting installation may "
138 | "contain scripts and other resources which reference the "
139 | "Python interpreter of pip, and not that of ``--prefix``. "
140 | "See also the ``--python`` option if the intention is to "
141 | "install packages into another (possibly pip-free) "
142 | "environment."
143 | ),
144 | )
145 |
146 | self.cmd_opts.add_option(cmdoptions.src())
147 |
148 | self.cmd_opts.add_option(
149 | "-U",
150 | "--upgrade",
151 | dest="upgrade",
152 | action="store_true",
153 | help=(
154 | "Upgrade all specified packages to the newest available "
155 | "version. The handling of dependencies depends on the "
156 | "upgrade-strategy used."
157 | ),
158 | )
159 |
160 | self.cmd_opts.add_option(
161 | "--upgrade-strategy",
162 | dest="upgrade_strategy",
163 | default="only-if-needed",
164 | choices=["only-if-needed", "eager"],
165 | help=(
166 | "Determines how dependency upgrading should be handled "
167 | "[default: %default]. "
168 | '"eager" - dependencies are upgraded regardless of '
169 | "whether the currently installed version satisfies the "
170 | "requirements of the upgraded package(s). "
171 | '"only-if-needed" - are upgraded only when they do not '
172 | "satisfy the requirements of the upgraded package(s)."
173 | ),
174 | )
175 |
176 | self.cmd_opts.add_option(
177 | "--force-reinstall",
178 | dest="force_reinstall",
179 | action="store_true",
180 | help="Reinstall all packages even if they are already up-to-date.",
181 | )
182 |
183 | self.cmd_opts.add_option(
184 | "-I",
185 | "--ignore-installed",
186 | dest="ignore_installed",
187 | action="store_true",
188 | help=(
189 | "Ignore the installed packages, overwriting them. "
190 | "This can break your system if the existing package "
191 | "is of a different version or was installed "
192 | "with a different package manager!"
193 | ),
194 | )
195 |
196 | self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
197 | self.cmd_opts.add_option(cmdoptions.no_build_isolation())
198 | self.cmd_opts.add_option(cmdoptions.use_pep517())
199 | self.cmd_opts.add_option(cmdoptions.no_use_pep517())
200 | self.cmd_opts.add_option(cmdoptions.check_build_deps())
201 | self.cmd_opts.add_option(cmdoptions.override_externally_managed())
202 |
203 | self.cmd_opts.add_option(cmdoptions.config_settings())
204 | self.cmd_opts.add_option(cmdoptions.global_options())
205 |
206 | self.cmd_opts.add_option(
207 | "--compile",
208 | action="store_true",
209 | dest="compile",
210 | default=True,
211 | help="Compile Python source files to bytecode",
212 | )
213 |
214 | self.cmd_opts.add_option(
215 | "--no-compile",
216 | action="store_false",
217 | dest="compile",
218 | help="Do not compile Python source files to bytecode",
219 | )
220 |
221 | self.cmd_opts.add_option(
222 | "--no-warn-script-location",
223 | action="store_false",
224 | dest="warn_script_location",
225 | default=True,
226 | help="Do not warn when installing scripts outside PATH",
227 | )
228 | self.cmd_opts.add_option(
229 | "--no-warn-conflicts",
230 | action="store_false",
231 | dest="warn_about_conflicts",
232 | default=True,
233 | help="Do not warn about broken dependencies",
234 | )
235 | self.cmd_opts.add_option(cmdoptions.no_binary())
236 | self.cmd_opts.add_option(cmdoptions.only_binary())
237 | self.cmd_opts.add_option(cmdoptions.prefer_binary())
238 | self.cmd_opts.add_option(cmdoptions.require_hashes())
239 | self.cmd_opts.add_option(cmdoptions.progress_bar())
240 | self.cmd_opts.add_option(cmdoptions.root_user_action())
241 |
242 | index_opts = cmdoptions.make_option_group(
243 | cmdoptions.index_group,
244 | self.parser,
245 | )
246 |
247 | self.parser.insert_option_group(0, index_opts)
248 | self.parser.insert_option_group(0, self.cmd_opts)
249 |
250 | self.cmd_opts.add_option(
251 | "--report",
252 | dest="json_report_file",
253 | metavar="file",
254 | default=None,
255 | help=(
256 | "Generate a JSON file describing what pip did to install "
257 | "the provided requirements. "
258 | "Can be used in combination with --dry-run and --ignore-installed "
259 | "to 'resolve' the requirements. "
260 | "When - is used as file name it writes to stdout. "
261 | "When writing to stdout, please combine with the --quiet option "
262 | "to avoid mixing pip logging output with JSON output."
263 | ),
264 | )
265 |
266 | @with_cleanup
267 | def run(self, options: Values, args: List[str]) -> int:
268 | if options.use_user_site and options.target_dir is not None:
269 | raise CommandError("Can not combine '--user' and '--target'")
270 |
271 | # Check whether the environment we're installing into is externally
272 | # managed, as specified in PEP 668. Specifying --root, --target, or
273 | # --prefix disables the check, since there's no reliable way to locate
274 | # the EXTERNALLY-MANAGED file for those cases. An exception is also
275 | # made specifically for "--dry-run --report" for convenience.
276 | installing_into_current_environment = (
277 | not (options.dry_run and options.json_report_file)
278 | and options.root_path is None
279 | and options.target_dir is None
280 | and options.prefix_path is None
281 | )
282 | if (
283 | installing_into_current_environment
284 | and not options.override_externally_managed
285 | ):
286 | check_externally_managed()
287 |
288 | upgrade_strategy = "to-satisfy-only"
289 | if options.upgrade:
290 | upgrade_strategy = options.upgrade_strategy
291 |
292 | cmdoptions.check_dist_restriction(options, check_target=True)
293 |
294 | logger.verbose("Using %s", get_pip_version())
295 | options.use_user_site = decide_user_install(
296 | options.use_user_site,
297 | prefix_path=options.prefix_path,
298 | target_dir=options.target_dir,
299 | root_path=options.root_path,
300 | isolated_mode=options.isolated_mode,
301 | )
302 |
303 | target_temp_dir: Optional[TempDirectory] = None
304 | target_temp_dir_path: Optional[str] = None
305 | if options.target_dir:
306 | options.ignore_installed = True
307 | options.target_dir = os.path.abspath(options.target_dir)
308 | if (
309 | # fmt: off
310 | os.path.exists(options.target_dir) and
311 | not os.path.isdir(options.target_dir)
312 | # fmt: on
313 | ):
314 | raise CommandError(
315 | "Target path exists but is not a directory, will not continue."
316 | )
317 |
318 | # Create a target directory for using with the target option
319 | target_temp_dir = TempDirectory(kind="target")
320 | target_temp_dir_path = target_temp_dir.path
321 | self.enter_context(target_temp_dir)
322 |
323 | global_options = options.global_options or []
324 |
325 | session = self.get_default_session(options)
326 |
327 | target_python = make_target_python(options)
328 | finder = self._build_package_finder(
329 | options=options,
330 | session=session,
331 | target_python=target_python,
332 | ignore_requires_python=options.ignore_requires_python,
333 | )
334 | build_tracker = self.enter_context(get_build_tracker())
335 |
336 | directory = TempDirectory(
337 | delete=not options.no_clean,
338 | kind="install",
339 | globally_managed=True,
340 | )
341 |
342 | try:
343 | reqs = self.get_requirements(args, options, finder, session)
344 | check_legacy_setup_py_options(options, reqs)
345 |
346 | wheel_cache = WheelCache(options.cache_dir)
347 |
348 | # Only when installing is it permitted to use PEP 660.
349 | # In other circumstances (pip wheel, pip download) we generate
350 | # regular (i.e. non editable) metadata and wheels.
351 | for req in reqs:
352 | req.permit_editable_wheels = True
353 |
354 | preparer = self.make_requirement_preparer(
355 | temp_build_dir=directory,
356 | options=options,
357 | build_tracker=build_tracker,
358 | session=session,
359 | finder=finder,
360 | use_user_site=options.use_user_site,
361 | verbosity=self.verbosity,
362 | )
363 | resolver = self.make_resolver(
364 | preparer=preparer,
365 | finder=finder,
366 | options=options,
367 | wheel_cache=wheel_cache,
368 | use_user_site=options.use_user_site,
369 | ignore_installed=options.ignore_installed,
370 | ignore_requires_python=options.ignore_requires_python,
371 | force_reinstall=options.force_reinstall,
372 | upgrade_strategy=upgrade_strategy,
373 | use_pep517=options.use_pep517,
374 | py_version_info=options.python_version,
375 | )
376 |
377 | self.trace_basic_info(finder)
378 |
379 | requirement_set = resolver.resolve(
380 | reqs, check_supported_wheels=not options.target_dir
381 | )
382 |
383 | if options.json_report_file:
384 | report = InstallationReport(requirement_set.requirements_to_install)
385 | if options.json_report_file == "-":
386 | print_json(data=report.to_dict())
387 | else:
388 | with open(options.json_report_file, "w", encoding="utf-8") as f:
389 | json.dump(report.to_dict(), f, indent=2, ensure_ascii=False)
390 |
391 | if options.dry_run:
392 | would_install_items = sorted(
393 | (r.metadata["name"], r.metadata["version"])
394 | for r in requirement_set.requirements_to_install
395 | )
396 | if would_install_items:
397 | write_output(
398 | "Would install %s",
399 | " ".join("-".join(item) for item in would_install_items),
400 | )
401 | return SUCCESS
402 |
403 | try:
404 | pip_req = requirement_set.get_requirement("pip")
405 | except KeyError:
406 | modifying_pip = False
407 | else:
408 | # If we're not replacing an already installed pip,
409 | # we're not modifying it.
410 | modifying_pip = pip_req.satisfied_by is None
411 | if modifying_pip:
412 | # Eagerly import this module to avoid crashes. Otherwise, this
413 | # module would be imported *after* pip was replaced, resulting in
414 | # crashes if the new self_outdated_check module was incompatible
415 | # with the rest of pip that's already imported.
416 | import pip._internal.self_outdated_check # noqa: F401
417 | protect_pip_from_modification_on_windows(modifying_pip=modifying_pip)
418 |
419 | reqs_to_build = [
420 | r
421 | for r in requirement_set.requirements.values()
422 | if should_build_for_install_command(r)
423 | ]
424 |
425 | _, build_failures = build(
426 | reqs_to_build,
427 | wheel_cache=wheel_cache,
428 | verify=True,
429 | build_options=[],
430 | global_options=global_options,
431 | )
432 |
433 | if build_failures:
434 | raise InstallationError(
435 | "ERROR: Failed to build installable wheels for some "
436 | "pyproject.toml based projects ({})".format(
437 | ", ".join(r.name for r in build_failures) # type: ignore
438 | )
439 | )
440 |
441 | to_install = resolver.get_installation_order(requirement_set)
442 |
443 | # Check for conflicts in the package set we're installing.
444 | conflicts: Optional[ConflictDetails] = None
445 | should_warn_about_conflicts = (
446 | not options.ignore_dependencies and options.warn_about_conflicts
447 | )
448 | if should_warn_about_conflicts:
449 | conflicts = self._determine_conflicts(to_install)
450 |
451 | # Don't warn about script install locations if
452 | # --target or --prefix has been specified
453 | warn_script_location = options.warn_script_location
454 | if options.target_dir or options.prefix_path:
455 | warn_script_location = False
456 |
457 | installed = install_given_reqs(
458 | to_install,
459 | global_options,
460 | root=options.root_path,
461 | home=target_temp_dir_path,
462 | prefix=options.prefix_path,
463 | warn_script_location=warn_script_location,
464 | use_user_site=options.use_user_site,
465 | pycompile=options.compile,
466 | )
467 |
468 | lib_locations = get_lib_location_guesses(
469 | user=options.use_user_site,
470 | home=target_temp_dir_path,
471 | root=options.root_path,
472 | prefix=options.prefix_path,
473 | isolated=options.isolated_mode,
474 | )
475 | env = get_environment(lib_locations)
476 |
477 | # Display a summary of installed packages, with extra care to
478 | # display a package name as it was requested by the user.
479 | installed.sort(key=operator.attrgetter("name"))
480 | summary = []
481 | installed_versions = {}
482 | for distribution in env.iter_all_distributions():
483 | installed_versions[distribution.canonical_name] = distribution.version
484 | for package in installed:
485 | display_name = package.name
486 | version = installed_versions.get(canonicalize_name(display_name), None)
487 | if version:
488 | text = f"{display_name}-{version}"
489 | else:
490 | text = display_name
491 | summary.append(text)
492 |
493 | if conflicts is not None:
494 | self._warn_about_conflicts(
495 | conflicts,
496 | resolver_variant=self.determine_resolver_variant(options),
497 | )
498 |
499 | installed_desc = " ".join(summary)
500 | if installed_desc:
501 | write_output(
502 | "Successfully installed %s",
503 | installed_desc,
504 | )
505 | except OSError as error:
506 | show_traceback = self.verbosity >= 1
507 |
508 | message = create_os_error_message(
509 | error,
510 | show_traceback,
511 | options.use_user_site,
512 | )
513 | logger.error(message, exc_info=show_traceback)
514 |
515 | return ERROR
516 |
517 | if options.target_dir:
518 | assert target_temp_dir
519 | self._handle_target_dir(
520 | options.target_dir, target_temp_dir, options.upgrade
521 | )
522 | if options.root_user_action == "warn":
523 | warn_if_run_as_root()
524 | return SUCCESS
525 |
526 | def _handle_target_dir(
527 | self, target_dir: str, target_temp_dir: TempDirectory, upgrade: bool
528 | ) -> None:
529 | ensure_dir(target_dir)
530 |
531 | # Checking both purelib and platlib directories for installed
532 | # packages to be moved to target directory
533 | lib_dir_list = []
534 |
535 | # Checking both purelib and platlib directories for installed
536 | # packages to be moved to target directory
537 | scheme = get_scheme("", home=target_temp_dir.path)
538 | purelib_dir = scheme.purelib
539 | platlib_dir = scheme.platlib
540 | data_dir = scheme.data
541 |
542 | if os.path.exists(purelib_dir):
543 | lib_dir_list.append(purelib_dir)
544 | if os.path.exists(platlib_dir) and platlib_dir != purelib_dir:
545 | lib_dir_list.append(platlib_dir)
546 | if os.path.exists(data_dir):
547 | lib_dir_list.append(data_dir)
548 |
549 | for lib_dir in lib_dir_list:
550 | for item in os.listdir(lib_dir):
551 | if lib_dir == data_dir:
552 | ddir = os.path.join(data_dir, item)
553 | if any(s.startswith(ddir) for s in lib_dir_list[:-1]):
554 | continue
555 | target_item_dir = os.path.join(target_dir, item)
556 | if os.path.exists(target_item_dir):
557 | if not upgrade:
558 | logger.warning(
559 | "Target directory %s already exists. Specify "
560 | "--upgrade to force replacement.",
561 | target_item_dir,
562 | )
563 | continue
564 | if os.path.islink(target_item_dir):
565 | logger.warning(
566 | "Target directory %s already exists and is "
567 | "a link. pip will not automatically replace "
568 | "links, please remove if replacement is "
569 | "desired.",
570 | target_item_dir,
571 | )
572 | continue
573 | if os.path.isdir(target_item_dir):
574 | shutil.rmtree(target_item_dir)
575 | else:
576 | os.remove(target_item_dir)
577 |
578 | shutil.move(os.path.join(lib_dir, item), target_item_dir)
579 |
580 | def _determine_conflicts(
581 | self, to_install: List[InstallRequirement]
582 | ) -> Optional[ConflictDetails]:
583 | try:
584 | return check_install_conflicts(to_install)
585 | except Exception:
586 | logger.exception(
587 | "Error while checking for conflicts. Please file an issue on "
588 | "pip's issue tracker: https://github.com/pypa/pip/issues/new"
589 | )
590 | return None
591 |
592 | def _warn_about_conflicts(
593 | self, conflict_details: ConflictDetails, resolver_variant: str
594 | ) -> None:
595 | package_set, (missing, conflicting) = conflict_details
596 | if not missing and not conflicting:
597 | return
598 |
599 | parts: List[str] = []
600 | if resolver_variant == "legacy":
601 | parts.append(
602 | "pip's legacy dependency resolver does not consider dependency "
603 | "conflicts when selecting packages. This behaviour is the "
604 | "source of the following dependency conflicts."
605 | )
606 | else:
607 | assert resolver_variant == "resolvelib"
608 | parts.append(
609 | "pip's dependency resolver does not currently take into account "
610 | "all the packages that are installed. This behaviour is the "
611 | "source of the following dependency conflicts."
612 | )
613 |
614 | # NOTE: There is some duplication here, with commands/check.py
615 | for project_name in missing:
616 | version = package_set[project_name][0]
617 | for dependency in missing[project_name]:
618 | message = (
619 | f"{project_name} {version} requires {dependency[1]}, "
620 | "which is not installed."
621 | )
622 | parts.append(message)
623 |
624 | for project_name in conflicting:
625 | version = package_set[project_name][0]
626 | for dep_name, dep_version, req in conflicting[project_name]:
627 | message = (
628 | "{name} {version} requires {requirement}, but {you} have "
629 | "{dep_name} {dep_version} which is incompatible."
630 | ).format(
631 | name=project_name,
632 | version=version,
633 | requirement=req,
634 | dep_name=dep_name,
635 | dep_version=dep_version,
636 | you=("you" if resolver_variant == "resolvelib" else "you'll"),
637 | )
638 | parts.append(message)
639 |
640 | logger.critical("\n".join(parts))
641 |
642 |
643 | def get_lib_location_guesses(
644 | user: bool = False,
645 | home: Optional[str] = None,
646 | root: Optional[str] = None,
647 | isolated: bool = False,
648 | prefix: Optional[str] = None,
649 | ) -> List[str]:
650 | scheme = get_scheme(
651 | "",
652 | user=user,
653 | home=home,
654 | root=root,
655 | isolated=isolated,
656 | prefix=prefix,
657 | )
658 | return [scheme.purelib, scheme.platlib]
659 |
660 |
661 | def site_packages_writable(root: Optional[str], isolated: bool) -> bool:
662 | return all(
663 | test_writable_dir(d)
664 | for d in set(get_lib_location_guesses(root=root, isolated=isolated))
665 | )
666 |
667 |
668 | def decide_user_install(
669 | use_user_site: Optional[bool],
670 | prefix_path: Optional[str] = None,
671 | target_dir: Optional[str] = None,
672 | root_path: Optional[str] = None,
673 | isolated_mode: bool = False,
674 | ) -> bool:
675 | """Determine whether to do a user install based on the input options.
676 |
677 | If use_user_site is False, no additional checks are done.
678 | If use_user_site is True, it is checked for compatibility with other
679 | options.
680 | If use_user_site is None, the default behaviour depends on the environment,
681 | which is provided by the other arguments.
682 | """
683 | # In some cases (config from tox), use_user_site can be set to an integer
684 | # rather than a bool, which 'use_user_site is False' wouldn't catch.
685 | if (use_user_site is not None) and (not use_user_site):
686 | logger.debug("Non-user install by explicit request")
687 | return False
688 |
689 | if use_user_site:
690 | if prefix_path:
691 | raise CommandError(
692 | "Can not combine '--user' and '--prefix' as they imply "
693 | "different installation locations"
694 | )
695 | if virtualenv_no_global():
696 | raise InstallationError(
697 | "Can not perform a '--user' install. User site-packages "
698 | "are not visible in this virtualenv."
699 | )
700 | logger.debug("User install by explicit request")
701 | return True
702 |
703 | # If we are here, user installs have not been explicitly requested/avoided
704 | assert use_user_site is None
705 |
706 | # user install incompatible with --prefix/--target
707 | if prefix_path or target_dir:
708 | logger.debug("Non-user install due to --prefix or --target option")
709 | return False
710 |
711 | # If user installs are not enabled, choose a non-user install
712 | if not site.ENABLE_USER_SITE:
713 | logger.debug("Non-user install because user site-packages disabled")
714 | return False
715 |
716 | # If we have permission for a non-user install, do that,
717 | # otherwise do a user install.
718 | if site_packages_writable(root=root_path, isolated=isolated_mode):
719 | logger.debug("Non-user install because site-packages writeable")
720 | return False
721 |
722 | logger.info(
723 | "Defaulting to user installation because normal site-packages "
724 | "is not writeable"
725 | )
726 | return True
727 |
728 |
729 | def create_os_error_message(
730 | error: OSError, show_traceback: bool, using_user_site: bool
731 | ) -> str:
732 | """Format an error message for an OSError
733 |
734 | It may occur anytime during the execution of the install command.
735 | """
736 | parts = []
737 |
738 | # Mention the error if we are not going to show a traceback
739 | parts.append("Could not install packages due to an OSError")
740 | if not show_traceback:
741 | parts.append(": ")
742 | parts.append(str(error))
743 | else:
744 | parts.append(".")
745 |
746 | # Spilt the error indication from a helper message (if any)
747 | parts[-1] += "\n"
748 |
749 | # Suggest useful actions to the user:
750 | # (1) using user site-packages or (2) verifying the permissions
751 | if error.errno == errno.EACCES:
752 | user_option_part = "Consider using the `--user` option"
753 | permissions_part = "Check the permissions"
754 |
755 | if not running_under_virtualenv() and not using_user_site:
756 | parts.extend(
757 | [
758 | user_option_part,
759 | " or ",
760 | permissions_part.lower(),
761 | ]
762 | )
763 | else:
764 | parts.append(permissions_part)
765 | parts.append(".\n")
766 |
767 | # Suggest the user to enable Long Paths if path length is
768 | # more than 260
769 | if (
770 | WINDOWS
771 | and error.errno == errno.ENOENT
772 | and error.filename
773 | and len(error.filename) > 260
774 | ):
775 | parts.append(
776 | "HINT: This error might have occurred since "
777 | "this system does not have Windows Long Path "
778 | "support enabled. You can find information on "
779 | "how to enable this at "
780 | "https://pip.pypa.io/warnings/enable-long-paths\n"
781 | )
782 |
783 | return "".join(parts).strip() + "\n"
784 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import absolute_import
2 |
3 | import linecache
4 | import os
5 | import platform
6 | import sys
7 | from dataclasses import dataclass, field
8 | from traceback import walk_tb
9 | from types import ModuleType, TracebackType
10 | from typing import (
11 | Any,
12 | Callable,
13 | Dict,
14 | Iterable,
15 | List,
16 | Optional,
17 | Sequence,
18 | Tuple,
19 | Type,
20 | Union,
21 | )
22 |
23 | from pip._vendor.pygments.lexers import guess_lexer_for_filename
24 | from pip._vendor.pygments.token import Comment, Keyword, Name, Number, Operator, String
25 | from pip._vendor.pygments.token import Text as TextToken
26 | from pip._vendor.pygments.token import Token
27 | from pip._vendor.pygments.util import ClassNotFound
28 |
29 | from . import pretty
30 | from ._loop import loop_last
31 | from .columns import Columns
32 | from .console import Console, ConsoleOptions, ConsoleRenderable, RenderResult, group
33 | from .constrain import Constrain
34 | from .highlighter import RegexHighlighter, ReprHighlighter
35 | from .panel import Panel
36 | from .scope import render_scope
37 | from .style import Style
38 | from .syntax import Syntax
39 | from .text import Text
40 | from .theme import Theme
41 |
42 | WINDOWS = platform.system() == "Windows"
43 |
44 | LOCALS_MAX_LENGTH = 10
45 | LOCALS_MAX_STRING = 80
46 |
47 |
48 | def install(
49 | *,
50 | console: Optional[Console] = None,
51 | width: Optional[int] = 100,
52 | extra_lines: int = 3,
53 | theme: Optional[str] = None,
54 | word_wrap: bool = False,
55 | show_locals: bool = False,
56 | locals_max_length: int = LOCALS_MAX_LENGTH,
57 | locals_max_string: int = LOCALS_MAX_STRING,
58 | locals_hide_dunder: bool = True,
59 | locals_hide_sunder: Optional[bool] = None,
60 | indent_guides: bool = True,
61 | suppress: Iterable[Union[str, ModuleType]] = (),
62 | max_frames: int = 100,
63 | ) -> Callable[[Type[BaseException], BaseException, Optional[TracebackType]], Any]:
64 | """Install a rich traceback handler.
65 |
66 | Once installed, any tracebacks will be printed with syntax highlighting and rich formatting.
67 |
68 |
69 | Args:
70 | console (Optional[Console], optional): Console to write exception to. Default uses internal Console instance.
71 | width (Optional[int], optional): Width (in characters) of traceback. Defaults to 100.
72 | extra_lines (int, optional): Extra lines of code. Defaults to 3.
73 | theme (Optional[str], optional): Pygments theme to use in traceback. Defaults to ``None`` which will pick
74 | a theme appropriate for the platform.
75 | word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.
76 | show_locals (bool, optional): Enable display of local variables. Defaults to False.
77 | locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
78 | Defaults to 10.
79 | locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
80 | locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.
81 | locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.
82 | indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True.
83 | suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
84 |
85 | Returns:
86 | Callable: The previous exception handler that was replaced.
87 |
88 | """
89 | traceback_console = Console(stderr=True) if console is None else console
90 |
91 | locals_hide_sunder = (
92 | True
93 | if (traceback_console.is_jupyter and locals_hide_sunder is None)
94 | else locals_hide_sunder
95 | )
96 |
97 | def excepthook(
98 | type_: Type[BaseException],
99 | value: BaseException,
100 | traceback: Optional[TracebackType],
101 | ) -> None:
102 | traceback_console.print(
103 | Traceback.from_exception(
104 | type_,
105 | value,
106 | traceback,
107 | width=width,
108 | extra_lines=extra_lines,
109 | theme=theme,
110 | word_wrap=word_wrap,
111 | show_locals=show_locals,
112 | locals_max_length=locals_max_length,
113 | locals_max_string=locals_max_string,
114 | locals_hide_dunder=locals_hide_dunder,
115 | locals_hide_sunder=bool(locals_hide_sunder),
116 | indent_guides=indent_guides,
117 | suppress=suppress,
118 | max_frames=max_frames,
119 | )
120 | )
121 |
122 | def ipy_excepthook_closure(ip: Any) -> None: # pragma: no cover
123 | tb_data = {} # store information about showtraceback call
124 | default_showtraceback = ip.showtraceback # keep reference of default traceback
125 |
126 | def ipy_show_traceback(*args: Any, **kwargs: Any) -> None:
127 | """wrap the default ip.showtraceback to store info for ip._showtraceback"""
128 | nonlocal tb_data
129 | tb_data = kwargs
130 | default_showtraceback(*args, **kwargs)
131 |
132 | def ipy_display_traceback(
133 | *args: Any, is_syntax: bool = False, **kwargs: Any
134 | ) -> None:
135 | """Internally called traceback from ip._showtraceback"""
136 | nonlocal tb_data
137 | exc_tuple = ip._get_exc_info()
138 |
139 | # do not display trace on syntax error
140 | tb: Optional[TracebackType] = None if is_syntax else exc_tuple[2]
141 |
142 | # determine correct tb_offset
143 | compiled = tb_data.get("running_compiled_code", False)
144 | tb_offset = tb_data.get("tb_offset", 1 if compiled else 0)
145 | # remove ipython internal frames from trace with tb_offset
146 | for _ in range(tb_offset):
147 | if tb is None:
148 | break
149 | tb = tb.tb_next
150 |
151 | excepthook(exc_tuple[0], exc_tuple[1], tb)
152 | tb_data = {} # clear data upon usage
153 |
154 | # replace _showtraceback instead of showtraceback to allow ipython features such as debugging to work
155 | # this is also what the ipython docs recommends to modify when subclassing InteractiveShell
156 | ip._showtraceback = ipy_display_traceback
157 | # add wrapper to capture tb_data
158 | ip.showtraceback = ipy_show_traceback
159 | ip.showsyntaxerror = lambda *args, **kwargs: ipy_display_traceback(
160 | *args, is_syntax=True, **kwargs
161 | )
162 |
163 | try: # pragma: no cover
164 | # if within ipython, use customized traceback
165 | ip = get_ipython() # type: ignore[name-defined]
166 | ipy_excepthook_closure(ip)
167 | return sys.excepthook
168 | except Exception:
169 | # otherwise use default system hook
170 | old_excepthook = sys.excepthook
171 | sys.excepthook = excepthook
172 | return old_excepthook
173 |
174 |
175 | @dataclass
176 | class Frame:
177 | filename: str
178 | lineno: int
179 | name: str
180 | line: str = ""
181 | locals: Optional[Dict[str, pretty.Node]] = None
182 |
183 |
184 | @dataclass
185 | class _SyntaxError:
186 | offset: int
187 | filename: str
188 | line: str
189 | lineno: int
190 | msg: str
191 |
192 |
193 | @dataclass
194 | class Stack:
195 | exc_type: str
196 | exc_value: str
197 | syntax_error: Optional[_SyntaxError] = None
198 | is_cause: bool = False
199 | frames: List[Frame] = field(default_factory=list)
200 |
201 |
202 | @dataclass
203 | class Trace:
204 | stacks: List[Stack]
205 |
206 |
207 | class PathHighlighter(RegexHighlighter):
208 | highlights = [r"(?P<dim>.*/)(?P<bold>.+)"]
209 |
210 |
211 | class Traceback:
212 | """A Console renderable that renders a traceback.
213 |
214 | Args:
215 | trace (Trace, optional): A `Trace` object produced from `extract`. Defaults to None, which uses
216 | the last exception.
217 | width (Optional[int], optional): Number of characters used to traceback. Defaults to 100.
218 | extra_lines (int, optional): Additional lines of code to render. Defaults to 3.
219 | theme (str, optional): Override pygments theme used in traceback.
220 | word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.
221 | show_locals (bool, optional): Enable display of local variables. Defaults to False.
222 | indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True.
223 | locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
224 | Defaults to 10.
225 | locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
226 | locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.
227 | locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.
228 | suppress (Sequence[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
229 | max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100.
230 |
231 | """
232 |
233 | LEXERS = {
234 | "": "text",
235 | ".py": "python",
236 | ".pxd": "cython",
237 | ".pyx": "cython",
238 | ".pxi": "pyrex",
239 | }
240 |
241 | def __init__(
242 | self,
243 | trace: Optional[Trace] = None,
244 | *,
245 | width: Optional[int] = 100,
246 | extra_lines: int = 3,
247 | theme: Optional[str] = None,
248 | word_wrap: bool = False,
249 | show_locals: bool = False,
250 | locals_max_length: int = LOCALS_MAX_LENGTH,
251 | locals_max_string: int = LOCALS_MAX_STRING,
252 | locals_hide_dunder: bool = True,
253 | locals_hide_sunder: bool = False,
254 | indent_guides: bool = True,
255 | suppress: Iterable[Union[str, ModuleType]] = (),
256 | max_frames: int = 100,
257 | ):
258 | if trace is None:
259 | exc_type, exc_value, traceback = sys.exc_info()
260 | if exc_type is None or exc_value is None or traceback is None:
261 | raise ValueError(
262 | "Value for 'trace' required if not called in except: block"
263 | )
264 | trace = self.extract(
265 | exc_type, exc_value, traceback, show_locals=show_locals
266 | )
267 | self.trace = trace
268 | self.width = width
269 | self.extra_lines = extra_lines
270 | self.theme = Syntax.get_theme(theme or "ansi_dark")
271 | self.word_wrap = word_wrap
272 | self.show_locals = show_locals
273 | self.indent_guides = indent_guides
274 | self.locals_max_length = locals_max_length
275 | self.locals_max_string = locals_max_string
276 | self.locals_hide_dunder = locals_hide_dunder
277 | self.locals_hide_sunder = locals_hide_sunder
278 |
279 | self.suppress: Sequence[str] = []
280 | for suppress_entity in suppress:
281 | if not isinstance(suppress_entity, str):
282 | assert (
283 | suppress_entity.__file__ is not None
284 | ), f"{suppress_entity!r} must be a module with '__file__' attribute"
285 | path = os.path.dirname(suppress_entity.__file__)
286 | else:
287 | path = suppress_entity
288 | path = os.path.normpath(os.path.abspath(path))
289 | self.suppress.append(path)
290 | self.max_frames = max(4, max_frames) if max_frames > 0 else 0
291 |
292 | @classmethod
293 | def from_exception(
294 | cls,
295 | exc_type: Type[Any],
296 | exc_value: BaseException,
297 | traceback: Optional[TracebackType],
298 | *,
299 | width: Optional[int] = 100,
300 | extra_lines: int = 3,
301 | theme: Optional[str] = None,
302 | word_wrap: bool = False,
303 | show_locals: bool = False,
304 | locals_max_length: int = LOCALS_MAX_LENGTH,
305 | locals_max_string: int = LOCALS_MAX_STRING,
306 | locals_hide_dunder: bool = True,
307 | locals_hide_sunder: bool = False,
308 | indent_guides: bool = True,
309 | suppress: Iterable[Union[str, ModuleType]] = (),
310 | max_frames: int = 100,
311 | ) -> "Traceback":
312 | """Create a traceback from exception info
313 |
314 | Args:
315 | exc_type (Type[BaseException]): Exception type.
316 | exc_value (BaseException): Exception value.
317 | traceback (TracebackType): Python Traceback object.
318 | width (Optional[int], optional): Number of characters used to traceback. Defaults to 100.
319 | extra_lines (int, optional): Additional lines of code to render. Defaults to 3.
320 | theme (str, optional): Override pygments theme used in traceback.
321 | word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False.
322 | show_locals (bool, optional): Enable display of local variables. Defaults to False.
323 | indent_guides (bool, optional): Enable indent guides in code and locals. Defaults to True.
324 | locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
325 | Defaults to 10.
326 | locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
327 | locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.
328 | locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.
329 | suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback.
330 | max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100.
331 |
332 | Returns:
333 | Traceback: A Traceback instance that may be printed.
334 | """
335 | rich_traceback = cls.extract(
336 | exc_type,
337 | exc_value,
338 | traceback,
339 | show_locals=show_locals,
340 | locals_max_length=locals_max_length,
341 | locals_max_string=locals_max_string,
342 | locals_hide_dunder=locals_hide_dunder,
343 | locals_hide_sunder=locals_hide_sunder,
344 | )
345 |
346 | return cls(
347 | rich_traceback,
348 | width=width,
349 | extra_lines=extra_lines,
350 | theme=theme,
351 | word_wrap=word_wrap,
352 | show_locals=show_locals,
353 | indent_guides=indent_guides,
354 | locals_max_length=locals_max_length,
355 | locals_max_string=locals_max_string,
356 | locals_hide_dunder=locals_hide_dunder,
357 | locals_hide_sunder=locals_hide_sunder,
358 | suppress=suppress,
359 | max_frames=max_frames,
360 | )
361 |
362 | @classmethod
363 | def extract(
364 | cls,
365 | exc_type: Type[BaseException],
366 | exc_value: BaseException,
367 | traceback: Optional[TracebackType],
368 | *,
369 | show_locals: bool = False,
370 | locals_max_length: int = LOCALS_MAX_LENGTH,
371 | locals_max_string: int = LOCALS_MAX_STRING,
372 | locals_hide_dunder: bool = True,
373 | locals_hide_sunder: bool = False,
374 | ) -> Trace:
375 | """Extract traceback information.
376 |
377 | Args:
378 | exc_type (Type[BaseException]): Exception type.
379 | exc_value (BaseException): Exception value.
380 | traceback (TracebackType): Python Traceback object.
381 | show_locals (bool, optional): Enable display of local variables. Defaults to False.
382 | locals_max_length (int, optional): Maximum length of containers before abbreviating, or None for no abbreviation.
383 | Defaults to 10.
384 | locals_max_string (int, optional): Maximum length of string before truncating, or None to disable. Defaults to 80.
385 | locals_hide_dunder (bool, optional): Hide locals prefixed with double underscore. Defaults to True.
386 | locals_hide_sunder (bool, optional): Hide locals prefixed with single underscore. Defaults to False.
387 |
388 | Returns:
389 | Trace: A Trace instance which you can use to construct a `Traceback`.
390 | """
391 |
392 | stacks: List[Stack] = []
393 | is_cause = False
394 |
395 | from pip._vendor.rich import _IMPORT_CWD
396 |
397 | def safe_str(_object: Any) -> str:
398 | """Don't allow exceptions from __str__ to propagate."""
399 | try:
400 | return str(_object)
401 | except Exception:
402 | return "<exception str() failed>"
403 |
404 | while True:
405 | stack = Stack(
406 | exc_type=safe_str(exc_type.__name__),
407 | exc_value=safe_str(exc_value),
408 | is_cause=is_cause,
409 | )
410 |
411 | if isinstance(exc_value, SyntaxError):
412 | stack.syntax_error = _SyntaxError(
413 | offset=exc_value.offset or 0,
414 | filename=exc_value.filename or "?",
415 | lineno=exc_value.lineno or 0,
416 | line=exc_value.text or "",
417 | msg=exc_value.msg,
418 | )
419 |
420 | stacks.append(stack)
421 | append = stack.frames.append
422 |
423 | def get_locals(
424 | iter_locals: Iterable[Tuple[str, object]]
425 | ) -> Iterable[Tuple[str, object]]:
426 | """Extract locals from an iterator of key pairs."""
427 | if not (locals_hide_dunder or locals_hide_sunder):
428 | yield from iter_locals
429 | return
430 | for key, value in iter_locals:
431 | if locals_hide_dunder and key.startswith("__"):
432 | continue
433 | if locals_hide_sunder and key.startswith("_"):
434 | continue
435 | yield key, value
436 |
437 | for frame_summary, line_no in walk_tb(traceback):
438 | filename = frame_summary.f_code.co_filename
439 | if filename and not filename.startswith("<"):
440 | if not os.path.isabs(filename):
441 | filename = os.path.join(_IMPORT_CWD, filename)
442 | if frame_summary.f_locals.get("_rich_traceback_omit", False):
443 | continue
444 |
445 | frame = Frame(
446 | filename=filename or "?",
447 | lineno=line_no,
448 | name=frame_summary.f_code.co_name,
449 | locals={
450 | key: pretty.traverse(
451 | value,
452 | max_length=locals_max_length,
453 | max_string=locals_max_string,
454 | )
455 | for key, value in get_locals(frame_summary.f_locals.items())
456 | }
457 | if show_locals
458 | else None,
459 | )
460 | append(frame)
461 | if frame_summary.f_locals.get("_rich_traceback_guard", False):
462 | del stack.frames[:]
463 |
464 | cause = getattr(exc_value, "__cause__", None)
465 | if cause:
466 | exc_type = cause.__class__
467 | exc_value = cause
468 | # __traceback__ can be None, e.g. for exceptions raised by the
469 | # 'multiprocessing' module
470 | traceback = cause.__traceback__
471 | is_cause = True
472 | continue
473 |
474 | cause = exc_value.__context__
475 | if cause and not getattr(exc_value, "__suppress_context__", False):
476 | exc_type = cause.__class__
477 | exc_value = cause
478 | traceback = cause.__traceback__
479 | is_cause = False
480 | continue
481 | # No cover, code is reached but coverage doesn't recognize it.
482 | break # pragma: no cover
483 |
484 | trace = Trace(stacks=stacks)
485 | return trace
486 |
487 | def __rich_console__(
488 | self, console: Console, options: ConsoleOptions
489 | ) -> RenderResult:
490 | theme = self.theme
491 | background_style = theme.get_background_style()
492 | token_style = theme.get_style_for_token
493 |
494 | traceback_theme = Theme(
495 | {
496 | "pretty": token_style(TextToken),
497 | "pygments.text": token_style(Token),
498 | "pygments.string": token_style(String),
499 | "pygments.function": token_style(Name.Function),
500 | "pygments.number": token_style(Number),
501 | "repr.indent": token_style(Comment) + Style(dim=True),
502 | "repr.str": token_style(String),
503 | "repr.brace": token_style(TextToken) + Style(bold=True),
504 | "repr.number": token_style(Number),
505 | "repr.bool_true": token_style(Keyword.Constant),
506 | "repr.bool_false": token_style(Keyword.Constant),
507 | "repr.none": token_style(Keyword.Constant),
508 | "scope.border": token_style(String.Delimiter),
509 | "scope.equals": token_style(Operator),
510 | "scope.key": token_style(Name),
511 | "scope.key.special": token_style(Name.Constant) + Style(dim=True),
512 | },
513 | inherit=False,
514 | )
515 |
516 | highlighter = ReprHighlighter()
517 | for last, stack in loop_last(reversed(self.trace.stacks)):
518 | if stack.frames:
519 | stack_renderable: ConsoleRenderable = Panel(
520 | self._render_stack(stack),
521 | title="[traceback.title]Traceback [dim](most recent call last)",
522 | style=background_style,
523 | border_style="traceback.border",
524 | expand=True,
525 | padding=(0, 1),
526 | )
527 | stack_renderable = Constrain(stack_renderable, self.width)
528 | with console.use_theme(traceback_theme):
529 | yield stack_renderable
530 | if stack.syntax_error is not None:
531 | with console.use_theme(traceback_theme):
532 | yield Constrain(
533 | Panel(
534 | self._render_syntax_error(stack.syntax_error),
535 | style=background_style,
536 | border_style="traceback.border.syntax_error",
537 | expand=True,
538 | padding=(0, 1),
539 | width=self.width,
540 | ),
541 | self.width,
542 | )
543 | yield Text.assemble(
544 | (f"{stack.exc_type}: ", "traceback.exc_type"),
545 | highlighter(stack.syntax_error.msg),
546 | )
547 | elif stack.exc_value:
548 | yield Text.assemble(
549 | (f"{stack.exc_type}: ", "traceback.exc_type"),
550 | highlighter(stack.exc_value),
551 | )
552 | else:
553 | yield Text.assemble((f"{stack.exc_type}", "traceback.exc_type"))
554 |
555 | if not last:
556 | if stack.is_cause:
557 | yield Text.from_markup(
558 | "\n[i]The above exception was the direct cause of the following exception:\n",
559 | )
560 | else:
561 | yield Text.from_markup(
562 | "\n[i]During handling of the above exception, another exception occurred:\n",
563 | )
564 |
565 | @group()
566 | def _render_syntax_error(self, syntax_error: _SyntaxError) -> RenderResult:
567 | highlighter = ReprHighlighter()
568 | path_highlighter = PathHighlighter()
569 | if syntax_error.filename != "<stdin>":
570 | if os.path.exists(syntax_error.filename):
571 | text = Text.assemble(
572 | (f" {syntax_error.filename}", "pygments.string"),
573 | (":", "pygments.text"),
574 | (str(syntax_error.lineno), "pygments.number"),
575 | style="pygments.text",
576 | )
577 | yield path_highlighter(text)
578 | syntax_error_text = highlighter(syntax_error.line.rstrip())
579 | syntax_error_text.no_wrap = True
580 | offset = min(syntax_error.offset - 1, len(syntax_error_text))
581 | syntax_error_text.stylize("bold underline", offset, offset)
582 | syntax_error_text += Text.from_markup(
583 | "\n" + " " * offset + "[traceback.offset]▲[/]",
584 | style="pygments.text",
585 | )
586 | yield syntax_error_text
587 |
588 | @classmethod
589 | def _guess_lexer(cls, filename: str, code: str) -> str:
590 | ext = os.path.splitext(filename)[-1]
591 | if not ext:
592 | # No extension, look at first line to see if it is a hashbang
593 | # Note, this is an educated guess and not a guarantee
594 | # If it fails, the only downside is that the code is highlighted strangely
595 | new_line_index = code.index("\n")
596 | first_line = code[:new_line_index] if new_line_index != -1 else code
597 | if first_line.startswith("#!") and "python" in first_line.lower():
598 | return "python"
599 | try:
600 | return cls.LEXERS.get(ext) or guess_lexer_for_filename(filename, code).name
601 | except ClassNotFound:
602 | return "text"
603 |
604 | @group()
605 | def _render_stack(self, stack: Stack) -> RenderResult:
606 | path_highlighter = PathHighlighter()
607 | theme = self.theme
608 |
609 | def read_code(filename: str) -> str:
610 | """Read files, and cache results on filename.
611 |
612 | Args:
613 | filename (str): Filename to read
614 |
615 | Returns:
616 | str: Contents of file
617 | """
618 | return "".join(linecache.getlines(filename))
619 |
620 | def render_locals(frame: Frame) -> Iterable[ConsoleRenderable]:
621 | if frame.locals:
622 | yield render_scope(
623 | frame.locals,
624 | title="locals",
625 | indent_guides=self.indent_guides,
626 | max_length=self.locals_max_length,
627 | max_string=self.locals_max_string,
628 | )
629 |
630 | exclude_frames: Optional[range] = None
631 | if self.max_frames != 0:
632 | exclude_frames = range(
633 | self.max_frames // 2,
634 | len(stack.frames) - self.max_frames // 2,
635 | )
636 |
637 | excluded = False
638 | for frame_index, frame in enumerate(stack.frames):
639 | if exclude_frames and frame_index in exclude_frames:
640 | excluded = True
641 | continue
642 |
643 | if excluded:
644 | assert exclude_frames is not None
645 | yield Text(
646 | f"\n... {len(exclude_frames)} frames hidden ...",
647 | justify="center",
648 | style="traceback.error",
649 | )
650 | excluded = False
651 |
652 | first = frame_index == 0
653 | frame_filename = frame.filename
654 | suppressed = any(frame_filename.startswith(path) for path in self.suppress)
655 |
656 | if os.path.exists(frame.filename):
657 | text = Text.assemble(
658 | path_highlighter(Text(frame.filename, style="pygments.string")),
659 | (":", "pygments.text"),
660 | (str(frame.lineno), "pygments.number"),
661 | " in ",
662 | (frame.name, "pygments.function"),
663 | style="pygments.text",
664 | )
665 | else:
666 | text = Text.assemble(
667 | "in ",
668 | (frame.name, "pygments.function"),
669 | (":", "pygments.text"),
670 | (str(frame.lineno), "pygments.number"),
671 | style="pygments.text",
672 | )
673 | if not frame.filename.startswith("<") and not first:
674 | yield ""
675 | yield text
676 | if frame.filename.startswith("<"):
677 | yield from render_locals(frame)
678 | continue
679 | if not suppressed:
680 | try:
681 | code = read_code(frame.filename)
682 | if not code:
683 | # code may be an empty string if the file doesn't exist, OR
684 | # if the traceback filename is generated dynamically
685 | continue
686 | lexer_name = self._guess_lexer(frame.filename, code)
687 | syntax = Syntax(
688 | code,
689 | lexer_name,
690 | theme=theme,
691 | line_numbers=True,
692 | line_range=(
693 | frame.lineno - self.extra_lines,
694 | frame.lineno + self.extra_lines,
695 | ),
696 | highlight_lines={frame.lineno},
697 | word_wrap=self.word_wrap,
698 | code_width=88,
699 | indent_guides=self.indent_guides,
700 | dedent=False,
701 | )
702 | yield ""
703 | except Exception as error:
704 | yield Text.assemble(
705 | (f"\n{error}", "traceback.error"),
706 | )
707 | else:
708 | yield (
709 | Columns(
710 | [
711 | syntax,
712 | *render_locals(frame),
713 | ],
714 | padding=1,
715 | )
716 | if frame.locals
717 | else syntax
718 | )
719 |
720 |
721 | if __name__ == "__main__": # pragma: no cover
722 | from .console import Console
723 |
724 | console = Console()
725 | import sys
726 |
727 | def bar(a: Any) -> None: # 这是对亚洲语言支持的测试。面对模棱两可的想法,拒绝猜测的诱惑
728 | one = 1
729 | print(one / a)
730 |
731 | def foo(a: Any) -> None:
732 | _rich_traceback_guard = True
733 | zed = {
734 | "characters": {
735 | "Paul Atreides",
736 | "Vladimir Harkonnen",
737 | "Thufir Hawat",
738 | "Duncan Idaho",
739 | },
740 | "atomic_types": (None, False, True),
741 | }
742 | bar(a)
743 |
744 | def error() -> None:
745 | try:
746 | try:
747 | foo(0)
748 | except:
749 | slfkjsldkfj # type: ignore[name-defined]
750 | except:
751 | console.print_exception(show_locals=True)
752 |
753 | error()
754 |
```