From 1cc834f9ab43ac0e5ac483b0e018b9395be5605d Mon Sep 17 00:00:00 2001 From: Ladebeze66 Date: Wed, 26 Mar 2025 15:02:58 +0100 Subject: [PATCH] save --- agents/analyseJSON.py | 157 + agents/analyse_image.py | 94 + agents/base_agent.py | 26 + agents/roles.py | 37 + analyse_projets.md | 293 ++ .../llama_vision90b.cpython-312.pyc | Bin 0 -> 306 bytes core/factory.py | 6 +- core/llama_vision90b.py | 186 + core/mistral_api.py | 113 + llmlab/bin/deep-translator | 8 + llmlab/bin/dt | 8 + .../typing_extensions.cpython-312.pyc | Bin 0 -> 172880 bytes .../beautifulsoup4-4.13.3.dist-info/INSTALLER | 1 + .../beautifulsoup4-4.13.3.dist-info/METADATA | 123 + .../beautifulsoup4-4.13.3.dist-info/RECORD | 89 + .../beautifulsoup4-4.13.3.dist-info/WHEEL | 4 + .../licenses/AUTHORS | 49 + .../licenses/LICENSE | 31 + .../python3.12/site-packages/bs4/__init__.py | 1170 +++++ .../bs4/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 39628 bytes .../__pycache__/_deprecation.cpython-312.pyc | Bin 0 -> 3744 bytes .../bs4/__pycache__/_typing.cpython-312.pyc | Bin 0 -> 3546 bytes .../bs4/__pycache__/_warnings.cpython-312.pyc | Bin 0 -> 5597 bytes .../bs4/__pycache__/css.cpython-312.pyc | Bin 0 -> 14423 bytes .../bs4/__pycache__/dammit.cpython-312.pyc | Bin 0 -> 46478 bytes .../bs4/__pycache__/diagnose.cpython-312.pyc | Bin 0 -> 12652 bytes .../bs4/__pycache__/element.cpython-312.pyc | Bin 0 -> 107378 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 1760 bytes .../bs4/__pycache__/filter.cpython-312.pyc | Bin 0 -> 28615 bytes .../bs4/__pycache__/formatter.cpython-312.pyc | Bin 0 -> 10528 bytes .../site-packages/bs4/_deprecation.py | 80 + .../python3.12/site-packages/bs4/_typing.py | 196 + .../python3.12/site-packages/bs4/_warnings.py | 98 + .../site-packages/bs4/builder/__init__.py | 848 +++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 27462 bytes .../__pycache__/_html5lib.cpython-312.pyc | Bin 0 -> 23137 bytes .../__pycache__/_htmlparser.cpython-312.pyc | Bin 0 -> 14633 bytes .../builder/__pycache__/_lxml.cpython-312.pyc | Bin 0 -> 18437 bytes .../site-packages/bs4/builder/_html5lib.py | 594 +++ .../site-packages/bs4/builder/_htmlparser.py | 474 ++ .../site-packages/bs4/builder/_lxml.py | 490 ++ .../lib/python3.12/site-packages/bs4/css.py | 338 ++ .../python3.12/site-packages/bs4/dammit.py | 1408 +++++ .../python3.12/site-packages/bs4/diagnose.py | 268 + .../python3.12/site-packages/bs4/element.py | 2886 +++++++++++ .../site-packages/bs4/exceptions.py | 28 + .../python3.12/site-packages/bs4/filter.py | 755 +++ .../python3.12/site-packages/bs4/formatter.py | 276 + .../lib/python3.12/site-packages/bs4/py.typed | 0 .../site-packages/bs4/tests/__init__.py | 1305 +++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 67414 bytes .../__pycache__/test_builder.cpython-312.pyc | Bin 0 -> 1574 bytes .../test_builder_registry.cpython-312.pyc | Bin 0 -> 7598 bytes .../__pycache__/test_css.cpython-312.pyc | Bin 0 -> 28909 bytes .../__pycache__/test_dammit.cpython-312.pyc | Bin 0 -> 19786 bytes .../__pycache__/test_element.cpython-312.pyc | Bin 0 -> 6031 bytes .../__pycache__/test_filter.cpython-312.pyc | Bin 0 -> 31907 bytes .../test_formatter.cpython-312.pyc | Bin 0 -> 7800 bytes .../__pycache__/test_fuzz.cpython-312.pyc | Bin 0 -> 7039 bytes .../__pycache__/test_html5lib.cpython-312.pyc | Bin 0 -> 11962 bytes .../test_htmlparser.cpython-312.pyc | Bin 0 -> 7285 bytes .../__pycache__/test_lxml.cpython-312.pyc | Bin 0 -> 8097 bytes .../test_navigablestring.cpython-312.pyc | Bin 0 -> 7763 bytes .../test_pageelement.cpython-312.pyc | Bin 0 -> 22908 bytes .../__pycache__/test_soup.cpython-312.pyc | Bin 0 -> 31499 bytes .../__pycache__/test_tag.cpython-312.pyc | Bin 0 -> 14119 bytes .../__pycache__/test_tree.cpython-312.pyc | Bin 0 -> 93182 bytes ...mized-bs4_fuzzer-4670634698080256.testcase | 1 + ...mized-bs4_fuzzer-4818336571064320.testcase | 1 + ...mized-bs4_fuzzer-4999465949331456.testcase | 1 + ...mized-bs4_fuzzer-5000587759190016.testcase | Bin 0 -> 15347 bytes ...mized-bs4_fuzzer-5167584867909632.testcase | Bin 0 -> 19469 bytes ...mized-bs4_fuzzer-5270998950477824.testcase | Bin 0 -> 12 bytes ...mized-bs4_fuzzer-5375146639360000.testcase | 1 + ...mized-bs4_fuzzer-5492400320282624.testcase | Bin 0 -> 11502 bytes ...mized-bs4_fuzzer-5703933063462912.testcase | 2 + ...mized-bs4_fuzzer-5843991618256896.testcase | 1 + ...mized-bs4_fuzzer-5984173902397440.testcase | Bin 0 -> 51495 bytes ...mized-bs4_fuzzer-6124268085182464.testcase | 1 + ...mized-bs4_fuzzer-6241471367348224.testcase | 1 + ...mized-bs4_fuzzer-6306874195312640.testcase | 1 + ...mized-bs4_fuzzer-6450958476902400.testcase | Bin 0 -> 3546 bytes ...mized-bs4_fuzzer-6600557255327744.testcase | Bin 0 -> 124 bytes ...0c8ed8bcd0785b67000fcd5dea1d33f08.testcase | Bin 0 -> 2607 bytes ...a2b26f13537b68d3794b0478a4090ee4a.testcase | Bin 0 -> 103 bytes .../site-packages/bs4/tests/test_builder.py | 28 + .../bs4/tests/test_builder_registry.py | 139 + .../site-packages/bs4/tests/test_css.py | 536 ++ .../site-packages/bs4/tests/test_dammit.py | 433 ++ .../site-packages/bs4/tests/test_element.py | 138 + .../site-packages/bs4/tests/test_filter.py | 674 +++ .../site-packages/bs4/tests/test_formatter.py | 170 + .../site-packages/bs4/tests/test_fuzz.py | 181 + .../site-packages/bs4/tests/test_html5lib.py | 264 + .../bs4/tests/test_htmlparser.py | 161 + .../site-packages/bs4/tests/test_lxml.py | 196 + .../bs4/tests/test_navigablestring.py | 144 + .../bs4/tests/test_pageelement.py | 437 ++ .../site-packages/bs4/tests/test_soup.py | 602 +++ .../site-packages/bs4/tests/test_tag.py | 241 + .../site-packages/bs4/tests/test_tree.py | 1452 ++++++ .../INSTALLER | 1 + .../deep_translator-1.11.4.dist-info/LICENSE | 201 + .../deep_translator-1.11.4.dist-info/METADATA | 960 ++++ .../deep_translator-1.11.4.dist-info/RECORD | 51 + .../REQUESTED | 0 .../deep_translator-1.11.4.dist-info/WHEEL | 4 + .../entry_points.txt | 4 + .../site-packages/deep_translator/__init__.py | 38 + .../site-packages/deep_translator/__main__.py | 12 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1371 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 528 bytes .../__pycache__/baidu.cpython-312.pyc | Bin 0 -> 4767 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 8314 bytes .../__pycache__/chatgpt.cpython-312.pyc | Bin 0 -> 3090 bytes .../__pycache__/cli.cpython-312.pyc | Bin 0 -> 4736 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 21757 bytes .../__pycache__/deepl.cpython-312.pyc | Bin 0 -> 4516 bytes .../__pycache__/detection.cpython-312.pyc | Bin 0 -> 3503 bytes .../__pycache__/engines.cpython-312.pyc | Bin 0 -> 625 bytes .../__pycache__/exceptions.cpython-312.pyc | Bin 0 -> 9155 bytes .../__pycache__/google.cpython-312.pyc | Bin 0 -> 5633 bytes .../__pycache__/libre.cpython-312.pyc | Bin 0 -> 4782 bytes .../__pycache__/linguee.cpython-312.pyc | Bin 0 -> 4913 bytes .../__pycache__/microsoft.cpython-312.pyc | Bin 0 -> 5627 bytes .../__pycache__/mymemory.cpython-312.pyc | Bin 0 -> 5011 bytes .../__pycache__/papago.cpython-312.pyc | Bin 0 -> 4237 bytes .../__pycache__/pons.cpython-312.pyc | Bin 0 -> 4906 bytes .../__pycache__/qcri.cpython-312.pyc | Bin 0 -> 4891 bytes .../__pycache__/validate.cpython-312.pyc | Bin 0 -> 1618 bytes .../__pycache__/yandex.cpython-312.pyc | Bin 0 -> 6576 bytes .../site-packages/deep_translator/baidu.py | 120 + .../site-packages/deep_translator/base.py | 183 + .../site-packages/deep_translator/chatgpt.py | 70 + .../site-packages/deep_translator/cli.py | 102 + .../deep_translator/constants.py | 641 +++ .../site-packages/deep_translator/deepl.py | 111 + .../deep_translator/detection.py | 102 + .../site-packages/deep_translator/engines.py | 8 + .../deep_translator/exceptions.py | 195 + .../site-packages/deep_translator/google.py | 122 + .../site-packages/deep_translator/libre.py | 123 + .../site-packages/deep_translator/linguee.py | 115 + .../deep_translator/microsoft.py | 129 + .../site-packages/deep_translator/mymemory.py | 113 + .../site-packages/deep_translator/papago.py | 101 + .../site-packages/deep_translator/pons.py | 118 + .../site-packages/deep_translator/qcri.py | 119 + .../site-packages/deep_translator/validate.py | 43 + .../site-packages/deep_translator/yandex.py | 158 + .../soupsieve-2.6.dist-info/INSTALLER | 1 + .../soupsieve-2.6.dist-info/METADATA | 114 + .../soupsieve-2.6.dist-info/RECORD | 20 + .../soupsieve-2.6.dist-info/WHEEL | 4 + .../licenses/LICENSE.md | 21 + .../site-packages/soupsieve/__init__.py | 168 + .../site-packages/soupsieve/__meta__.py | 197 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 6096 bytes .../__pycache__/__meta__.cpython-312.pyc | Bin 0 -> 8109 bytes .../__pycache__/css_match.cpython-312.pyc | Bin 0 -> 61883 bytes .../__pycache__/css_parser.cpython-312.pyc | Bin 0 -> 49566 bytes .../__pycache__/css_types.cpython-312.pyc | Bin 0 -> 17330 bytes .../__pycache__/pretty.cpython-312.pyc | Bin 0 -> 5049 bytes .../__pycache__/util.cpython-312.pyc | Bin 0 -> 4719 bytes .../site-packages/soupsieve/css_match.py | 1582 ++++++ .../site-packages/soupsieve/css_parser.py | 1289 +++++ .../site-packages/soupsieve/css_types.py | 407 ++ .../site-packages/soupsieve/pretty.py | 139 + .../site-packages/soupsieve/py.typed | 0 .../site-packages/soupsieve/util.py | 117 + .../INSTALLER | 1 + .../METADATA | 68 + .../typing_extensions-4.13.0.dist-info/RECORD | 7 + .../typing_extensions-4.13.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 279 + .../site-packages/typing_extensions.py | 4566 +++++++++++++++++ ...ral:latest_2025-03-25_16-37-52_ad526968.md | 36 - ...ral:latest_2025-03-25_16-38-16_03b64c9b.md | 32 - ...ral:latest_2025-03-25_16-38-17_28d42bb7.md | 28 - ...ral:latest_2025-03-25_16-38-19_d9484a88.md | 32 - ...ral:latest_2025-03-25_16-38-21_b25fdd42.md | 28 - ...ral:latest_2025-03-25_16-38-22_4d0e5e32.md | 28 - ...ral:latest_2025-03-25_16-38-24_07fcc853.md | 30 - ...ral:latest_2025-03-25_16-40-40_6a93fe2a.md | 45 - ...ral:latest_2025-03-25_16-40-43_87862c1f.md | 39 - ...ral:latest_2025-03-25_16-40-46_befddcaf.md | 40 - ...ral:latest_2025-03-25_16-40-50_877b174a.md | 46 - ...ral:latest_2025-03-25_16-40-53_cca9339c.md | 40 - ...ral:latest_2025-03-25_16-40-55_a660c5f6.md | 38 - ...ral:latest_2025-03-25_16-40-57_10f1889d.md | 40 - ...ral:latest_2025-03-25_16-41-01_d36aa721.md | 46 - ...ral:latest_2025-03-25_16-41-05_4bee637d.md | 36 - ...ral:latest_2025-03-25_16-41-07_2936eb29.md | 36 - ...ral:latest_2025-03-25_16-41-10_e4500a4f.md | 36 - ...ral:latest_2025-03-25_16-41-14_d94ff584.md | 38 - ...ral:latest_2025-03-25_16-41-16_3a946e3e.md | 38 - ...ral:latest_2025-03-25_16-41-19_b3822de4.md | 36 - ...ral:latest_2025-03-25_16-41-22_3b3e56af.md | 39 - ...ral:latest_2025-03-25_16-41-24_1ae96fc3.md | 35 - ...ral:latest_2025-03-25_16-41-26_4cac6ccb.md | 36 - ...ral:latest_2025-03-25_16-41-28_c65ff62c.md | 39 - ...ral:latest_2025-03-25_16-43-51_5fd7dd0f.md | 37 - ...ral:latest_2025-03-25_16-43-52_21c9c37d.md | 28 - ...ral:latest_2025-03-25_16-43-54_665b76d5.md | 37 - tests/test_agent.py | 65 + tests/test_combined_analysis.py | 35 + tests/test_image_only.py | 28 + tests/test_json_only.py | 34 + tests/test_llama_vision90b.py | 44 + 209 files changed, 31378 insertions(+), 1020 deletions(-) create mode 100644 agents/analyseJSON.py create mode 100644 agents/analyse_image.py create mode 100644 agents/base_agent.py create mode 100644 analyse_projets.md create mode 100644 core/__pycache__/llama_vision90b.cpython-312.pyc create mode 100644 core/llama_vision90b.py create mode 100644 core/mistral_api.py create mode 100755 llmlab/bin/deep-translator create mode 100755 llmlab/bin/dt create mode 100644 llmlab/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/INSTALLER create mode 100644 llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/METADATA create mode 100644 llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/RECORD create mode 100644 llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/WHEEL create mode 100644 llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/licenses/AUTHORS create mode 100644 llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/licenses/LICENSE create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__init__.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/__init__.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/_deprecation.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/_typing.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/_warnings.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/css.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/dammit.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/diagnose.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/element.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/exceptions.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/filter.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/__pycache__/formatter.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/_deprecation.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/_typing.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/_warnings.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/builder/__init__.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/builder/__pycache__/__init__.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/builder/__pycache__/_html5lib.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/builder/__pycache__/_htmlparser.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/builder/__pycache__/_lxml.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/builder/_html5lib.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/builder/_htmlparser.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/builder/_lxml.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/css.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/dammit.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/diagnose.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/element.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/exceptions.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/filter.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/formatter.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/py.typed create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__init__.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_builder.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_builder_registry.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_css.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_dammit.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_element.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_filter.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_formatter.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_fuzz.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_html5lib.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_htmlparser.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_lxml.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_navigablestring.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_pageelement.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_soup.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_tag.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_tree.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_builder.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_builder_registry.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_css.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_dammit.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_element.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_filter.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_formatter.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_fuzz.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_html5lib.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_htmlparser.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_lxml.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_navigablestring.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_pageelement.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_soup.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_tag.py create mode 100644 llmlab/lib/python3.12/site-packages/bs4/tests/test_tree.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator-1.11.4.dist-info/INSTALLER create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator-1.11.4.dist-info/LICENSE create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator-1.11.4.dist-info/METADATA create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator-1.11.4.dist-info/RECORD create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator-1.11.4.dist-info/REQUESTED create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator-1.11.4.dist-info/WHEEL create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator-1.11.4.dist-info/entry_points.txt create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__init__.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__main__.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/__init__.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/__main__.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/baidu.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/base.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/chatgpt.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/cli.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/constants.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/deepl.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/detection.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/engines.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/exceptions.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/google.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/libre.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/linguee.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/microsoft.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/mymemory.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/papago.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/pons.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/qcri.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/validate.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/__pycache__/yandex.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/baidu.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/base.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/chatgpt.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/cli.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/constants.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/deepl.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/detection.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/engines.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/exceptions.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/google.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/libre.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/linguee.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/microsoft.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/mymemory.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/papago.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/pons.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/qcri.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/validate.py create mode 100644 llmlab/lib/python3.12/site-packages/deep_translator/yandex.py create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve-2.6.dist-info/INSTALLER create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve-2.6.dist-info/METADATA create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve-2.6.dist-info/RECORD create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve-2.6.dist-info/WHEEL create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve-2.6.dist-info/licenses/LICENSE.md create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/__init__.py create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/__meta__.py create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/__pycache__/__init__.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/__pycache__/__meta__.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/__pycache__/css_match.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/__pycache__/css_parser.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/__pycache__/css_types.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/__pycache__/pretty.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/__pycache__/util.cpython-312.pyc create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/css_match.py create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/css_parser.py create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/css_types.py create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/pretty.py create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/py.typed create mode 100644 llmlab/lib/python3.12/site-packages/soupsieve/util.py create mode 100644 llmlab/lib/python3.12/site-packages/typing_extensions-4.13.0.dist-info/INSTALLER create mode 100644 llmlab/lib/python3.12/site-packages/typing_extensions-4.13.0.dist-info/METADATA create mode 100644 llmlab/lib/python3.12/site-packages/typing_extensions-4.13.0.dist-info/RECORD create mode 100644 llmlab/lib/python3.12/site-packages/typing_extensions-4.13.0.dist-info/WHEEL create mode 100644 llmlab/lib/python3.12/site-packages/typing_extensions-4.13.0.dist-info/licenses/LICENSE create mode 100644 llmlab/lib/python3.12/site-packages/typing_extensions.py delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-37-52_ad526968.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-38-16_03b64c9b.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-38-17_28d42bb7.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-38-19_d9484a88.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-38-21_b25fdd42.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-38-22_4d0e5e32.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-38-24_07fcc853.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-40-40_6a93fe2a.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-40-43_87862c1f.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-40-46_befddcaf.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-40-50_877b174a.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-40-53_cca9339c.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-40-55_a660c5f6.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-40-57_10f1889d.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-01_d36aa721.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-05_4bee637d.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-07_2936eb29.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-10_e4500a4f.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-14_d94ff584.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-16_3a946e3e.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-19_b3822de4.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-22_3b3e56af.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-24_1ae96fc3.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-26_4cac6ccb.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-41-28_c65ff62c.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-43-51_5fd7dd0f.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-43-52_21c9c37d.md delete mode 100644 tests/logs/mistral:latest_2025-03-25_16-43-54_665b76d5.md create mode 100644 tests/test_agent.py create mode 100644 tests/test_combined_analysis.py create mode 100644 tests/test_image_only.py create mode 100644 tests/test_json_only.py create mode 100644 tests/test_llama_vision90b.py diff --git a/agents/analyseJSON.py b/agents/analyseJSON.py new file mode 100644 index 0000000..5215f97 --- /dev/null +++ b/agents/analyseJSON.py @@ -0,0 +1,157 @@ +import json +import time +from typing import Dict, List, Any, Optional +from datetime import datetime + +from agents.base_agent import Agent +from core.factory import LLMFactory + +class AgentAnalyseJSON(Agent): + """ + Agent pour analyser des données JSON + """ + def __init__(self, nom: str = "AgentAnalyseJSON", modele: str = "mistral7b"): + super().__init__(nom) + + # Choix du modèle + self.llm = LLMFactory.create(modele) + + # Configuration du modèle + self.llm.set_role("formateur", { + "system_prompt": "Tu es un expert en analyse de données JSON. Tu dois extraire des informations pertinentes, identifier des tendances et répondre à des questions sur les données.", + "params": { + "temperature": 0.4, + "top_p": 0.9 + } + }) + + def executer(self, json_data: Dict[str, Any], + question: str = "Analyse ces données et extrait les informations principales.") -> Dict[str, Any]: + """ + Analyse des données JSON + + Args: + json_data: Données JSON à analyser + question: Question à poser au modèle + + Returns: + Résultats de l'analyse sous forme de dictionnaire + """ + # Conversion du JSON en chaîne formatée + json_str = json.dumps(json_data, ensure_ascii=False, indent=2) + + # Construction du prompt avec le JSON et la question + prompt = f"{question}\n\nDonnées JSON à analyser:\n```json\n{json_str}\n```" + + # Interrogation du modèle + reponse = self.llm.generate(prompt) + + # Construction du résultat + resultats = { + "question": question, + "reponse": reponse, + "timestamp": datetime.now().isoformat(), + "taille_json": len(json_str) + } + + # Ajout à l'historique + self.ajouter_historique("analyse_json", prompt[:200] + "...", reponse[:200] + "...") + + return resultats + + def extraire_structure(self, json_data: Dict[str, Any]) -> Dict[str, Any]: + """ + Extrait la structure d'un JSON (clés, types, profondeur) + """ + resultat = { + "structure": {}, + "statistiques": { + "nb_cles": 0, + "profondeur_max": 0, + "types": {} + } + } + + def explorer_structure(data, chemin="", profondeur=0): + nonlocal resultat + + # Mise à jour de la profondeur max + resultat["statistiques"]["profondeur_max"] = max(resultat["statistiques"]["profondeur_max"], profondeur) + + if isinstance(data, dict): + structure = {} + for cle, valeur in data.items(): + nouveau_chemin = f"{chemin}.{cle}" if chemin else cle + resultat["statistiques"]["nb_cles"] += 1 + + type_valeur = type(valeur).__name__ + if type_valeur not in resultat["statistiques"]["types"]: + resultat["statistiques"]["types"][type_valeur] = 0 + resultat["statistiques"]["types"][type_valeur] += 1 + + if isinstance(valeur, (dict, list)): + structure[cle] = explorer_structure(valeur, nouveau_chemin, profondeur + 1) + else: + structure[cle] = type_valeur + return structure + + elif isinstance(data, list): + if data and isinstance(data[0], (dict, list)): + # Pour les listes de structures complexes, on analyse le premier élément + return [explorer_structure(data[0], f"{chemin}[0]", profondeur + 1)] + else: + # Pour les listes de valeurs simples + type_elements = "vide" if not data else type(data[0]).__name__ + resultat["statistiques"]["nb_cles"] += 1 + + if "list" not in resultat["statistiques"]["types"]: + resultat["statistiques"]["types"]["list"] = 0 + resultat["statistiques"]["types"]["list"] += 1 + + return f"list[{type_elements}]" + else: + return type(data).__name__ + + resultat["structure"] = explorer_structure(json_data) + + self.ajouter_historique("extraire_structure", "JSON", resultat) + return resultat + + def fusionner_jsons(self, json1: Dict[str, Any], json2: Dict[str, Any]) -> Dict[str, Any]: + """ + Fusionne deux structures JSON en conservant les informations des deux + """ + if not json1: + return json2 + + if not json2: + return json1 + + resultat = json1.copy() + + # Fonction récursive pour fusionner + def fusionner(dict1, dict2): + for cle, valeur in dict2.items(): + if cle in dict1: + # Si les deux sont des dictionnaires, fusion récursive + if isinstance(dict1[cle], dict) and isinstance(valeur, dict): + fusionner(dict1[cle], valeur) + # Si les deux sont des listes, concaténation + elif isinstance(dict1[cle], list) and isinstance(valeur, list): + dict1[cle].extend(valeur) + # Sinon, on garde les deux valeurs dans une liste + else: + if not isinstance(dict1[cle], list): + dict1[cle] = [dict1[cle]] + if isinstance(valeur, list): + dict1[cle].extend(valeur) + else: + dict1[cle].append(valeur) + else: + # Si la clé n'existe pas dans dict1, on l'ajoute simplement + dict1[cle] = valeur + + fusionner(resultat, json2) + self.ajouter_historique("fusionner_jsons", "Fusion de deux JSON", "Fusion réussie") + + return resultat \ No newline at end of file diff --git a/agents/analyse_image.py b/agents/analyse_image.py new file mode 100644 index 0000000..32b7e17 --- /dev/null +++ b/agents/analyse_image.py @@ -0,0 +1,94 @@ +import os +import json +from typing import Dict, List, Any, Optional +from datetime import datetime + +from agents.base_agent import Agent +from core.factory import LLMFactory + +class AgentAnalyseImage(Agent): + """ + Agent pour analyser des images avec LlamaVision + """ + def __init__(self, nom: str = "AgentAnalyseImage"): + super().__init__(nom) + self.llm = LLMFactory.create("llamavision") + self.questions_standard = [ + "Décris en détail ce que tu vois sur cette image.", + "Quels sont les éléments principaux visibles sur cette image?", + "Y a-t-il du texte visible sur cette image? Si oui, peux-tu le transcrire?", + "Quelle est l'ambiance générale de cette image?" + ] + + def executer(self, image_path: str, json_data: Optional[Dict[str, Any]] = None, + question: Optional[str] = None) -> Dict[str, Any]: + """ + Analyse une image avec Llama Vision + + Args: + image_path: Chemin vers l'image à analyser + json_data: Données JSON optionnelles associées à l'image + question: Question à poser au modèle (si None, utilise les questions standard) + + Returns: + Résultats de l'analyse sous forme de dictionnaire + """ + # Vérification de l'existence de l'image + if not os.path.exists(image_path): + resultat = {"erreur": f"L'image {image_path} n'existe pas"} + self.ajouter_historique("analyse_image_erreur", image_path, resultat) + return resultat + + # Préparation de la liste des questions à poser + questions_a_poser = [question] if question else self.questions_standard + + # Exécution de l'analyse pour chaque question + resultats = { + "image": image_path, + "timestamp": datetime.now().isoformat(), + "analyses": [] + } + + # Encodage de l'image en base64 pour l'API + with open(image_path, "rb") as image_file: + image_data = image_file.read() + + # Traitement pour chaque question + for q in questions_a_poser: + try: + # Appel du modèle via la factory + reponse = self.llm.generate(q, images=[image_data]) + + # Ajout du résultat + resultats["analyses"].append({ + "question": q, + "reponse": reponse + }) + + # Ajout à l'historique + self.ajouter_historique("analyse_image", q, reponse[:200] + "...") + except Exception as e: + resultats["analyses"].append({ + "question": q, + "erreur": str(e) + }) + self.ajouter_historique("analyse_image_erreur", q, str(e)) + + return resultats + + def sauvegarder_resultats(self, chemin_fichier: str, resultats: Dict[str, Any]) -> bool: + """ + Sauvegarde les résultats d'analyse dans un fichier JSON + """ + try: + # Création du dossier parent si nécessaire + os.makedirs(os.path.dirname(os.path.abspath(chemin_fichier)), exist_ok=True) + + with open(chemin_fichier, 'w', encoding='utf-8') as f: + json.dump(resultats, f, ensure_ascii=False, indent=2) + + self.ajouter_historique("sauvegarder_resultats", chemin_fichier, "Résultats sauvegardés") + return True + except Exception as e: + self.ajouter_historique("sauvegarder_resultats_erreur", chemin_fichier, str(e)) + return False \ No newline at end of file diff --git a/agents/base_agent.py b/agents/base_agent.py new file mode 100644 index 0000000..0ae0f66 --- /dev/null +++ b/agents/base_agent.py @@ -0,0 +1,26 @@ +from datetime import datetime +from typing import Dict, List, Any, Optional + +class Agent: + """Classe de base pour tous les agents d'analyse""" + + def __init__(self, nom: str = "Agent"): + self.nom = nom + self.historique = [] + + def ajouter_historique(self, action: str, input_data: Any, output_data: Any) -> None: + """Ajoute une entrée dans l'historique de l'agent""" + self.historique.append({ + "timestamp": datetime.now().isoformat(), + "action": action, + "input": str(input_data)[:500], # Limite pour éviter des historiques trop grands + "output": str(output_data)[:500] # Limite pour éviter des historiques trop grands + }) + + def obtenir_historique(self) -> List[Dict[str, Any]]: + """Retourne l'historique complet de l'agent""" + return self.historique + + def executer(self, *args, **kwargs) -> Any: + """Méthode abstraite à implémenter dans les classes dérivées""" + raise NotImplementedError("Chaque agent doit implémenter sa propre méthode executer()") \ No newline at end of file diff --git a/agents/roles.py b/agents/roles.py index 10e503b..b256926 100644 --- a/agents/roles.py +++ b/agents/roles.py @@ -40,5 +40,42 @@ AGENTS = { "temperature": 0.6, "top_p": 0.95 } + }, + # Agents spécifiques à llama3.2-vision:90b + "diagnostic_assistant": { + "system_prompt": ( + "You are a support diagnostics expert. Analyze the attached image and ticket transcript. " + "Identify any issue present and provide technical insights." + ), + "description_fr": "Expert en diagnostic de support technique. Analyse l'image et le ticket pour identifier les problèmes.", + "params": { + "temperature": 0.3, + "top_p": 1.0, + "format": "json" + } + }, + "resolution_checker": { + "system_prompt": ( + "You are a resolution verifier for technical support. Review the ticket and determine if the problem was solved. " + "Explain your reasoning." + ), + "description_fr": "Vérificateur de résolution de tickets de support technique.", + "params": { + "temperature": 0.2, + "top_p": 1.0, + "format": "json" + } + }, + "support_analyzer": { + "system_prompt": ( + "You are an advanced support assistant. Based on the image and ticket thread, summarize the problem, probable cause, and solution. " + "Return your output in structured JSON." + ), + "description_fr": "Assistant support avancé. Résume le problème, cause probable et solution dans un format structuré.", + "params": { + "temperature": 0.4, + "top_p": 0.95, + "format": "json" + } } } \ No newline at end of file diff --git a/analyse_projets.md b/analyse_projets.md new file mode 100644 index 0000000..d2f5990 --- /dev/null +++ b/analyse_projets.md @@ -0,0 +1,293 @@ +# Analyse comparative des projets AIagent2 et llm_lab-test + +## 1. Différences structurelles entre les deux projets + +### Structure de AIagent2 (ancien projet) +``` +AIagent2/ +├── llm_classes/ +│ ├── __init__.py +│ ├── llm.py (classe abstraite de base) +│ ├── mistral.py +│ ├── ollama.py +│ ├── deepseek.py +│ ├── perplexity.py +│ ├── deepl.py +│ ├── rag.py +│ ├── llama_vision.py +│ ├── agents.py (classe Agent abstraite et implémentations) +│ ├── example.py +│ ├── example_vision.py +│ └── requirements.txt +├── images/ +└── JSON/ +``` + +### Structure de llm_lab-test (nouveau projet) +``` +llm_lab-test/ +├── core/ +│ ├── base_llm.py (classe abstraite de base) +│ ├── factory.py (pattern Factory pour instancier les LLM) +│ ├── mistral7b.py +│ └── llama_vision90b.py +├── agents/ +│ └── roles.py (définition des rôles d'agents) +├── utils/ +├── tests/ +├── config/ +├── prompts/ +├── outputs/ +└── logs/ +``` + +### Principales différences + +1. **Organisation structurelle**: + - AIagent2: Organisation plus plate avec toutes les classes LLM et agents dans le même package + - llm_lab-test: Structure plus modulaire avec séparation claire entre core (modèles) et agents (rôles) + +2. **Patron de conception**: + - AIagent2: Utilise principalement l'héritage avec classes abstraites + - llm_lab-test: Utilise le pattern Factory pour créer les instances LLM et séparation entre modèles et rôles + +3. **Gestion des configurations**: + - AIagent2: Configuration intégrée dans les classes + - llm_lab-test: Configuration externalisée dans un dossier dédié et séparation des rôles + +4. **Logging et sorties**: + - AIagent2: Gestion interne dans les classes + - llm_lab-test: Dossiers dédiés pour les logs et les sorties + +## 2. Analyse de la classe abstraite Agent dans AIagent2 + +### Structure de la classe Agent + +Dans l'ancien projet AIagent2, une classe abstraite `Agent` a été définie comme base pour tous les agents spécialisés. Cette approche suit le principe de conception orienté objet où une classe de base définit l'interface commune et les comportements partagés. + +```python +class Agent: + """ + Classe de base pour tous les agents + """ + def __init__(self, nom: str = "Agent"): + self.nom: str = nom + self.historique: List[Dict[str, Any]] = [] + + def ajouter_historique(self, action: str, input_data: Any, output_data: Any) -> None: + # Implémentation commune + + def obtenir_historique(self) -> List[Dict[str, Any]]: + # Implémentation commune + + def executer(self, *args, **kwargs) -> Any: + # Méthode abstraite que chaque agent doit implémenter + raise NotImplementedError("Chaque agent doit implémenter sa propre méthode executer()") +``` + +### Agents spécialisés implémentés + +Trois agents spécialisés héritent de cette classe abstraite : + +1. **AgentAnalyseImage** - Spécialisé dans l'analyse d'images avec LlamaVision +2. **AgentAnalyseJSON** - Spécialisé dans l'analyse de données JSON +3. **AgentQuestionReponse** - Spécialisé dans le processus de questions/réponses + +### Intérêt de cette approche + +1. **Cohérence d'interface** : Tous les agents partagent la même interface de base (`executer()`) +2. **Code réutilisable** : Les fonctionnalités communes comme la gestion de l'historique sont implémentées une seule fois +3. **Extensibilité** : Facile d'ajouter de nouveaux types d'agents en héritant de la classe de base +4. **Polymorphisme** : Possibilité de traiter différents agents de manière uniforme +5. **Traçabilité** : Gestion unifiée de l'historique des actions et résultats + +## 3. Analyse des classes LLM dans les deux projets + +### Classes LLM dans AIagent2 + +Le projet AIagent2 comporte plusieurs classes pour différents modèles LLM, toutes héritant d'une classe abstraite `LLM` : + +1. **Mistral** - Intégration avec l'API Mistral +2. **Ollama** - Intégration avec Ollama pour les modèles locaux +3. **DeepSeek** - Intégration avec l'API DeepSeek +4. **Perplexity** - Intégration avec l'API Perplexity +5. **DeepL** - Intégration avec l'API DeepL pour la traduction +6. **RAG** - Système de Retrieval Augmented Generation +7. **LlamaVision** - Intégration avec Llama Vision 3.2 pour l'analyse d'images + +Toutes ces classes partagent une interface commune définie par la classe abstraite `LLM`, qui inclut des méthodes comme `Interroger()`, `LLM_POST()`, etc. + +### Classes LLM dans llm_lab-test + +Le nouveau projet utilise une approche similaire mais plus simplifiée : + +1. **BaseLLM** - Classe de base abstraite +2. **Mistral7B** - Implémentation pour Mistral 7B +3. **LlamaVision90B** - Implémentation pour Llama Vision 90B + +La différence principale est la séparation entre les modèles et les rôles (agents), qui sont définis dans un fichier séparé. + +### Comparaison des implémentations LlamaVision + +#### LlamaVision dans AIagent2 +- Plus de paramètres configurables (température, top_k, top_p, mirostat, etc.) +- Support intégré pour les images et données JSON +- Méthodes pour la fusion des résultats avec JSON +- Gestion détaillée des erreurs + +#### LlamaVision90B dans llm_lab-test +- Implémentation plus simple +- Moins de paramètres configurables +- Support pour la traduction automatique +- Structure plus légère + +## 4. Recommandations pour le nouveau projet + +### Intégration de la classe Agent dans llm_lab-test + +L'approche avec une classe abstraite `Agent` présente des avantages significatifs qui pourraient être bénéfiques pour le nouveau projet sans perturber son fonctionnement actuel. + +Voici comment elle pourrait être implémentée : + +```python +# Proposition pour agents/base_agent.py +from datetime import datetime +from typing import Dict, List, Any, Optional + +class Agent: + """Classe de base pour tous les agents d'analyse""" + + def __init__(self, nom: str = "Agent"): + self.nom = nom + self.historique = [] + + def ajouter_historique(self, action: str, input_data: Any, output_data: Any) -> None: + """Ajoute une entrée dans l'historique de l'agent""" + self.historique.append({ + "timestamp": datetime.now().isoformat(), + "action": action, + "input": str(input_data)[:500], + "output": str(output_data)[:500] + }) + + def obtenir_historique(self) -> List[Dict[str, Any]]: + """Retourne l'historique complet de l'agent""" + return self.historique + + def executer(self, *args, **kwargs) -> Any: + """Méthode abstraite à implémenter dans les classes dérivées""" + raise NotImplementedError("Chaque agent doit implémenter sa propre méthode executer()") +``` + +### Adaptation de LlamaVision90B avec plus de paramètres + +Le modèle LlamaVision90B du nouveau projet pourrait bénéficier des paramètres supplémentaires disponibles dans l'ancien projet : + +```python +# Proposition de mise à jour pour core/llama_vision90b.py +class LlamaVision90B(BaseLLM): + def __init__(self): + model_name = "llama3.2-vision:90b" + engine = "Ollama" + + self.api_url = "http://217.182.105.173:11434/api/chat" + + default_params = { + # Paramètres existants + "temperature": 0.3, + "top_p": 1.0, + "top_k": 40, + "repeat_penalty": 1.1, + "num_predict": 512, + "num_ctx": 4096, + + # Nouveaux paramètres inspirés de l'ancien projet + "mirostat": 0, + "mirostat_eta": 0.1, + "mirostat_tau": 5.0, + "seed": 0, + "stop": [], + "min_p": 0.0, + + # Paramètres existants + "format": "json", + "stream": False, + "raw": False, + "keep_alive": "5m" + } + + super().__init__(model_name=model_name, engine=engine, base_params=default_params) + + # Support pour les données JSON associées + self.json_data = {} + + def set_json_data(self, json_data: Dict[str, Any]) -> bool: + """Définit les données JSON à associer à l'image""" + try: + self.json_data = json_data + return True + except Exception as e: + print(f"Erreur lors de la définition des données JSON: {e}") + return False + + # [...] Reste de l'implémentation +``` + +### Création d'une classe Mistral compatible avec l'ancien projet + +```python +# Proposition pour core/mistral_api.py +from core.base_llm import BaseLLM +import requests +import json + +class MistralAPI(BaseLLM): + """Intégration avec l'API Mistral (similaire à la classe Mistral de l'ancien projet)""" + + def __init__(self): + model_name = "mistral-large-latest" + engine = "MistralAPI" + + self.api_url = "https://api.mistral.ai/v1/chat/completions" + self.api_key = "VOTRE_CLE_API" # À remplacer par la clé réelle ou une variable d'environnement + + default_params = { + "temperature": 0.7, + "top_p": 0.9, + "max_tokens": 1024, + "presence_penalty": 0, + "frequency_penalty": 0, + "stop": [] + } + + super().__init__(model_name=model_name, engine=engine, base_params=default_params) + + def generate(self, user_prompt): + prompt = self._format_prompt(user_prompt) + + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {self.api_key}" + } + + payload = { + "model": self.model, + "messages": [ + {"role": "system", "content": self.system_prompt}, + {"role": "user", "content": user_prompt} + ], + "temperature": self.params.get("temperature", 0.7), + "top_p": self.params.get("top_p", 0.9), + "max_tokens": self.params.get("max_tokens", 1024) + } + + response = requests.post(self.api_url, headers=headers, json=payload) + + if not response.ok: + raise Exception(f"Erreur API Mistral: {response.status_code} - {response.text}") + + result_data = response.json() + result_text = result_data.get("choices", [{}])[0].get("message", {}).get("content", "") + + return self._log_result(user_prompt, result_text) +``` \ No newline at end of file diff --git a/core/__pycache__/llama_vision90b.cpython-312.pyc b/core/__pycache__/llama_vision90b.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef5c066cbb9dc9a0eb4f34a5c74345c883bbccee GIT binary patch literal 306 zcmX|4y-ve05I+CV7OJQWyZ~b)+91J#gcw*@3KNr;$Z1R{vg2YWNPQBXfu~?(;0+wX z(uobJTPMyHaMIoP-Q9QJy(h^YV7$Jqsupn-o4=sHWPOU{8A>RL215iPkyA|t-69ig zi(GI-rguzF^aw0z%Dn7 bool: + """ + Définit l'image à analyser à partir d'un chemin de fichier + Retourne True si l'image a été chargée avec succès + """ + if not os.path.exists(image_path): + return False + + try: + with open(image_path, "rb") as f: + self.image_data = f.read() + return True + except Exception as e: + print(f"Erreur lors du chargement de l'image: {e}") + return False + + def set_image_data(self, image_data: bytes) -> bool: + """ + Définit directement les données de l'image à analyser + """ + try: + self.image_data = image_data + return True + except Exception as e: + print(f"Erreur lors de la définition des données d'image: {e}") + return False + + def set_json_data(self, json_data: Dict[str, Any]) -> bool: + """ + Définit les données JSON à associer à l'image + """ + try: + self.json_data = json_data + return True + except Exception as e: + print(f"Erreur lors de la définition des données JSON: {e}") + return False + + def generate(self, user_prompt: str, images: list = None, translate: bool = False): + prompt = self._format_prompt(user_prompt) + + # Si des images sont fournies directement, utilisez-les + images_to_use = images if images else [] + + # Si image_data est défini et aucune image n'est fournie explicitement + if self.image_data is not None and not images: + # Encodage en base64 si ce n'est pas déjà fait + if isinstance(self.image_data, bytes): + encoded_image = base64.b64encode(self.image_data).decode('utf-8') + images_to_use = [encoded_image] + + # Ajout des données JSON dans le prompt si disponibles + if self.json_data: + json_str = json.dumps(self.json_data, ensure_ascii=False, indent=2) + # On ajoute le JSON au prompt pour qu'il soit traité avec l'image + prompt = f"{prompt}\n\nVoici des données JSON associées à cette image:\n```json\n{json_str}\n```" + + payload = { + "model": self.model, + "messages": [ + { + "role": "user", + "content": prompt, + "images": images_to_use + } + ], + "options": self.params, + "stream": self.params.get("stream", False) + } + + response = requests.post(self.api_url, json=payload) + + if not response.ok: + raise Exception(f"Erreur API Ollama : {response.status_code} - {response.text}") + + result_data = response.json() + result_text = result_data.get("message", {}).get("content", "") + + self._log_result(user_prompt, result_text) + + # Stockage du résultat pour fusion ultérieure + self.dernier_resultat = result_data + + if translate: + result_fr = GoogleTranslator(source="auto", target="fr").translate(result_text) + return result_text, result_fr + + return result_text + + def fusionner_json_avec_resultats(self) -> Dict[str, Any]: + """ + Fusionne les données JSON existantes avec les résultats de l'analyse d'image + """ + if not hasattr(self, 'dernier_resultat'): + return self.json_data + + # Créer une copie du JSON original + resultat_fusionne = self.json_data.copy() if self.json_data else {} + + # Ajouter le résultat de l'analyse d'image + if "analyse_image" not in resultat_fusionne: + resultat_fusionne["analyse_image"] = [] + + # Ajouter le résultat à la liste des analyses + nouvelle_analyse = { + "modele": self.model, + "reponse": self.dernier_resultat.get("message", {}).get("content", ""), + "parametres": { + "temperature": self.params.get("temperature"), + "top_p": self.params.get("top_p"), + "num_ctx": self.params.get("num_ctx") + } + } + + resultat_fusionne["analyse_image"].append(nouvelle_analyse) + + return resultat_fusionne + + def sauvegarder_resultats(self, chemin_fichier: str) -> bool: + """ + Sauvegarde les résultats fusionnés dans un fichier JSON + """ + try: + resultats_fusionnes = self.fusionner_json_avec_resultats() + + # Création du dossier parent si nécessaire + os.makedirs(os.path.dirname(os.path.abspath(chemin_fichier)), exist_ok=True) + + with open(chemin_fichier, 'w', encoding='utf-8') as f: + json.dump(resultats_fusionnes, f, ensure_ascii=False, indent=2) + + return True + except Exception as e: + print(f"Erreur lors de la sauvegarde des résultats: {e}") + return False \ No newline at end of file diff --git a/core/mistral_api.py b/core/mistral_api.py new file mode 100644 index 0000000..fab70b6 --- /dev/null +++ b/core/mistral_api.py @@ -0,0 +1,113 @@ +from core.base_llm import BaseLLM +import requests +import json +import os +from typing import Dict, List, Any, Optional + +class MistralAPI(BaseLLM): + """Intégration avec l'API Mistral (similaire à la classe Mistral de l'ancien projet)""" + + def __init__(self): + model_name = "mistral-large-latest" + engine = "MistralAPI" + + self.api_url = "https://api.mistral.ai/v1/chat/completions" + # À remplacer par la clé réelle ou une variable d'environnement + self.api_key = os.environ.get("MISTRAL_API_KEY", "") + + default_params = { + # Paramètres de génération + "temperature": 0.7, + "top_p": 0.9, + "max_tokens": 1024, + + # Paramètres de contrôle + "presence_penalty": 0, + "frequency_penalty": 0, + "stop": [], + + # Paramètres divers + "random_seed": None + } + + super().__init__(model_name=model_name, engine=engine, base_params=default_params) + + def generate(self, user_prompt): + """Génère une réponse à partir du prompt utilisateur via l'API Mistral""" + prompt = self._format_prompt(user_prompt) + + if not self.api_key: + raise ValueError("Clé API Mistral non définie. Définissez la variable d'environnement MISTRAL_API_KEY.") + + headers = { + "Content-Type": "application/json", + "Authorization": f"Bearer {self.api_key}" + } + + # Préparation des messages + messages = [] + + # Ajout du prompt système si défini + if self.system_prompt: + messages.append({"role": "system", "content": self.system_prompt}) + + # Ajout du prompt utilisateur + messages.append({"role": "user", "content": user_prompt}) + + # Préparation du payload + payload = { + "model": self.model, + "messages": messages, + "temperature": self.params.get("temperature", 0.7), + "top_p": self.params.get("top_p", 0.9), + "max_tokens": self.params.get("max_tokens", 1024) + } + + # Ajout des paramètres optionnels + if self.params.get("presence_penalty") is not None: + payload["presence_penalty"] = self.params.get("presence_penalty") + + if self.params.get("frequency_penalty") is not None: + payload["frequency_penalty"] = self.params.get("frequency_penalty") + + # Vérifier que stop est une liste non vide + stop_sequences = self.params.get("stop") + if isinstance(stop_sequences, list) and stop_sequences: + payload["stop"] = stop_sequences + + if self.params.get("random_seed") is not None: + payload["random_seed"] = self.params.get("random_seed") + + # Envoi de la requête + response = requests.post(self.api_url, headers=headers, json=payload) + + if not response.ok: + raise Exception(f"Erreur API Mistral: {response.status_code} - {response.text}") + + # Traitement de la réponse + result_data = response.json() + result_text = result_data.get("choices", [{}])[0].get("message", {}).get("content", "") + + # Logging du résultat + filename = self._log_result(user_prompt, result_text) + + return result_text + + def obtenir_liste_modeles(self) -> List[str]: + """Récupère la liste des modèles disponibles via l'API Mistral""" + if not self.api_key: + raise ValueError("Clé API Mistral non définie. Définissez la variable d'environnement MISTRAL_API_KEY.") + + headers = { + "Authorization": f"Bearer {self.api_key}" + } + + response = requests.get("https://api.mistral.ai/v1/models", headers=headers) + + if not response.ok: + raise Exception(f"Erreur API Mistral: {response.status_code} - {response.text}") + + result_data = response.json() + models = [model.get("id") for model in result_data.get("data", [])] + + return models \ No newline at end of file diff --git a/llmlab/bin/deep-translator b/llmlab/bin/deep-translator new file mode 100755 index 0000000..f5477b5 --- /dev/null +++ b/llmlab/bin/deep-translator @@ -0,0 +1,8 @@ +#!/home/fgras-ca/llm_lab-test/llmlab/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from deep_translator.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/llmlab/bin/dt b/llmlab/bin/dt new file mode 100755 index 0000000..f5477b5 --- /dev/null +++ b/llmlab/bin/dt @@ -0,0 +1,8 @@ +#!/home/fgras-ca/llm_lab-test/llmlab/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from deep_translator.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/llmlab/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1408f97242c53ae942ef01e66e2f8da160ec7c10 GIT binary patch literal 172880 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

b(wGoA`I=cIQUT8ZFZ2Nx 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 +License: MIT License +License-File: AUTHORS +License-File: LICENSE +Keywords: HTML,XML,parse,soup +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Text Processing :: Markup :: HTML +Classifier: Topic :: Text Processing :: Markup :: SGML +Classifier: Topic :: Text Processing :: Markup :: XML +Requires-Python: >=3.7.0 +Requires-Dist: soupsieve>1.2 +Requires-Dist: typing-extensions>=4.0.0 +Provides-Extra: cchardet +Requires-Dist: cchardet; extra == 'cchardet' +Provides-Extra: chardet +Requires-Dist: chardet; extra == 'chardet' +Provides-Extra: charset-normalizer +Requires-Dist: charset-normalizer; extra == 'charset-normalizer' +Provides-Extra: html5lib +Requires-Dist: html5lib; extra == 'html5lib' +Provides-Extra: lxml +Requires-Dist: lxml; extra == 'lxml' +Description-Content-Type: text/markdown + +Beautiful Soup is a library that makes it easy to scrape information +from web pages. It sits atop an HTML or XML parser, providing Pythonic +idioms for iterating, searching, and modifying the parse tree. + +# Quick start + +``` +>>> from bs4 import BeautifulSoup +>>> soup = BeautifulSoup("

SomebadHTML") +>>> print(soup.prettify()) + + +

+ Some + + bad + + HTML + + +

+ + +>>> soup.find(string="bad") +'bad' +>>> soup.i +HTML +# +>>> soup = BeautifulSoup("SomebadXML", "xml") +# +>>> print(soup.prettify()) + + + Some + + bad + + XML + + +``` + +To go beyond the basics, [comprehensive documentation is available](https://www.crummy.com/software/BeautifulSoup/bs4/doc/). + +# Links + +* [Homepage](https://www.crummy.com/software/BeautifulSoup/bs4/) +* [Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) +* [Discussion group](https://groups.google.com/group/beautifulsoup/) +* [Development](https://code.launchpad.net/beautifulsoup/) +* [Bug tracker](https://bugs.launchpad.net/beautifulsoup/) +* [Complete changelog](https://git.launchpad.net/beautifulsoup/tree/CHANGELOG) + +# Note on Python 2 sunsetting + +Beautiful Soup's support for Python 2 was discontinued on December 31, +2020: one year after the sunset date for Python 2 itself. From this +point onward, new Beautiful Soup development will exclusively target +Python 3. The final release of Beautiful Soup 4 to support Python 2 +was 4.9.3. + +# Supporting the project + +If you use Beautiful Soup as part of your professional work, please consider a +[Tidelift subscription](https://tidelift.com/subscription/pkg/pypi-beautifulsoup4?utm_source=pypi-beautifulsoup4&utm_medium=referral&utm_campaign=readme). +This will support many of the free software projects your organization +depends on, not just Beautiful Soup. + +If you use Beautiful Soup for personal projects, the best way to say +thank you is to read +[Tool Safety](https://www.crummy.com/software/BeautifulSoup/zine/), a zine I +wrote about what Beautiful Soup has taught me about software +development. + +# Building the documentation + +The bs4/doc/ directory contains full documentation in Sphinx +format. Run `make html` in that directory to create HTML +documentation. + +# Running the unit tests + +Beautiful Soup supports unit test discovery using Pytest: + +``` +$ pytest +``` + diff --git a/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/RECORD b/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/RECORD new file mode 100644 index 0000000..a3efc0d --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/RECORD @@ -0,0 +1,89 @@ +beautifulsoup4-4.13.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +beautifulsoup4-4.13.3.dist-info/METADATA,sha256=o692i819qmuScSS6UxoBFAi2xPSl8bk2V6TuQ3zBofs,3809 +beautifulsoup4-4.13.3.dist-info/RECORD,, +beautifulsoup4-4.13.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 +beautifulsoup4-4.13.3.dist-info/licenses/AUTHORS,sha256=6-a5uw17L-xMAg7-R3iVPGKH_OwwacpjRkuOVPjAeyw,2198 +beautifulsoup4-4.13.3.dist-info/licenses/LICENSE,sha256=VbTY1LHlvIbRDvrJG3TIe8t3UmsPW57a-LnNKtxzl7I,1441 +bs4/__init__.py,sha256=-jvrE9GBtzsOF3wIrIOALQTqu99mf9_gEhNFJMCQLeg,44212 +bs4/__pycache__/__init__.cpython-312.pyc,, +bs4/__pycache__/_deprecation.cpython-312.pyc,, +bs4/__pycache__/_typing.cpython-312.pyc,, +bs4/__pycache__/_warnings.cpython-312.pyc,, +bs4/__pycache__/css.cpython-312.pyc,, +bs4/__pycache__/dammit.cpython-312.pyc,, +bs4/__pycache__/diagnose.cpython-312.pyc,, +bs4/__pycache__/element.cpython-312.pyc,, +bs4/__pycache__/exceptions.cpython-312.pyc,, +bs4/__pycache__/filter.cpython-312.pyc,, +bs4/__pycache__/formatter.cpython-312.pyc,, +bs4/_deprecation.py,sha256=ucZjfBAUF1B0f5ldNIIhlkHsYjHtvwELWlE3_pAR6Vs,2394 +bs4/_typing.py,sha256=3FgPPPrdsTa-kvn1R36o1k_2SfilcUWm4M9i7G4qFl8,7118 +bs4/_warnings.py,sha256=ZuOETgcnEbZgw2N0nnNXn6wvtrn2ut7AF0d98bvkMFc,4711 +bs4/builder/__init__.py,sha256=TYAKmGFuVfTsI53reHijcZKETnPuvse57KZ6LsZsJRo,31130 +bs4/builder/__pycache__/__init__.cpython-312.pyc,, +bs4/builder/__pycache__/_html5lib.cpython-312.pyc,, +bs4/builder/__pycache__/_htmlparser.cpython-312.pyc,, +bs4/builder/__pycache__/_lxml.cpython-312.pyc,, +bs4/builder/_html5lib.py,sha256=3MXq29SYg9XoS9gu2hgTDU02IQkv8kIBx3rW1QWY3fg,22846 +bs4/builder/_htmlparser.py,sha256=cu9PFkxkqVIIe9nU3fVy-JJhINEhY8cGbsuCwZCnQCA,17872 +bs4/builder/_lxml.py,sha256=XRzCA4WzvIUjJk9_U4kWzMBvGokr_UaIvoGUmtLtTYI,18538 +bs4/css.py,sha256=XGQq7HQUDyYEbDorFMGIGek7QGPiFuZYnvNEQ59GyxM,12685 +bs4/dammit.py,sha256=oHd1elJ44kMobBGSQRuG7Wln6M-BLz1unOuUscaL9h0,51472 +bs4/diagnose.py,sha256=zy7_GPQHsTtNf8s10WWIRcC5xH5_8LKs295Aa7iFUyI,7832 +bs4/element.py,sha256=8CXiRqz2DZJyga2igCVGaXdP7urNEDvDnsRid3SNNw4,109331 +bs4/exceptions.py,sha256=Q9FOadNe8QRvzDMaKSXe2Wtl8JK_oAZW7mbFZBVP_GE,951 +bs4/filter.py,sha256=2_ydSe978oLVmVyNLBi09Cc1VJEXYVjuO6K4ALq6XFk,28819 +bs4/formatter.py,sha256=5O4gBxTTi5TLU6TdqsgYI9Io0Gc_6-oCAWpfHI3Thn0,10464 +bs4/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +bs4/tests/__init__.py,sha256=Heh-lB8w8mzpaWcgs7MRwkBnDcf1YxAvqvePmsej1Pc,52268 +bs4/tests/__pycache__/__init__.cpython-312.pyc,, +bs4/tests/__pycache__/test_builder.cpython-312.pyc,, +bs4/tests/__pycache__/test_builder_registry.cpython-312.pyc,, +bs4/tests/__pycache__/test_css.cpython-312.pyc,, +bs4/tests/__pycache__/test_dammit.cpython-312.pyc,, +bs4/tests/__pycache__/test_element.cpython-312.pyc,, +bs4/tests/__pycache__/test_filter.cpython-312.pyc,, +bs4/tests/__pycache__/test_formatter.cpython-312.pyc,, +bs4/tests/__pycache__/test_fuzz.cpython-312.pyc,, +bs4/tests/__pycache__/test_html5lib.cpython-312.pyc,, +bs4/tests/__pycache__/test_htmlparser.cpython-312.pyc,, +bs4/tests/__pycache__/test_lxml.cpython-312.pyc,, +bs4/tests/__pycache__/test_navigablestring.cpython-312.pyc,, +bs4/tests/__pycache__/test_pageelement.cpython-312.pyc,, +bs4/tests/__pycache__/test_soup.cpython-312.pyc,, +bs4/tests/__pycache__/test_tag.cpython-312.pyc,, +bs4/tests/__pycache__/test_tree.cpython-312.pyc,, +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase,sha256=yUdXkbpNK7LVOQ0LBHMoqZ1rWaBfSXWytoO_xdSm7Ho,15 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase,sha256=Uv_dx4a43TSfoNkjU-jHW2nSXkqHFg4XdAw7SWVObUk,23 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase,sha256=OEyVA0Ej4FxswOElrUNt0In4s4YhrmtaxE_NHGZvGtg,30 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase,sha256=G4vpNBOz-RwMpi6ewEgNEa13zX0sXhmL7VHOyIcdKVQ,15347 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase,sha256=3d8z65o4p7Rur-RmCHoOjzqaYQ8EAtjmiBYTHNyAdl4,19469 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase,sha256=NfGIlit1k40Ip3mlnBkYOkIDJX6gHtjlErwl7gsBjAQ,12 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase,sha256=xy4i1U0nhFHcnyc5pRKS6JRMvuoCNUur-Scor6UxIGw,4317 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase,sha256=Q-UTYpQBUsWoMgIUspUlzveSI-41s4ABC3jajRb-K0o,11502 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase,sha256=2bq3S8KxZgk8EajLReHD8m4_0Lj_nrkyJAxB_z_U0D0,5 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase,sha256=MZDu31LPLfgu6jP9IZkrlwNes3f_sL8WFP5BChkUKdY,35 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase,sha256=w58r-s6besG5JwPXpnz37W2YTj9-_qxFbk6hiEnKeIQ,51495 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase,sha256=q8rkdMECEXKcqVhOf5zWHkSBTQeOPt0JiLg2TZiPCuk,10380 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase,sha256=QfzoOxKwNuqG-4xIrea6MOQLXhfAAOQJ0r9u-J6kSNs,19 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase,sha256=MJ2pHFuuCQUiQz1Kor2sof7LWeRERQ6QK43YNqQHg9o,47 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase,sha256=EItOpSdeD4ewK-qgJ9vtxennwn_huguzXgctrUT7fqE,3546 +bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase,sha256=a2aJTG4FceGSJXsjtxoS8S4jk_8rZsS3aznLkeO2_dY,124 +bs4/tests/fuzz/crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase,sha256=jRFRtCKlP3-3EDLc_iVRTcE6JNymv0rYcVM6qRaPrxI,2607 +bs4/tests/fuzz/crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase,sha256=7NsdCiXWAhNkmoW1pvF7rbZExyLAQIWtDtSHXIsH6YU,103 +bs4/tests/test_builder.py,sha256=BBMBirb4mb-fVdJj4dxQCxrdcjQeulKSKBFrPFVpVOk,1095 +bs4/tests/test_builder_registry.py,sha256=tpJ5Niva_cF49SdzIb1gMo0W4Tiodr8BYSOE3O6P_g8,5064 +bs4/tests/test_css.py,sha256=T_HCMzpe6hTr8d2YFXm0DScr8gT8d6h0MYlhZfo6A4U,18625 +bs4/tests/test_dammit.py,sha256=TQCVe6kKVYSuYjwTtIvIaOYYmWYPMnR_3PK45kimLg4,17840 +bs4/tests/test_element.py,sha256=u7FbTtKE6pYJetD1PgS3fCU1-QQXfB7GaLwfI3s4ROY,4373 +bs4/tests/test_filter.py,sha256=Sie2l-vepWTAqlXJJpG0Qp4HD8HHSi2TC1XymCxws70,27032 +bs4/tests/test_formatter.py,sha256=a6TaeNOVeg_ZYseiP7atmFyYJkQJqlk-jlVxMlyJC2o,6943 +bs4/tests/test_fuzz.py,sha256=zyaoWgCt8hnRkXecBYM9x91fI_Ao9eQUcsBi76ooJ08,7123 +bs4/tests/test_html5lib.py,sha256=ljMOAds__k9zhfT4jVnxxhZkLEggaT7wqDexzDNwus4,9206 +bs4/tests/test_htmlparser.py,sha256=iDHEI69GcisNP48BeHdLAWlqPGhrBwxftnUM8_3nsR4,6662 +bs4/tests/test_lxml.py,sha256=4fZIsNVbm2zdRQFNNwD-lqwf_QtUtiU4QbtLXISQZBw,7453 +bs4/tests/test_navigablestring.py,sha256=ntfnbp8-sRAOoCCVbm4cCXatS7kmCOaIRFDj-v5-l0s,5096 +bs4/tests/test_pageelement.py,sha256=lAw-sVP3zJX0VdHXXN1Ia3tci5dgK10Gac5o9G46IIk,16195 +bs4/tests/test_soup.py,sha256=I-mhNheo2-PTvfJToDI43EO4RmGlpKJsYOS19YoQ7-8,22669 +bs4/tests/test_tag.py,sha256=ue32hxQs_a1cMuzyu7MNjK42t0IOGMA6POPLIArMOts,9690 +bs4/tests/test_tree.py,sha256=vgUa6x8AJFEvHQ7RQu0973wrsLCRdRpdtq4oZAa_ANA,54839 diff --git a/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/WHEEL b/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/WHEEL new file mode 100644 index 0000000..12228d4 --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/WHEEL @@ -0,0 +1,4 @@ +Wheel-Version: 1.0 +Generator: hatchling 1.27.0 +Root-Is-Purelib: true +Tag: py3-none-any diff --git a/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/licenses/AUTHORS b/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/licenses/AUTHORS new file mode 100644 index 0000000..587a979 --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/licenses/AUTHORS @@ -0,0 +1,49 @@ +Behold, mortal, the origins of Beautiful Soup... +================================================ + +Leonard Richardson is the primary maintainer. + +Aaron DeVore, Isaac Muse and Chris Papademetrious have made +significant contributions to the code base. + +Mark Pilgrim provided the encoding detection code that forms the base +of UnicodeDammit. + +Thomas Kluyver and Ezio Melotti finished the work of getting Beautiful +Soup 4 working under Python 3. + +Simon Willison wrote soupselect, which was used to make Beautiful Soup +support CSS selectors. Isaac Muse wrote SoupSieve, which made it +possible to _remove_ the CSS selector code from Beautiful Soup. + +Sam Ruby helped with a lot of edge cases. + +Jonathan Ellis was awarded the prestigious Beau Potage D'Or for his +work in solving the nestable tags conundrum. + +An incomplete list of people have contributed patches to Beautiful +Soup: + + Istvan Albert, Andrew Lin, Anthony Baxter, Oliver Beattie, Andrew +Boyko, Tony Chang, Francisco Canas, "Delong", Zephyr Fang, Fuzzy, +Roman Gaufman, Yoni Gilad, Richie Hindle, Toshihiro Kamiya, Peteris +Krumins, Kent Johnson, Marek Kapolka, Andreas Kostyrka, Roel Kramer, +Ben Last, Robert Leftwich, Stefaan Lippens, "liquider", Staffan +Malmgren, Ksenia Marasanova, JP Moins, Adam Monsen, John Nagle, "Jon", +Ed Oskiewicz, Martijn Peters, Greg Phillips, Giles Radford, Stefano +Revera, Arthur Rudolph, Marko Samastur, James Salter, Jouni Seppnen, +Alexander Schmolck, Tim Shirley, Geoffrey Sneddon, Ville Skytt, +"Vikas", Jens Svalgaard, Andy Theyers, Eric Weiser, Glyn Webster, John +Wiseman, Paul Wright, Danny Yoo + +An incomplete list of people who made suggestions or found bugs or +found ways to break Beautiful Soup: + + Hanno Bck, Matteo Bertini, Chris Curvey, Simon Cusack, Bruce Eckel, + Matt Ernst, Michael Foord, Tom Harris, Bill de hOra, Donald Howes, + Matt Patterson, Scott Roberts, Steve Strassmann, Mike Williams, + warchild at redho dot com, Sami Kuisma, Carlos Rocha, Bob Hutchison, + Joren Mc, Michal Migurski, John Kleven, Tim Heaney, Tripp Lilley, Ed + Summers, Dennis Sutch, Chris Smith, Aaron Swartz, Stuart + Turner, Greg Edwards, Kevin J Kalupson, Nikos Kouremenos, Artur de + Sousa Rocha, Yichun Wei, Per Vognsen diff --git a/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/licenses/LICENSE b/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/licenses/LICENSE new file mode 100644 index 0000000..08e3a9c --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/beautifulsoup4-4.13.3.dist-info/licenses/LICENSE @@ -0,0 +1,31 @@ +Beautiful Soup is made available under the MIT license: + + Copyright (c) Leonard Richardson + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +Beautiful Soup incorporates code from the html5lib library, which is +also made available under the MIT license. Copyright (c) James Graham +and other contributors + +Beautiful Soup has an optional dependency on the soupsieve library, +which is also made available under the MIT license. Copyright (c) +Isaac Muse diff --git a/llmlab/lib/python3.12/site-packages/bs4/__init__.py b/llmlab/lib/python3.12/site-packages/bs4/__init__.py new file mode 100644 index 0000000..68a992a --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/__init__.py @@ -0,0 +1,1170 @@ +"""Beautiful Soup Elixir and Tonic - "The Screen-Scraper's Friend". + +http://www.crummy.com/software/BeautifulSoup/ + +Beautiful Soup uses a pluggable XML or HTML parser to parse a +(possibly invalid) document into a tree representation. Beautiful Soup +provides methods and Pythonic idioms that make it easy to navigate, +search, and modify the parse tree. + +Beautiful Soup works with Python 3.7 and up. It works better if lxml +and/or html5lib is installed, but they are not required. + +For more than you ever wanted to know about Beautiful Soup, see the +documentation: http://www.crummy.com/software/BeautifulSoup/bs4/doc/ +""" + +__author__ = "Leonard Richardson (leonardr@segfault.org)" +__version__ = "4.13.3" +__copyright__ = "Copyright (c) 2004-2025 Leonard Richardson" +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +__all__ = [ + "AttributeResemblesVariableWarning", + "BeautifulSoup", + "Comment", + "Declaration", + "ProcessingInstruction", + "ResultSet", + "CSS", + "Script", + "Stylesheet", + "Tag", + "TemplateString", + "ElementFilter", + "UnicodeDammit", + "CData", + "Doctype", + + # Exceptions + "FeatureNotFound", + "ParserRejectedMarkup", + "StopParsing", + + # Warnings + "AttributeResemblesVariableWarning", + "GuessedAtParserWarning", + "MarkupResemblesLocatorWarning", + "UnusualUsageWarning", + "XMLParsedAsHTMLWarning", +] + +from collections import Counter +import sys +import warnings + +# The very first thing we do is give a useful error if someone is +# running this code under Python 2. +if sys.version_info.major < 3: + raise ImportError( + "You are trying to use a Python 3-specific version of Beautiful Soup under Python 2. This will not work. The final version of Beautiful Soup to support Python 2 was 4.9.3." + ) + +from .builder import ( + builder_registry, + TreeBuilder, +) +from .builder._htmlparser import HTMLParserTreeBuilder +from .dammit import UnicodeDammit +from .css import CSS +from ._deprecation import ( + _deprecated, +) +from .element import ( + CData, + Comment, + DEFAULT_OUTPUT_ENCODING, + Declaration, + Doctype, + NavigableString, + PageElement, + ProcessingInstruction, + PYTHON_SPECIFIC_ENCODINGS, + ResultSet, + Script, + Stylesheet, + Tag, + TemplateString, +) +from .formatter import Formatter +from .filter import ( + ElementFilter, + SoupStrainer, +) +from typing import ( + Any, + cast, + Counter as CounterType, + Dict, + Iterator, + List, + Sequence, + Optional, + Type, + Union, +) + +from bs4._typing import ( + _Encoding, + _Encodings, + _IncomingMarkup, + _InsertableElement, + _RawAttributeValue, + _RawAttributeValues, + _RawMarkup, +) + +# Import all warnings and exceptions into the main package. +from bs4.exceptions import ( + FeatureNotFound, + ParserRejectedMarkup, + StopParsing, +) +from bs4._warnings import ( + AttributeResemblesVariableWarning, + GuessedAtParserWarning, + MarkupResemblesLocatorWarning, + UnusualUsageWarning, + XMLParsedAsHTMLWarning, +) + + +class BeautifulSoup(Tag): + """A data structure representing a parsed HTML or XML document. + + Most of the methods you'll call on a BeautifulSoup object are inherited from + PageElement or Tag. + + Internally, this class defines the basic interface called by the + tree builders when converting an HTML/XML document into a data + structure. The interface abstracts away the differences between + parsers. To write a new tree builder, you'll need to understand + these methods as a whole. + + These methods will be called by the BeautifulSoup constructor: + * reset() + * feed(markup) + + The tree builder may call these methods from its feed() implementation: + * handle_starttag(name, attrs) # See note about return value + * handle_endtag(name) + * handle_data(data) # Appends to the current data node + * endData(containerClass) # Ends the current data node + + No matter how complicated the underlying parser is, you should be + able to build a tree using 'start tag' events, 'end tag' events, + 'data' events, and "done with data" events. + + If you encounter an empty-element tag (aka a self-closing tag, + like HTML's
tag), call handle_starttag and then + handle_endtag. + """ + + #: Since `BeautifulSoup` subclasses `Tag`, it's possible to treat it as + #: a `Tag` with a `Tag.name`. Hoever, this name makes it clear the + #: `BeautifulSoup` object isn't a real markup tag. + ROOT_TAG_NAME: str = "[document]" + + #: If the end-user gives no indication which tree builder they + #: want, look for one with these features. + DEFAULT_BUILDER_FEATURES: Sequence[str] = ["html", "fast"] + + #: A string containing all ASCII whitespace characters, used in + #: during parsing to detect data chunks that seem 'empty'. + ASCII_SPACES: str = "\x20\x0a\x09\x0c\x0d" + + # FUTURE PYTHON: + element_classes: Dict[Type[PageElement], Type[PageElement]] #: :meta private: + builder: TreeBuilder #: :meta private: + is_xml: bool + known_xml: Optional[bool] + parse_only: Optional[SoupStrainer] #: :meta private: + + # These members are only used while parsing markup. + markup: Optional[_RawMarkup] #: :meta private: + current_data: List[str] #: :meta private: + currentTag: Optional[Tag] #: :meta private: + tagStack: List[Tag] #: :meta private: + open_tag_counter: CounterType[str] #: :meta private: + preserve_whitespace_tag_stack: List[Tag] #: :meta private: + string_container_stack: List[Tag] #: :meta private: + _most_recent_element: Optional[PageElement] #: :meta private: + + #: Beautiful Soup's best guess as to the character encoding of the + #: original document. + original_encoding: Optional[_Encoding] + + #: The character encoding, if any, that was explicitly defined + #: in the original document. This may or may not match + #: `BeautifulSoup.original_encoding`. + declared_html_encoding: Optional[_Encoding] + + #: This is True if the markup that was parsed contains + #: U+FFFD REPLACEMENT_CHARACTER characters which were not present + #: in the original markup. These mark character sequences that + #: could not be represented in Unicode. + contains_replacement_characters: bool + + def __init__( + self, + markup: _IncomingMarkup = "", + features: Optional[Union[str, Sequence[str]]] = None, + builder: Optional[Union[TreeBuilder, Type[TreeBuilder]]] = None, + parse_only: Optional[SoupStrainer] = None, + from_encoding: Optional[_Encoding] = None, + exclude_encodings: Optional[_Encodings] = None, + element_classes: Optional[Dict[Type[PageElement], Type[PageElement]]] = None, + **kwargs: Any, + ): + """Constructor. + + :param markup: A string or a file-like object representing + markup to be parsed. + + :param features: Desirable features of the parser to be + used. This may be the name of a specific parser ("lxml", + "lxml-xml", "html.parser", or "html5lib") or it may be the + type of markup to be used ("html", "html5", "xml"). It's + recommended that you name a specific parser, so that + Beautiful Soup gives you the same results across platforms + and virtual environments. + + :param builder: A TreeBuilder subclass to instantiate (or + instance to use) instead of looking one up based on + `features`. You only need to use this if you've implemented a + custom TreeBuilder. + + :param parse_only: A SoupStrainer. Only parts of the document + matching the SoupStrainer will be considered. This is useful + when parsing part of a document that would otherwise be too + large to fit into memory. + + :param from_encoding: A string indicating the encoding of the + document to be parsed. Pass this in if Beautiful Soup is + guessing wrongly about the document's encoding. + + :param exclude_encodings: A list of strings indicating + encodings known to be wrong. Pass this in if you don't know + the document's encoding but you know Beautiful Soup's guess is + wrong. + + :param element_classes: A dictionary mapping BeautifulSoup + classes like Tag and NavigableString, to other classes you'd + like to be instantiated instead as the parse tree is + built. This is useful for subclassing Tag or NavigableString + to modify default behavior. + + :param kwargs: For backwards compatibility purposes, the + constructor accepts certain keyword arguments used in + Beautiful Soup 3. None of these arguments do anything in + Beautiful Soup 4; they will result in a warning and then be + ignored. + + Apart from this, any keyword arguments passed into the + BeautifulSoup constructor are propagated to the TreeBuilder + constructor. This makes it possible to configure a + TreeBuilder by passing in arguments, not just by saying which + one to use. + """ + if "convertEntities" in kwargs: + del kwargs["convertEntities"] + warnings.warn( + "BS4 does not respect the convertEntities argument to the " + "BeautifulSoup constructor. Entities are always converted " + "to Unicode characters." + ) + + if "markupMassage" in kwargs: + del kwargs["markupMassage"] + warnings.warn( + "BS4 does not respect the markupMassage argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for any necessary markup massage." + ) + + if "smartQuotesTo" in kwargs: + del kwargs["smartQuotesTo"] + warnings.warn( + "BS4 does not respect the smartQuotesTo argument to the " + "BeautifulSoup constructor. Smart quotes are always converted " + "to Unicode characters." + ) + + if "selfClosingTags" in kwargs: + del kwargs["selfClosingTags"] + warnings.warn( + "Beautiful Soup 4 does not respect the selfClosingTags argument to the " + "BeautifulSoup constructor. The tree builder is responsible " + "for understanding self-closing tags." + ) + + if "isHTML" in kwargs: + del kwargs["isHTML"] + warnings.warn( + "Beautiful Soup 4 does not respect the isHTML argument to the " + "BeautifulSoup constructor. Suggest you use " + "features='lxml' for HTML and features='lxml-xml' for " + "XML." + ) + + def deprecated_argument(old_name: str, new_name: str) -> Optional[Any]: + if old_name in kwargs: + warnings.warn( + 'The "%s" argument to the BeautifulSoup constructor ' + 'was renamed to "%s" in Beautiful Soup 4.0.0' + % (old_name, new_name), + DeprecationWarning, + stacklevel=3, + ) + return kwargs.pop(old_name) + return None + + parse_only = parse_only or deprecated_argument("parseOnlyThese", "parse_only") + if parse_only is not None: + # Issue a warning if we can tell in advance that + # parse_only will exclude the entire tree. + if parse_only.excludes_everything: + warnings.warn( + f"The given value for parse_only will exclude everything: {parse_only}", + UserWarning, + stacklevel=3, + ) + + from_encoding = from_encoding or deprecated_argument( + "fromEncoding", "from_encoding" + ) + + if from_encoding and isinstance(markup, str): + warnings.warn( + "You provided Unicode markup but also provided a value for from_encoding. Your from_encoding will be ignored." + ) + from_encoding = None + + self.element_classes = element_classes or dict() + + # We need this information to track whether or not the builder + # was specified well enough that we can omit the 'you need to + # specify a parser' warning. + original_builder = builder + original_features = features + + builder_class: Type[TreeBuilder] + if isinstance(builder, type): + # A builder class was passed in; it needs to be instantiated. + builder_class = builder + builder = None + elif builder is None: + if isinstance(features, str): + features = [features] + if features is None or len(features) == 0: + features = self.DEFAULT_BUILDER_FEATURES + possible_builder_class = builder_registry.lookup(*features) + if possible_builder_class is None: + raise FeatureNotFound( + "Couldn't find a tree builder with the features you " + "requested: %s. Do you need to install a parser library?" + % ",".join(features) + ) + builder_class = possible_builder_class + + # At this point either we have a TreeBuilder instance in + # builder, or we have a builder_class that we can instantiate + # with the remaining **kwargs. + if builder is None: + builder = builder_class(**kwargs) + if ( + not original_builder + and not ( + original_features == builder.NAME + or ( + isinstance(original_features, str) + and original_features in builder.ALTERNATE_NAMES + ) + ) + and markup + ): + # The user did not tell us which TreeBuilder to use, + # and we had to guess. Issue a warning. + if builder.is_xml: + markup_type = "XML" + else: + markup_type = "HTML" + + # This code adapted from warnings.py so that we get the same line + # of code as our warnings.warn() call gets, even if the answer is wrong + # (as it may be in a multithreading situation). + caller = None + try: + caller = sys._getframe(1) + except ValueError: + pass + if caller: + globals = caller.f_globals + line_number = caller.f_lineno + else: + globals = sys.__dict__ + line_number = 1 + filename = globals.get("__file__") + if filename: + fnl = filename.lower() + if fnl.endswith((".pyc", ".pyo")): + filename = filename[:-1] + if filename: + # If there is no filename at all, the user is most likely in a REPL, + # and the warning is not necessary. + values = dict( + filename=filename, + line_number=line_number, + parser=builder.NAME, + markup_type=markup_type, + ) + warnings.warn( + GuessedAtParserWarning.MESSAGE % values, + GuessedAtParserWarning, + stacklevel=2, + ) + else: + if kwargs: + warnings.warn( + "Keyword arguments to the BeautifulSoup constructor will be ignored. These would normally be passed into the TreeBuilder constructor, but a TreeBuilder instance was passed in as `builder`." + ) + + self.builder = builder + self.is_xml = builder.is_xml + self.known_xml = self.is_xml + self._namespaces = dict() + self.parse_only = parse_only + + if hasattr(markup, "read"): # It's a file-type object. + markup = markup.read() + elif not isinstance(markup, (bytes, str)) and not hasattr(markup, "__len__"): + raise TypeError( + f"Incoming markup is of an invalid type: {markup!r}. Markup must be a string, a bytestring, or an open filehandle." + ) + elif len(markup) <= 256 and ( + (isinstance(markup, bytes) and b"<" not in markup and b"\n" not in markup) + or (isinstance(markup, str) and "<" not in markup and "\n" not in markup) + ): + # Issue warnings for a couple beginner problems + # involving passing non-markup to Beautiful Soup. + # Beautiful Soup will still parse the input as markup, + # since that is sometimes the intended behavior. + if not self._markup_is_url(markup): + self._markup_resembles_filename(markup) + + # At this point we know markup is a string or bytestring. If + # it was a file-type object, we've read from it. + markup = cast(_RawMarkup, markup) + + rejections = [] + success = False + for ( + self.markup, + self.original_encoding, + self.declared_html_encoding, + self.contains_replacement_characters, + ) in self.builder.prepare_markup( + markup, from_encoding, exclude_encodings=exclude_encodings + ): + self.reset() + self.builder.initialize_soup(self) + try: + self._feed() + success = True + break + except ParserRejectedMarkup as e: + rejections.append(e) + pass + + if not success: + other_exceptions = [str(e) for e in rejections] + raise ParserRejectedMarkup( + "The markup you provided was rejected by the parser. Trying a different parser or a different encoding may help.\n\nOriginal exception(s) from parser:\n " + + "\n ".join(other_exceptions) + ) + + # Clear out the markup and remove the builder's circular + # reference to this object. + self.markup = None + self.builder.soup = None + + def copy_self(self) -> "BeautifulSoup": + """Create a new BeautifulSoup object with the same TreeBuilder, + but not associated with any markup. + + This is the first step of the deepcopy process. + """ + clone = type(self)("", None, self.builder) + + # Keep track of the encoding of the original document, + # since we won't be parsing it again. + clone.original_encoding = self.original_encoding + return clone + + def __getstate__(self) -> Dict[str, Any]: + # Frequently a tree builder can't be pickled. + d = dict(self.__dict__) + if "builder" in d and d["builder"] is not None and not self.builder.picklable: + d["builder"] = type(self.builder) + # Store the contents as a Unicode string. + d["contents"] = [] + d["markup"] = self.decode() + + # If _most_recent_element is present, it's a Tag object left + # over from initial parse. It might not be picklable and we + # don't need it. + if "_most_recent_element" in d: + del d["_most_recent_element"] + return d + + def __setstate__(self, state: Dict[str, Any]) -> None: + # If necessary, restore the TreeBuilder by looking it up. + self.__dict__ = state + if isinstance(self.builder, type): + self.builder = self.builder() + elif not self.builder: + # We don't know which builder was used to build this + # parse tree, so use a default we know is always available. + self.builder = HTMLParserTreeBuilder() + self.builder.soup = self + self.reset() + self._feed() + + @classmethod + @_deprecated( + replaced_by="nothing (private method, will be removed)", version="4.13.0" + ) + def _decode_markup(cls, markup: _RawMarkup) -> str: + """Ensure `markup` is Unicode so it's safe to send into warnings.warn. + + warnings.warn had this problem back in 2010 but fortunately + not anymore. This has not been used for a long time; I just + noticed that fact while working on 4.13.0. + """ + if isinstance(markup, bytes): + decoded = markup.decode("utf-8", "replace") + else: + decoded = markup + return decoded + + @classmethod + def _markup_is_url(cls, markup: _RawMarkup) -> bool: + """Error-handling method to raise a warning if incoming markup looks + like a URL. + + :param markup: A string of markup. + :return: Whether or not the markup resembled a URL + closely enough to justify issuing a warning. + """ + problem: bool = False + if isinstance(markup, bytes): + problem = ( + any(markup.startswith(prefix) for prefix in (b"http:", b"https:")) + and b" " not in markup + ) + elif isinstance(markup, str): + problem = ( + any(markup.startswith(prefix) for prefix in ("http:", "https:")) + and " " not in markup + ) + else: + return False + + if not problem: + return False + warnings.warn( + MarkupResemblesLocatorWarning.URL_MESSAGE % dict(what="URL"), + MarkupResemblesLocatorWarning, + stacklevel=3, + ) + return True + + @classmethod + def _markup_resembles_filename(cls, markup: _RawMarkup) -> bool: + """Error-handling method to issue a warning if incoming markup + resembles a filename. + + :param markup: A string of markup. + :return: Whether or not the markup resembled a filename + closely enough to justify issuing a warning. + """ + markup_b: bytes + + # We're only checking ASCII characters, so rather than write + # the same tests twice, convert Unicode to a bytestring and + # operate on the bytestring. + if isinstance(markup, str): + markup_b = markup.encode("utf8") + else: + markup_b = markup + + # Step 1: does it end with a common textual file extension? + filelike = False + lower = markup_b.lower() + extensions = [b".html", b".htm", b".xml", b".xhtml", b".txt"] + if any(lower.endswith(ext) for ext in extensions): + filelike = True + if not filelike: + return False + + # Step 2: it _might_ be a file, but there are a few things + # we can look for that aren't very common in filenames. + + # Characters that have special meaning to Unix shells. (< was + # excluded before this method was called.) + # + # Many of these are also reserved characters that cannot + # appear in Windows filenames. + for byte in markup_b: + if byte in b"?*#&;>$|": + return False + + # Two consecutive forward slashes (as seen in a URL) or two + # consecutive spaces (as seen in fixed-width data). + # + # (Paths to Windows network shares contain consecutive + # backslashes, so checking that doesn't seem as helpful.) + if b"//" in markup_b: + return False + if b" " in markup_b: + return False + + # A colon in any position other than position 1 (e.g. after a + # Windows drive letter). + if markup_b.startswith(b":"): + return False + colon_i = markup_b.rfind(b":") + if colon_i not in (-1, 1): + return False + + # Step 3: If it survived all of those checks, it's similar + # enough to a file to justify issuing a warning. + warnings.warn( + MarkupResemblesLocatorWarning.FILENAME_MESSAGE % dict(what="filename"), + MarkupResemblesLocatorWarning, + stacklevel=3, + ) + return True + + def _feed(self) -> None: + """Internal method that parses previously set markup, creating a large + number of Tag and NavigableString objects. + """ + # Convert the document to Unicode. + self.builder.reset() + + if self.markup is not None: + self.builder.feed(self.markup) + # Close out any unfinished strings and close all the open tags. + self.endData() + while ( + self.currentTag is not None and self.currentTag.name != self.ROOT_TAG_NAME + ): + self.popTag() + + def reset(self) -> None: + """Reset this object to a state as though it had never parsed any + markup. + """ + Tag.__init__(self, self, self.builder, self.ROOT_TAG_NAME) + self.hidden = True + self.builder.reset() + self.current_data = [] + self.currentTag = None + self.tagStack = [] + self.open_tag_counter = Counter() + self.preserve_whitespace_tag_stack = [] + self.string_container_stack = [] + self._most_recent_element = None + self.pushTag(self) + + def new_tag( + self, + name: str, + namespace: Optional[str] = None, + nsprefix: Optional[str] = None, + attrs: Optional[_RawAttributeValues] = None, + sourceline: Optional[int] = None, + sourcepos: Optional[int] = None, + string: Optional[str] = None, + **kwattrs: _RawAttributeValue, + ) -> Tag: + """Create a new Tag associated with this BeautifulSoup object. + + :param name: The name of the new Tag. + :param namespace: The URI of the new Tag's XML namespace, if any. + :param prefix: The prefix for the new Tag's XML namespace, if any. + :param attrs: A dictionary of this Tag's attribute values; can + be used instead of ``kwattrs`` for attributes like 'class' + that are reserved words in Python. + :param sourceline: The line number where this tag was + (purportedly) found in its source document. + :param sourcepos: The character position within ``sourceline`` where this + tag was (purportedly) found. + :param string: String content for the new Tag, if any. + :param kwattrs: Keyword arguments for the new Tag's attribute values. + + """ + attr_container = self.builder.attribute_dict_class(**kwattrs) + if attrs is not None: + attr_container.update(attrs) + tag_class = self.element_classes.get(Tag, Tag) + + # Assume that this is either Tag or a subclass of Tag. If not, + # the user brought type-unsafety upon themselves. + tag_class = cast(Type[Tag], tag_class) + tag = tag_class( + None, + self.builder, + name, + namespace, + nsprefix, + attr_container, + sourceline=sourceline, + sourcepos=sourcepos, + ) + + if string is not None: + tag.string = string + return tag + + def string_container( + self, base_class: Optional[Type[NavigableString]] = None + ) -> Type[NavigableString]: + """Find the class that should be instantiated to hold a given kind of + string. + + This may be a built-in Beautiful Soup class or a custom class passed + in to the BeautifulSoup constructor. + """ + container = base_class or NavigableString + + # The user may want us to use some other class (hopefully a + # custom subclass) instead of the one we'd use normally. + container = cast( + Type[NavigableString], self.element_classes.get(container, container) + ) + + # On top of that, we may be inside a tag that needs a special + # container class. + if self.string_container_stack and container is NavigableString: + container = self.builder.string_containers.get( + self.string_container_stack[-1].name, container + ) + return container + + def new_string( + self, s: str, subclass: Optional[Type[NavigableString]] = None + ) -> NavigableString: + """Create a new `NavigableString` associated with this `BeautifulSoup` + object. + + :param s: The string content of the `NavigableString` + :param subclass: The subclass of `NavigableString`, if any, to + use. If a document is being processed, an appropriate + subclass for the current location in the document will + be determined automatically. + """ + container = self.string_container(subclass) + return container(s) + + def insert_before(self, *args: _InsertableElement) -> List[PageElement]: + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError( + "BeautifulSoup objects don't support insert_before()." + ) + + def insert_after(self, *args: _InsertableElement) -> List[PageElement]: + """This method is part of the PageElement API, but `BeautifulSoup` doesn't implement + it because there is nothing before or after it in the parse tree. + """ + raise NotImplementedError("BeautifulSoup objects don't support insert_after().") + + def popTag(self) -> Optional[Tag]: + """Internal method called by _popToTag when a tag is closed. + + :meta private: + """ + if not self.tagStack: + # Nothing to pop. This shouldn't happen. + return None + tag = self.tagStack.pop() + if tag.name in self.open_tag_counter: + self.open_tag_counter[tag.name] -= 1 + if ( + self.preserve_whitespace_tag_stack + and tag == self.preserve_whitespace_tag_stack[-1] + ): + self.preserve_whitespace_tag_stack.pop() + if self.string_container_stack and tag == self.string_container_stack[-1]: + self.string_container_stack.pop() + # print("Pop", tag.name) + if self.tagStack: + self.currentTag = self.tagStack[-1] + return self.currentTag + + def pushTag(self, tag: Tag) -> None: + """Internal method called by handle_starttag when a tag is opened. + + :meta private: + """ + # print("Push", tag.name) + if self.currentTag is not None: + self.currentTag.contents.append(tag) + self.tagStack.append(tag) + self.currentTag = self.tagStack[-1] + if tag.name != self.ROOT_TAG_NAME: + self.open_tag_counter[tag.name] += 1 + if tag.name in self.builder.preserve_whitespace_tags: + self.preserve_whitespace_tag_stack.append(tag) + if tag.name in self.builder.string_containers: + self.string_container_stack.append(tag) + + def endData(self, containerClass: Optional[Type[NavigableString]] = None) -> None: + """Method called by the TreeBuilder when the end of a data segment + occurs. + + :param containerClass: The class to use when incorporating the + data segment into the parse tree. + + :meta private: + """ + if self.current_data: + current_data = "".join(self.current_data) + # If whitespace is not preserved, and this string contains + # nothing but ASCII spaces, replace it with a single space + # or newline. + if not self.preserve_whitespace_tag_stack: + strippable = True + for i in current_data: + if i not in self.ASCII_SPACES: + strippable = False + break + if strippable: + if "\n" in current_data: + current_data = "\n" + else: + current_data = " " + + # Reset the data collector. + self.current_data = [] + + # Should we add this string to the tree at all? + if ( + self.parse_only + and len(self.tagStack) <= 1 + and (not self.parse_only.allow_string_creation(current_data)) + ): + return + + containerClass = self.string_container(containerClass) + o = containerClass(current_data) + self.object_was_parsed(o) + + def object_was_parsed( + self, + o: PageElement, + parent: Optional[Tag] = None, + most_recent_element: Optional[PageElement] = None, + ) -> None: + """Method called by the TreeBuilder to integrate an object into the + parse tree. + + :meta private: + """ + if parent is None: + parent = self.currentTag + assert parent is not None + previous_element: Optional[PageElement] + if most_recent_element is not None: + previous_element = most_recent_element + else: + previous_element = self._most_recent_element + + next_element = previous_sibling = next_sibling = None + if isinstance(o, Tag): + next_element = o.next_element + next_sibling = o.next_sibling + previous_sibling = o.previous_sibling + if previous_element is None: + previous_element = o.previous_element + + fix = parent.next_element is not None + + o.setup(parent, previous_element, next_element, previous_sibling, next_sibling) + + self._most_recent_element = o + parent.contents.append(o) + + # Check if we are inserting into an already parsed node. + if fix: + self._linkage_fixer(parent) + + def _linkage_fixer(self, el: Tag) -> None: + """Make sure linkage of this fragment is sound.""" + + first = el.contents[0] + child = el.contents[-1] + descendant: PageElement = child + + if child is first and el.parent is not None: + # Parent should be linked to first child + el.next_element = child + # We are no longer linked to whatever this element is + prev_el = child.previous_element + if prev_el is not None and prev_el is not el: + prev_el.next_element = None + # First child should be linked to the parent, and no previous siblings. + child.previous_element = el + child.previous_sibling = None + + # We have no sibling as we've been appended as the last. + child.next_sibling = None + + # This index is a tag, dig deeper for a "last descendant" + if isinstance(child, Tag) and child.contents: + # _last_decendant is typed as returning Optional[PageElement], + # but the value can't be None here, because el is a Tag + # which we know has contents. + descendant = cast(PageElement, child._last_descendant(False)) + + # As the final step, link last descendant. It should be linked + # to the parent's next sibling (if found), else walk up the chain + # and find a parent with a sibling. It should have no next sibling. + descendant.next_element = None + descendant.next_sibling = None + + target: Optional[Tag] = el + while True: + if target is None: + break + elif target.next_sibling is not None: + descendant.next_element = target.next_sibling + target.next_sibling.previous_element = child + break + target = target.parent + + def _popToTag( + self, name: str, nsprefix: Optional[str] = None, inclusivePop: bool = True + ) -> Optional[Tag]: + """Pops the tag stack up to and including the most recent + instance of the given tag. + + If there are no open tags with the given name, nothing will be + popped. + + :param name: Pop up to the most recent tag with this name. + :param nsprefix: The namespace prefix that goes with `name`. + :param inclusivePop: It this is false, pops the tag stack up + to but *not* including the most recent instqance of the + given tag. + + :meta private: + """ + # print("Popping to %s" % name) + if name == self.ROOT_TAG_NAME: + # The BeautifulSoup object itself can never be popped. + return None + + most_recently_popped = None + + stack_size = len(self.tagStack) + for i in range(stack_size - 1, 0, -1): + if not self.open_tag_counter.get(name): + break + t = self.tagStack[i] + if name == t.name and nsprefix == t.prefix: + if inclusivePop: + most_recently_popped = self.popTag() + break + most_recently_popped = self.popTag() + + return most_recently_popped + + def handle_starttag( + self, + name: str, + namespace: Optional[str], + nsprefix: Optional[str], + attrs: _RawAttributeValues, + sourceline: Optional[int] = None, + sourcepos: Optional[int] = None, + namespaces: Optional[Dict[str, str]] = None, + ) -> Optional[Tag]: + """Called by the tree builder when a new tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + :param attrs: A dictionary of attribute values. Note that + attribute values are expected to be simple strings; processing + of multi-valued attributes such as "class" comes later. + :param sourceline: The line number where this tag was found in its + source document. + :param sourcepos: The character position within `sourceline` where this + tag was found. + :param namespaces: A dictionary of all namespace prefix mappings + currently in scope in the document. + + If this method returns None, the tag was rejected by an active + `ElementFilter`. You should proceed as if the tag had not occurred + in the document. For instance, if this was a self-closing tag, + don't call handle_endtag. + + :meta private: + """ + # print("Start tag %s: %s" % (name, attrs)) + self.endData() + + if ( + self.parse_only + and len(self.tagStack) <= 1 + and not self.parse_only.allow_tag_creation(nsprefix, name, attrs) + ): + return None + + tag_class = self.element_classes.get(Tag, Tag) + # Assume that this is either Tag or a subclass of Tag. If not, + # the user brought type-unsafety upon themselves. + tag_class = cast(Type[Tag], tag_class) + tag = tag_class( + self, + self.builder, + name, + namespace, + nsprefix, + attrs, + self.currentTag, + self._most_recent_element, + sourceline=sourceline, + sourcepos=sourcepos, + namespaces=namespaces, + ) + if tag is None: + return tag + if self._most_recent_element is not None: + self._most_recent_element.next_element = tag + self._most_recent_element = tag + self.pushTag(tag) + return tag + + def handle_endtag(self, name: str, nsprefix: Optional[str] = None) -> None: + """Called by the tree builder when an ending tag is encountered. + + :param name: Name of the tag. + :param nsprefix: Namespace prefix for the tag. + + :meta private: + """ + # print("End tag: " + name) + self.endData() + self._popToTag(name, nsprefix) + + def handle_data(self, data: str) -> None: + """Called by the tree builder when a chunk of textual data is + encountered. + + :meta private: + """ + self.current_data.append(data) + + def decode( + self, + indent_level: Optional[int] = None, + eventual_encoding: _Encoding = DEFAULT_OUTPUT_ENCODING, + formatter: Union[Formatter, str] = "minimal", + iterator: Optional[Iterator[PageElement]] = None, + **kwargs: Any, + ) -> str: + """Returns a string representation of the parse tree + as a full HTML or XML document. + + :param indent_level: Each line of the rendering will be + indented this many levels. (The ``formatter`` decides what a + 'level' means, in terms of spaces or other characters + output.) This is used internally in recursive calls while + pretty-printing. + :param eventual_encoding: The encoding of the final document. + If this is None, the document will be a Unicode string. + :param formatter: Either a `Formatter` object, or a string naming one of + the standard formatters. + :param iterator: The iterator to use when navigating over the + parse tree. This is only used by `Tag.decode_contents` and + you probably won't need to use it. + """ + if self.is_xml: + # Print the XML declaration + encoding_part = "" + declared_encoding: Optional[str] = eventual_encoding + if eventual_encoding in PYTHON_SPECIFIC_ENCODINGS: + # This is a special Python encoding; it can't actually + # go into an XML document because it means nothing + # outside of Python. + declared_encoding = None + if declared_encoding is not None: + encoding_part = ' encoding="%s"' % declared_encoding + prefix = '\n' % encoding_part + else: + prefix = "" + + # Prior to 4.13.0, the first argument to this method was a + # bool called pretty_print, which gave the method a different + # signature from its superclass implementation, Tag.decode. + # + # The signatures of the two methods now match, but just in + # case someone is still passing a boolean in as the first + # argument to this method (or a keyword argument with the old + # name), we can handle it and put out a DeprecationWarning. + warning: Optional[str] = None + if isinstance(indent_level, bool): + if indent_level is True: + indent_level = 0 + elif indent_level is False: + indent_level = None + warning = f"As of 4.13.0, the first argument to BeautifulSoup.decode has been changed from bool to int, to match Tag.decode. Pass in a value of {indent_level} instead." + else: + pretty_print = kwargs.pop("pretty_print", None) + assert not kwargs + if pretty_print is not None: + if pretty_print is True: + indent_level = 0 + elif pretty_print is False: + indent_level = None + warning = f"As of 4.13.0, the pretty_print argument to BeautifulSoup.decode has been removed, to match Tag.decode. Pass in a value of indent_level={indent_level} instead." + + if warning: + warnings.warn(warning, DeprecationWarning, stacklevel=2) + elif indent_level is False or pretty_print is False: + indent_level = None + return prefix + super(BeautifulSoup, self).decode( + indent_level, eventual_encoding, formatter, iterator + ) + + +# Aliases to make it easier to get started quickly, e.g. 'from bs4 import _soup' +_s = BeautifulSoup +_soup = BeautifulSoup + + +class BeautifulStoneSoup(BeautifulSoup): + """Deprecated interface to an XML parser.""" + + def __init__(self, *args: Any, **kwargs: Any): + kwargs["features"] = "xml" + warnings.warn( + "The BeautifulStoneSoup class was deprecated in version 4.0.0. Instead of using " + 'it, pass features="xml" into the BeautifulSoup constructor.', + DeprecationWarning, + stacklevel=2, + ) + super(BeautifulStoneSoup, self).__init__(*args, **kwargs) + + +# If this file is run as a script, act as an HTML pretty-printer. +if __name__ == "__main__": + import sys + + soup = BeautifulSoup(sys.stdin) + print((soup.prettify())) diff --git a/llmlab/lib/python3.12/site-packages/bs4/__pycache__/__init__.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1966134a0cd0cc7f17fa85093145ceb48d0e53d4 GIT binary patch literal 39628 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/__pycache__/_deprecation.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/__pycache__/_deprecation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c563504f280275f97d881e274b725dbd860d0dbf GIT binary patch literal 3744 zcmb7`OKcm*8GvVBe2IEmjuqLFr%7vzutYkxQ5lNi#)%JU9!gOeupuO%R@@=E@^Y7* zT}q*CzwfDb-Uuz~83Lyo#NKrd_fB5ZvqkX~|QAUA1s>i^I3>DX>E z!2a{tdHgf~_y040@9$3#NF#sys<03z&t+Dg zR&3YPmn=qg+n^=AN^?csE-<=kdPS$=(N&$>rd>$W%TB^}JX&!X^@04x=VGs>|AGQdZox<1%q)n=Wqt?oF!m1htZ&-PC3(E(2veJ)UA}u4u=Iz%c4t+ z7EG86H2_8aPn(`izx?tPbxj!4)pRCdu)Jxb;&ky*Zn|62s>(i%aPM^tKT+AlEMtJ5@a-dwYt3m8_-LmlbgP3C( zSz9kb$!4ozDY^m&2lmS;IH;L4$g#fv0fOK^J;sv);oHhq#|oqFIgs7+OYv0&*SD&#bXpVKs_)B zpaNzVR$kI`*MTB~=A2R)cw90q)2k*D6w+*oc{(j~b4B;qtY``%oOu;)=K$<>0?#9d z;M*^P_(XvXxBo7;x7+RwURaa=ObodufmCV=NcAsKuf1tQyBE3JJXDEz(bmXyQj_jB z=Yvf~4+eS_T${L*%Q4r*Ep{*f{T=W>uSyRF({%FJtZadg8FUF6CQ@{InqF@DA~c4G zH4RG-r1aOg-nJAZzz=iRE$|>~TMc4OzjFf>OTkEM3c%rN=#oLS0EY)hpHc%A-H)UB zIP$@9M=oxcZftBE%x8*DiDmKyuDjDYJ!4s=EKoP?G1tQilrxsOlnI#yS2&Y#O^;2N zK_R`s+{}`DE|YC-7z0YV8fZG&e~q@=nUNJu=?j*V(=GR6T2zmrDzAa~&jxuEA@Sjx z{k8tRfvNhn`kOn>ZgF?Pf4Ah@6~DCNudMpX4<05b_KuAGJF3PLj}m0)$j9ETYYzrb z_^}iFFbfH^72T?^xm>s1+k7lTj~~PbG9e2}l$!b@_>kA77CA@=?}G)`UbxEPyq-n{ zPeLEwk75ADAc`RnDU~DCd=$lD5JA*!npERQu<+x+h1X1XYGzvWhl8cLrRHz;de~%shB6NKYKKCsU2S7}cLD%Y9R~mbbh<50e9Nu_asLT_$K$c z>nFV~OdAj^PX1xF87}IoKRB}!xj#7L$7VucC4njb39f*#u><1x)79gX(DN(~!5ssU zjYw2GAJTUI-b)DG`Ojba4zq65fO<> zeETgStpij5KF8Auc@R$4oK0ju9(wsn?~^V^Xa#I!O{CrnT_!boodEPw2t7Xuow|c< z5X*`eRyHfbZc6J?{}lA)DHP%o?TxlU5?`6w=Hm(%{$iof!qU-`)Y=ywf5hA+tvhhE$}dJOKx z{()~2WOVG-sDEhk_H*|SP5Q~nkZ>i43+Hki%MG+uu9scGJnUU;E7Q9-H1r~PY8Z{< zZN1kfp1rTvaR;w}`0oaJ7$3QLymtK7=!5tK1l)M)jsiXrPu+7x_BlrFcnaci;<)$? zPBL`Nj~#8fBTnW}eKEg}Sz|US4et#M zHx$fYpkaP0E%JYA{afx9`*?n9`M&o2z6MEo96&_L4zyIW4$v+ZhDY2Evl4Co68)rAR3Kk3anBIEZ!vY0W_u%rhz@BH-1w)Hg#)wzFsn=$m=pdvE5w zH=IZP)ZQLM@O1z9%jVyP5c-7*&ByCZjv5?7@6cnUAjMTgs!MdKoXDwe(e0ufSL9WX z=uy3*SM`ZL)i3(hfEZANVo(i2;7z{g$eRJ+73H7thJZn0bK z5qs2Lu~+RA`@qJ%lAlQdJj^Uc7#DCXVoVA;Qk+R4Ci!p-$DLIL#-j!%m5-OgGAIOXtX7~kXAC-E7FKg;-Dn^*eqfWwb5 zzMt`4rEk-P#~n?YX$BlkuN(?o3z9yp;n&oqPfF0AftPTj|yif5R`kYka-=bYUp z7(d+N&pUjU@gojDfdhDgou7S9Ii`&{+AL_ZC$y7H8)w={@dA?sCix(?NoR*C#wYAG zlu>rN(~L_pE`+BUH^aCT<&-nxMJAo4Qgtjn{x29&+HHkNMKcO2mhxLT|3Y3bV#~iu zN=7MPDq4X@)iRzd7GymgwA^!A)$%XM#UiufZx-@~#ofJc`R^K-FwVCum&*lh)AHXh z8-v|Jl4P)q#0T+xd zOoY{{u~pK>bYZj$5EhxbAoZzfeyXVdddPXP_0el3#pcY_X;rVlj0KaNyWL1O(N?Pc{x`ssuH|M z69(1|D!@EfEUf3stQOPR3sX70U|@)vMXBf3^_iSxRO#E5Emt94ER+1!>%{*)f~;*a zL*wuOY@?qeLq{+{c^AbKpS2xv$QAnhV?7<6hb5CPEgmF?I0_2~cE*s-}neeInO zV+k?};!2v!X44_dFG(7_;*w+qB}pwQl_H(DNzxxGa?#QFBuOddfp){$Snh&mkTzI? z&<__$09bx_!^#+rm82*~LuR|MP{{xlDNMjm{~f>^^pSUa{EasB#r2PF&NF=2A8oKv zNZRA{B{u#X2=65SG;-ttn}#2GI}Z88ZqMKO#E~0>fAV%RY;mhox~t_&DxAx*OkPyV zkkOj_(wPUOMNlgAwgy{M-RhEB7krh#3;W7yKV}}UEm`4XvDs3hu+MjpELK{+O;tDD zvDGM88+kqJD4()E^At*$5n7JNUFBIu_^tCZtLL|*PP(9kknZV?AeYmGZpEnceFCi@ z4^81j3uBS#q=&B44e98R4((^n9u}2ObhKsJ$Zy@MXnER5NgwqIOVHU)@m8;7H^b9x zr!+6?v`xwdjWy=}&xq!ZkVgUfaUHK0ZqODFi6c4+IHOU^lFt&N?V`0$3sFJy~pjXV^a@~l^(w~-8;cS@41X(dCZN2yB^p*NCbDdZ?jQn)~2io!Gn+P26=3YREcra&7C zxe8$M>!nhWd_m=F6zEr-T&M6Qg|8^wpfE>ap27l!n-mr)+@f&0WBlr$wOi4bWEr%y z>*;@nKgSKX%jNnc@GkD(2;fsN1b~|GaS-w0Pn^%={e%D-y@>1i4;ONc?nREkXcSro z*VCXxV-&@bd($;fjqE4izx=>`xcHZVnVhSS%x`z@L=VtB^qOdFH@|mr_uG0Ty&Zge z_W-4#T}6hr18=V$puvV0MH73`dgQ#VJP*qFsEN9E(g!F3+Tr+i``hXPiosk+nW>q5 z)l4na<2Owd-hmZv0zaOqEt}WwnVEa_u_Y5lcY$AObfHAbMBO{EWfE5PEVvqOFZcELfBf+1^YWfKSIe2#mdtZY z_0+P7`gb9!Wms)2Q@d|oe_&=F)X%P&D6*SAKx-`8Lw<1gj(O%g1a{0*>3f(69Wv=C;Tu&1H;sqvcIoR~Am=jzFM6ZP%DVa-Fm n2IFS@Ry}%qJM{L+0lIw{AFGAx@uug@;m|Za*ngmD_J#W|4RGYJ literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/__pycache__/_warnings.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/__pycache__/_warnings.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaf201048fad06eff84ec29bc9657b051cb8a191 GIT binary patch literal 5597 zcmb_gTW=f36<*#%ine3JPF&P*fQe8+WJ^)KqCgr4P+Qk_VJU`XH>rAIhPy**s=Y8X zyQ1l*JfuLM3O_aZ3qk%s(f)uw6b14czUH}rQmHR_>UYlUlA@~EX&nMwE@$U*=FInf z=bZifg$qp&pUZ#ybU3{1d7sjs;d%!js*U`?wZP%t(Z)M6_ z6>O&Wq_N7p>1KWW#|L|=SVCxPGZl#Oo{GhfmCRB-$ikf@8;Lz>MVg2qO@ik#6(gPo zjZJ}1W|df97bBDOWj~yVzVaot#Yxd|j2Y}m`FfzSgpNguh5aP9smc5_F|+sFzMgs%;A^28ls$ z4O1pIRgq||thU@v+IFSg6%XiHW-}RLIc?)L%*ne7Rn!svEERenCP^ktMms=fKM9mb zVj<%MJ2Lsi9f5_gNhtz77$~FSR2*oNVq&3U+$C{@wvN!Lh~$L*cd~EpT^R>(<(@oH z^LfHax7nmq;^%Pj4Ke*orb$??tN%xZYd)@DRcf;yb zt&gO?FNex*^zHXIdNTr!CWdIo7h2rDgv;-}&&uUmV_ISnPHE;;vAv?!C;-$jNHP4M#H25(GoPBWfKoQ)I}0#6wdkKdcwpR2ohDj?O7?rAFVkS49x1ZwMOPf}ahm4QETuCLJkp6>dl9a;`-x zNbArV`QS5L47Vfsl$>MD6WGFK-RY&D-MM>ndvoh%aSGe*Yn7%ZqfO zoaA&ULAm1@x?IE8Zs9^%O9ffW`Ns9eyKg+%Ir19#ceT9y+v?$xckbF}^~&i1lvzY6T$qgM&Rrlkm-GyQS$fP${0{Q}L4aFSQZ zIA7*g5v*r?U;^MN(lyaSG#p5zjQ|7XMnDhf-4<`riaA040)pH@$uQ4Bakz-bnBFnX zB@p?t#d5?UVjn6}E`)*CO}s>jXb6KZhb@t5v1eyibc$VTrPU_p^I z?8nI%GlJAJduZL<9HtDkffFB88Z4TeIC2MPN?{|p0b@IO@qnb#qH14EAx)&JM&WQ3zKBgpXBK@or_M{GXcGtkPx7+Jb^wN(q9R+&z}0JeEvG|nJzmg`OL2@ z{+rL#Z@b;#f)t71{6(RA^T9PK1^VfQok^U^M>$KYQL29Mt78v8$5$Jr#s}Y``^NFrS4vACf8&S89)6E+moAs8AGdz= Y=ieNAxI6ylMf`pF+yD0P%gM)o0Hb`=y8r+H literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/__pycache__/css.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/__pycache__/css.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c04d7bdb3cf0e1bd777478af2e55071e5f37a60d GIT binary patch literal 14423 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 c@#%&=fO`@iUQ{!o&BL4@{8QIRXvCP_Li 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/__pycache__/diagnose.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/__pycache__/diagnose.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..40b6f75d2f28a2719311b15d73a4b760b3f3c967 GIT binary patch literal 12652 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/__pycache__/element.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/__pycache__/element.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..092eb03005ff844f7543472cdf62f0558e7548b6 GIT binary patch literal 107378 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/__pycache__/filter.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/__pycache__/filter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c5c10e9aa64495c401be100db757a83a56767df GIT binary patch literal 28615 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 WcO#hB<1abHN9K?HM4&fY;{OXHHYjcY literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/__pycache__/formatter.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/__pycache__/formatter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8b130ac2666a7a0b7ee6d9884ad79bc2692ef135 GIT binary patch literal 10528 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/_deprecation.py b/llmlab/lib/python3.12/site-packages/bs4/_deprecation.py new file mode 100644 index 0000000..a0d7fdc --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/_deprecation.py @@ -0,0 +1,80 @@ +"""Helper functions for deprecation. + +This interface is itself unstable and may change without warning. Do +not use these functions yourself, even as a joke. The underscores are +there for a reason. No support will be given. + +In particular, most of this will go away without warning once +Beautiful Soup drops support for Python 3.11, since Python 3.12 +defines a `@typing.deprecated() +decorator. `_ +""" + +import functools +import warnings + +from typing import ( + Any, + Callable, +) + + +def _deprecated_alias(old_name: str, new_name: str, version: str): + """Alias one attribute name to another for backward compatibility + + :meta private: + """ + + @property + def alias(self) -> Any: + ":meta private:" + warnings.warn( + f"Access to deprecated property {old_name}. (Replaced by {new_name}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return getattr(self, new_name) + + @alias.setter + def alias(self, value: str) -> None: + ":meta private:" + warnings.warn( + f"Write to deprecated property {old_name}. (Replaced by {new_name}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return setattr(self, new_name, value) + + return alias + + +def _deprecated_function_alias( + old_name: str, new_name: str, version: str +) -> Callable[[Any], Any]: + def alias(self, *args: Any, **kwargs: Any) -> Any: + ":meta private:" + warnings.warn( + f"Call to deprecated method {old_name}. (Replaced by {new_name}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return getattr(self, new_name)(*args, **kwargs) + + return alias + + +def _deprecated(replaced_by: str, version: str) -> Callable: + def deprecate(func: Callable) -> Callable: + @functools.wraps(func) + def with_warning(*args: Any, **kwargs: Any) -> Any: + ":meta private:" + warnings.warn( + f"Call to deprecated method {func.__name__}. (Replaced by {replaced_by}) -- Deprecated since version {version}.", + DeprecationWarning, + stacklevel=2, + ) + return func(*args, **kwargs) + + return with_warning + + return deprecate diff --git a/llmlab/lib/python3.12/site-packages/bs4/_typing.py b/llmlab/lib/python3.12/site-packages/bs4/_typing.py new file mode 100644 index 0000000..ac4ec34 --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/_typing.py @@ -0,0 +1,196 @@ +# Custom type aliases used throughout Beautiful Soup to improve readability. + +# Notes on improvements to the type system in newer versions of Python +# that can be used once Beautiful Soup drops support for older +# versions: +# +# * ClassVar can be put on class variables now. +# * In 3.10, x|y is an accepted shorthand for Union[x,y]. +# * In 3.10, TypeAlias gains capabilities that can be used to +# improve the tree matching types (I don't remember what, exactly). +# * In 3.9 it's possible to specialize the re.Match type, +# e.g. re.Match[str]. In 3.8 there's a typing.re namespace for this, +# but it's removed in 3.12, so to support the widest possible set of +# versions I'm not using it. + +from typing_extensions import ( + runtime_checkable, + Protocol, + TypeAlias, +) +from typing import ( + Any, + Callable, + Dict, + IO, + Iterable, + Mapping, + Optional, + Pattern, + TYPE_CHECKING, + Union, +) + +if TYPE_CHECKING: + from bs4.element import ( + AttributeValueList, + NamespacedAttribute, + NavigableString, + PageElement, + ResultSet, + Tag, + ) + + +@runtime_checkable +class _RegularExpressionProtocol(Protocol): + """A protocol object which can accept either Python's built-in + `re.Pattern` objects, or the similar ``Regex`` objects defined by the + third-party ``regex`` package. + """ + + def search( + self, string: str, pos: int = ..., endpos: int = ... + ) -> Optional[Any]: ... + + @property + def pattern(self) -> str: ... + + +# Aliases for markup in various stages of processing. +# +#: The rawest form of markup: either a string, bytestring, or an open filehandle. +_IncomingMarkup: TypeAlias = Union[str, bytes, IO[str], IO[bytes]] + +#: Markup that is in memory but has (potentially) yet to be converted +#: to Unicode. +_RawMarkup: TypeAlias = Union[str, bytes] + +# Aliases for character encodings +# + +#: A data encoding. +_Encoding: TypeAlias = str + +#: One or more data encodings. +_Encodings: TypeAlias = Iterable[_Encoding] + +# Aliases for XML namespaces +# + +#: The prefix for an XML namespace. +_NamespacePrefix: TypeAlias = str + +#: The URL of an XML namespace +_NamespaceURL: TypeAlias = str + +#: A mapping of prefixes to namespace URLs. +_NamespaceMapping: TypeAlias = Dict[_NamespacePrefix, _NamespaceURL] + +#: A mapping of namespace URLs to prefixes +_InvertedNamespaceMapping: TypeAlias = Dict[_NamespaceURL, _NamespacePrefix] + +# Aliases for the attribute values associated with HTML/XML tags. +# + +#: The value associated with an HTML or XML attribute. This is the +#: relatively unprocessed value Beautiful Soup expects to come from a +#: `TreeBuilder`. +_RawAttributeValue: TypeAlias = str + +#: A dictionary of names to `_RawAttributeValue` objects. This is how +#: Beautiful Soup expects a `TreeBuilder` to represent a tag's +#: attribute values. +_RawAttributeValues: TypeAlias = ( + "Mapping[Union[str, NamespacedAttribute], _RawAttributeValue]" +) + +#: An attribute value in its final form, as stored in the +# `Tag` class, after it has been processed and (in some cases) +# split into a list of strings. +_AttributeValue: TypeAlias = Union[str, "AttributeValueList"] + +#: A dictionary of names to :py:data:`_AttributeValue` objects. This is what +#: a tag's attributes look like after processing. +_AttributeValues: TypeAlias = Dict[str, _AttributeValue] + +#: The methods that deal with turning :py:data:`_RawAttributeValue` into +#: :py:data:`_AttributeValue` may be called several times, even after the values +#: are already processed (e.g. when cloning a tag), so they need to +#: be able to acommodate both possibilities. +_RawOrProcessedAttributeValues: TypeAlias = Union[_RawAttributeValues, _AttributeValues] + +#: A number of tree manipulation methods can take either a `PageElement` or a +#: normal Python string (which will be converted to a `NavigableString`). +_InsertableElement: TypeAlias = Union["PageElement", str] + +# Aliases to represent the many possibilities for matching bits of a +# parse tree. +# +# This is very complicated because we're applying a formal type system +# to some very DWIM code. The types we end up with will be the types +# of the arguments to the SoupStrainer constructor and (more +# familiarly to Beautiful Soup users) the find* methods. + +#: A function that takes a PageElement and returns a yes-or-no answer. +_PageElementMatchFunction: TypeAlias = Callable[["PageElement"], bool] + +#: A function that takes the raw parsed ingredients of a markup tag +#: and returns a yes-or-no answer. +# Not necessary at the moment. +# _AllowTagCreationFunction:TypeAlias = Callable[[Optional[str], str, Optional[_RawAttributeValues]], bool] + +#: A function that takes the raw parsed ingredients of a markup string node +#: and returns a yes-or-no answer. +# Not necessary at the moment. +# _AllowStringCreationFunction:TypeAlias = Callable[[Optional[str]], bool] + +#: A function that takes a `Tag` and returns a yes-or-no answer. +#: A `TagNameMatchRule` expects this kind of function, if you're +#: going to pass it a function. +_TagMatchFunction: TypeAlias = Callable[["Tag"], bool] + +#: A function that takes a single string and returns a yes-or-no +#: answer. An `AttributeValueMatchRule` expects this kind of function, if +#: you're going to pass it a function. So does a `StringMatchRule`. +_StringMatchFunction: TypeAlias = Callable[[str], bool] + +#: Either a tag name, an attribute value or a string can be matched +#: against a string, bytestring, regular expression, or a boolean. +_BaseStrainable: TypeAlias = Union[str, bytes, Pattern[str], bool] + +#: A tag can be matched either with the `_BaseStrainable` options, or +#: using a function that takes the `Tag` as its sole argument. +_BaseStrainableElement: TypeAlias = Union[_BaseStrainable, _TagMatchFunction] + +#: A tag's attribute vgalue can be matched either with the +#: `_BaseStrainable` options, or using a function that takes that +#: value as its sole argument. +_BaseStrainableAttribute: TypeAlias = Union[_BaseStrainable, _StringMatchFunction] + +#: A tag can be matched using either a single criterion or a list of +#: criteria. +_StrainableElement: TypeAlias = Union[ + _BaseStrainableElement, Iterable[_BaseStrainableElement] +] + +#: An attribute value can be matched using either a single criterion +#: or a list of criteria. +_StrainableAttribute: TypeAlias = Union[ + _BaseStrainableAttribute, Iterable[_BaseStrainableAttribute] +] + +#: An string can be matched using the same techniques as +#: an attribute value. +_StrainableString: TypeAlias = _StrainableAttribute + +#: A dictionary may be used to match against multiple attribute vlaues at once. +_StrainableAttributes: TypeAlias = Dict[str, _StrainableAttribute] + +#: Many Beautiful soup methods return a PageElement or an ResultSet of +#: PageElements. A PageElement is either a Tag or a NavigableString. +#: These convenience aliases make it easier for IDE users to see which methods +#: are available on the objects they're dealing with. +_OneElement: TypeAlias = Union["PageElement", "Tag", "NavigableString"] +_AtMostOneElement: TypeAlias = Optional[_OneElement] +_QueryResults: TypeAlias = "ResultSet[_OneElement]" diff --git a/llmlab/lib/python3.12/site-packages/bs4/_warnings.py b/llmlab/lib/python3.12/site-packages/bs4/_warnings.py new file mode 100644 index 0000000..4309473 --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/_warnings.py @@ -0,0 +1,98 @@ +"""Define some custom warnings.""" + + +class GuessedAtParserWarning(UserWarning): + """The warning issued when BeautifulSoup has to guess what parser to + use -- probably because no parser was specified in the constructor. + """ + + MESSAGE: str = """No parser was explicitly specified, so I'm using the best available %(markup_type)s parser for this system ("%(parser)s"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. + +The code that caused this warning is on line %(line_number)s of the file %(filename)s. To get rid of this warning, pass the additional argument 'features="%(parser)s"' to the BeautifulSoup constructor. +""" + + +class UnusualUsageWarning(UserWarning): + """A superclass for warnings issued when Beautiful Soup sees + something that is typically the result of a mistake in the calling + code, but might be intentional on the part of the user. If it is + in fact intentional, you can filter the individual warning class + to get rid of the warning. If you don't like Beautiful Soup + second-guessing what you are doing, you can filter the + UnusualUsageWarningclass itself and get rid of these entirely. + """ + + +class MarkupResemblesLocatorWarning(UnusualUsageWarning): + """The warning issued when BeautifulSoup is given 'markup' that + actually looks like a resource locator -- a URL or a path to a file + on disk. + """ + + #: :meta private: + GENERIC_MESSAGE: str = """ + +However, if you want to parse some data that happens to look like a %(what)s, then nothing has gone wrong: you are using Beautiful Soup correctly, and this warning is spurious and can be filtered. To make this warning go away, run this code before calling the BeautifulSoup constructor: + + from bs4 import MarkupResemblesLocatorWarning + import warnings + + warnings.filterwarnings("ignore", category=MarkupResemblesLocatorWarning) + """ + + URL_MESSAGE: str = ( + """The input passed in on this line looks more like a URL than HTML or XML. + +If you meant to use Beautiful Soup to parse the web page found at a certain URL, then something has gone wrong. You should use an Python package like 'requests' to fetch the content behind the URL. Once you have the content as a string, you can feed that string into Beautiful Soup.""" + + GENERIC_MESSAGE + ) + + FILENAME_MESSAGE: str = ( + """The input passed in on this line looks more like a filename than HTML or XML. + +If you meant to use Beautiful Soup to parse the contents of a file on disk, then something has gone wrong. You should open the file first, using code like this: + + filehandle = open(your filename) + +You can then feed the open filehandle into Beautiful Soup instead of using the filename.""" + + GENERIC_MESSAGE + ) + + +class AttributeResemblesVariableWarning(UnusualUsageWarning, SyntaxWarning): + """The warning issued when Beautiful Soup suspects a provided + attribute name may actually be the misspelled name of a Beautiful + Soup variable. Generally speaking, this is only used in cases like + "_class" where it's very unlikely the user would be referencing an + XML attribute with that name. + """ + + MESSAGE: str = """%(original)r is an unusual attribute name and is a common misspelling for %(autocorrect)r. + +If you meant %(autocorrect)r, change your code to use it, and this warning will go away. + +If you really did mean to check the %(original)r attribute, this warning is spurious and can be filtered. To make it go away, run this code before creating your BeautifulSoup object: + + from bs4 import AttributeResemblesVariableWarning + import warnings + + warnings.filterwarnings("ignore", category=AttributeResemblesVariableWarning) +""" + + +class XMLParsedAsHTMLWarning(UnusualUsageWarning): + """The warning issued when an HTML parser is used to parse + XML that is not (as far as we can tell) XHTML. + """ + + MESSAGE: str = """It looks like you're using an HTML parser to parse an XML document. + +Assuming this really is an XML document, what you're doing might work, but you should know that using an XML parser will be more reliable. To parse this document as XML, make sure you have the Python package 'lxml' installed, and pass the keyword argument `features="xml"` into the BeautifulSoup constructor. + +If you want or need to use an HTML parser on this document, you can make this warning go away by filtering it. To do that, run this code before calling the BeautifulSoup constructor: + + from bs4 import XMLParsedAsHTMLWarning + import warnings + + warnings.filterwarnings("ignore", category=XMLParsedAsHTMLWarning) +""" diff --git a/llmlab/lib/python3.12/site-packages/bs4/builder/__init__.py b/llmlab/lib/python3.12/site-packages/bs4/builder/__init__.py new file mode 100644 index 0000000..5f2b38d --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/builder/__init__.py @@ -0,0 +1,848 @@ +from __future__ import annotations + +# Use of this source code is governed by the MIT license. +__license__ = "MIT" + +from collections import defaultdict +import re +from types import ModuleType +from typing import ( + Any, + cast, + Dict, + Iterable, + List, + Optional, + Pattern, + Set, + Tuple, + Type, + TYPE_CHECKING, +) +import warnings +import sys +from bs4.element import ( + AttributeDict, + AttributeValueList, + CharsetMetaAttributeValue, + ContentMetaAttributeValue, + RubyParenthesisString, + RubyTextString, + Stylesheet, + Script, + TemplateString, + nonwhitespace_re, +) + +# Exceptions were moved to their own module in 4.13. Import here for +# backwards compatibility. +from bs4.exceptions import ParserRejectedMarkup + +from bs4._typing import ( + _AttributeValues, + _RawAttributeValue, +) + +from bs4._warnings import XMLParsedAsHTMLWarning + +if TYPE_CHECKING: + from bs4 import BeautifulSoup + from bs4.element import ( + NavigableString, + Tag, + ) + from bs4._typing import ( + _AttributeValue, + _Encoding, + _Encodings, + _RawOrProcessedAttributeValues, + _RawMarkup, + ) + +__all__ = [ + "HTMLTreeBuilder", + "SAXTreeBuilder", + "TreeBuilder", + "TreeBuilderRegistry", +] + +# Some useful features for a TreeBuilder to have. +FAST = "fast" +PERMISSIVE = "permissive" +STRICT = "strict" +XML = "xml" +HTML = "html" +HTML_5 = "html5" + +__all__ = [ + "TreeBuilderRegistry", + "TreeBuilder", + "HTMLTreeBuilder", + "DetectsXMLParsedAsHTML", + + "ParserRejectedMarkup", # backwards compatibility only as of 4.13.0 +] + +class TreeBuilderRegistry(object): + """A way of looking up TreeBuilder subclasses by their name or by desired + features. + """ + + builders_for_feature: Dict[str, List[Type[TreeBuilder]]] + builders: List[Type[TreeBuilder]] + + def __init__(self) -> None: + self.builders_for_feature = defaultdict(list) + self.builders = [] + + def register(self, treebuilder_class: type[TreeBuilder]) -> None: + """Register a treebuilder based on its advertised features. + + :param treebuilder_class: A subclass of `TreeBuilder`. its + `TreeBuilder.features` attribute should list its features. + """ + for feature in treebuilder_class.features: + self.builders_for_feature[feature].insert(0, treebuilder_class) + self.builders.insert(0, treebuilder_class) + + def lookup(self, *features: str) -> Optional[Type[TreeBuilder]]: + """Look up a TreeBuilder subclass with the desired features. + + :param features: A list of features to look for. If none are + provided, the most recently registered TreeBuilder subclass + will be used. + :return: A TreeBuilder subclass, or None if there's no + registered subclass with all the requested features. + """ + if len(self.builders) == 0: + # There are no builders at all. + return None + + if len(features) == 0: + # They didn't ask for any features. Give them the most + # recently registered builder. + return self.builders[0] + + # Go down the list of features in order, and eliminate any builders + # that don't match every feature. + feature_list = list(features) + feature_list.reverse() + candidates = None + candidate_set = None + while len(feature_list) > 0: + feature = feature_list.pop() + we_have_the_feature = self.builders_for_feature.get(feature, []) + if len(we_have_the_feature) > 0: + if candidates is None: + candidates = we_have_the_feature + candidate_set = set(candidates) + else: + # Eliminate any candidates that don't have this feature. + candidate_set = candidate_set.intersection(set(we_have_the_feature)) + + # The only valid candidates are the ones in candidate_set. + # Go through the original list of candidates and pick the first one + # that's in candidate_set. + if candidate_set is None or candidates is None: + return None + for candidate in candidates: + if candidate in candidate_set: + return candidate + return None + + +#: The `BeautifulSoup` constructor will take a list of features +#: and use it to look up `TreeBuilder` classes in this registry. +builder_registry: TreeBuilderRegistry = TreeBuilderRegistry() + + +class TreeBuilder(object): + """Turn a textual document into a Beautiful Soup object tree. + + This is an abstract superclass which smooths out the behavior of + different parser libraries into a single, unified interface. + + :param multi_valued_attributes: If this is set to None, the + TreeBuilder will not turn any values for attributes like + 'class' into lists. Setting this to a dictionary will + customize this behavior; look at :py:attr:`bs4.builder.HTMLTreeBuilder.DEFAULT_CDATA_LIST_ATTRIBUTES` + for an example. + + Internally, these are called "CDATA list attributes", but that + probably doesn't make sense to an end-user, so the argument name + is ``multi_valued_attributes``. + + :param preserve_whitespace_tags: A set of tags to treat + the way
 tags are treated in HTML. Tags in this set
+     are immune from pretty-printing; their contents will always be
+     output as-is.
+
+    :param string_containers: A dictionary mapping tag names to
+     the classes that should be instantiated to contain the textual
+     contents of those tags. The default is to use NavigableString
+     for every tag, no matter what the name. You can override the
+     default by changing :py:attr:`DEFAULT_STRING_CONTAINERS`.
+
+    :param store_line_numbers: If the parser keeps track of the line
+     numbers and positions of the original markup, that information
+     will, by default, be stored in each corresponding
+     :py:class:`bs4.element.Tag` object. You can turn this off by
+     passing store_line_numbers=False; then Tag.sourcepos and
+     Tag.sourceline will always be None. If the parser you're using
+     doesn't keep track of this information, then store_line_numbers
+     is irrelevant.
+
+    :param attribute_dict_class: The value of a multi-valued attribute
+      (such as HTML's 'class') willl be stored in an instance of this
+      class.  The default is Beautiful Soup's built-in
+      `AttributeValueList`, which is a normal Python list, and you
+      will probably never need to change it.
+    """
+
+    USE_DEFAULT: Any = object()  #: :meta private:
+
+    def __init__(
+        self,
+        multi_valued_attributes: Dict[str, Set[str]] = USE_DEFAULT,
+        preserve_whitespace_tags: Set[str] = USE_DEFAULT,
+        store_line_numbers: bool = USE_DEFAULT,
+        string_containers: Dict[str, Type[NavigableString]] = USE_DEFAULT,
+        empty_element_tags: Set[str] = USE_DEFAULT,
+        attribute_dict_class: Type[AttributeDict] = AttributeDict,
+        attribute_value_list_class: Type[AttributeValueList] = AttributeValueList,
+    ):
+        self.soup = None
+        if multi_valued_attributes is self.USE_DEFAULT:
+            multi_valued_attributes = self.DEFAULT_CDATA_LIST_ATTRIBUTES
+        self.cdata_list_attributes = multi_valued_attributes
+        if preserve_whitespace_tags is self.USE_DEFAULT:
+            preserve_whitespace_tags = self.DEFAULT_PRESERVE_WHITESPACE_TAGS
+        self.preserve_whitespace_tags = preserve_whitespace_tags
+        if empty_element_tags is self.USE_DEFAULT:
+            self.empty_element_tags = self.DEFAULT_EMPTY_ELEMENT_TAGS
+        else:
+            self.empty_element_tags = empty_element_tags
+        # TODO: store_line_numbers is probably irrelevant now that
+        # the behavior of sourceline and sourcepos has been made consistent
+        # everywhere.
+        if store_line_numbers == self.USE_DEFAULT:
+            store_line_numbers = self.TRACKS_LINE_NUMBERS
+        self.store_line_numbers = store_line_numbers
+        if string_containers == self.USE_DEFAULT:
+            string_containers = self.DEFAULT_STRING_CONTAINERS
+        self.string_containers = string_containers
+        self.attribute_dict_class = attribute_dict_class
+        self.attribute_value_list_class = attribute_value_list_class
+
+    NAME: str = "[Unknown tree builder]"
+    ALTERNATE_NAMES: Iterable[str] = []
+    features: Iterable[str] = []
+
+    is_xml: bool = False
+    picklable: bool = False
+
+    soup: Optional[BeautifulSoup]  #: :meta private:
+
+    #: A tag will be considered an empty-element
+    #: tag when and only when it has no contents.
+    empty_element_tags: Optional[Set[str]] = None  #: :meta private:
+    cdata_list_attributes: Dict[str, Set[str]]  #: :meta private:
+    preserve_whitespace_tags: Set[str]  #: :meta private:
+    string_containers: Dict[str, Type[NavigableString]]  #: :meta private:
+    tracks_line_numbers: bool  #: :meta private:
+
+    #: A value for these tag/attribute combinations is a space- or
+    #: comma-separated list of CDATA, rather than a single CDATA.
+    DEFAULT_CDATA_LIST_ATTRIBUTES: Dict[str, Set[str]] = defaultdict(set)
+
+    #: Whitespace should be preserved inside these tags.
+    DEFAULT_PRESERVE_WHITESPACE_TAGS: Set[str] = set()
+
+    #: The textual contents of tags with these names should be
+    #: instantiated with some class other than `bs4.element.NavigableString`.
+    DEFAULT_STRING_CONTAINERS: Dict[str, Type[bs4.element.NavigableString]] = {}
+
+    #: By default, tags are treated as empty-element tags if they have
+    #: no contents--that is, using XML rules. HTMLTreeBuilder
+    #: defines a different set of DEFAULT_EMPTY_ELEMENT_TAGS based on the
+    #: HTML 4 and HTML5 standards.
+    DEFAULT_EMPTY_ELEMENT_TAGS: Optional[Set[str]] = None
+
+    #: Most parsers don't keep track of line numbers.
+    TRACKS_LINE_NUMBERS: bool = False
+
+    def initialize_soup(self, soup: BeautifulSoup) -> None:
+        """The BeautifulSoup object has been initialized and is now
+        being associated with the TreeBuilder.
+
+        :param soup: A BeautifulSoup object.
+        """
+        self.soup = soup
+
+    def reset(self) -> None:
+        """Do any work necessary to reset the underlying parser
+        for a new document.
+
+        By default, this does nothing.
+        """
+        pass
+
+    def can_be_empty_element(self, tag_name: str) -> bool:
+        """Might a tag with this name be an empty-element tag?
+
+        The final markup may or may not actually present this tag as
+        self-closing.
+
+        For instance: an HTMLBuilder does not consider a 

tag to be + an empty-element tag (it's not in + HTMLBuilder.empty_element_tags). This means an empty

tag + will be presented as "

", not "

" or "

". + + The default implementation has no opinion about which tags are + empty-element tags, so a tag will be presented as an + empty-element tag if and only if it has no children. + "" will become "", and "bar" will + be left alone. + + :param tag_name: The name of a markup tag. + """ + if self.empty_element_tags is None: + return True + return tag_name in self.empty_element_tags + + def feed(self, markup: _RawMarkup) -> None: + """Run incoming markup through some parsing process.""" + raise NotImplementedError() + + def prepare_markup( + self, + markup: _RawMarkup, + user_specified_encoding: Optional[_Encoding] = None, + document_declared_encoding: Optional[_Encoding] = None, + exclude_encodings: Optional[_Encodings] = None, + ) -> Iterable[Tuple[_RawMarkup, Optional[_Encoding], Optional[_Encoding], bool]]: + """Run any preliminary steps necessary to make incoming markup + acceptable to the parser. + + :param markup: The markup that's about to be parsed. + :param user_specified_encoding: The user asked to try this encoding + to convert the markup into a Unicode string. + :param document_declared_encoding: The markup itself claims to be + in this encoding. NOTE: This argument is not used by the + calling code and can probably be removed. + :param exclude_encodings: The user asked *not* to try any of + these encodings. + + :yield: A series of 4-tuples: (markup, encoding, declared encoding, + has undergone character replacement) + + Each 4-tuple represents a strategy that the parser can try + to convert the document to Unicode and parse it. Each + strategy will be tried in turn. + + By default, the only strategy is to parse the markup + as-is. See `LXMLTreeBuilderForXML` and + `HTMLParserTreeBuilder` for implementations that take into + account the quirks of particular parsers. + + :meta private: + + """ + yield markup, None, None, False + + def test_fragment_to_document(self, fragment: str) -> str: + """Wrap an HTML fragment to make it look like a document. + + Different parsers do this differently. For instance, lxml + introduces an empty tag, and html5lib + doesn't. Abstracting this away lets us write simple tests + which run HTML fragments through the parser and compare the + results against other HTML fragments. + + This method should not be used outside of unit tests. + + :param fragment: A fragment of HTML. + :return: A full HTML document. + :meta private: + """ + return fragment + + def set_up_substitutions(self, tag: Tag) -> bool: + """Set up any substitutions that will need to be performed on + a `Tag` when it's output as a string. + + By default, this does nothing. See `HTMLTreeBuilder` for a + case where this is used. + + :return: Whether or not a substitution was performed. + :meta private: + """ + return False + + def _replace_cdata_list_attribute_values( + self, tag_name: str, attrs: _RawOrProcessedAttributeValues + ) -> _AttributeValues: + """When an attribute value is associated with a tag that can + have multiple values for that attribute, convert the string + value to a list of strings. + + Basically, replaces class="foo bar" with class=["foo", "bar"] + + NOTE: This method modifies its input in place. + + :param tag_name: The name of a tag. + :param attrs: A dictionary containing the tag's attributes. + Any appropriate attribute values will be modified in place. + :return: The modified dictionary that was originally passed in. + """ + + # First, cast the attrs dict to _AttributeValues. This might + # not be accurate yet, but it will be by the time this method + # returns. + modified_attrs = cast(_AttributeValues, attrs) + if not modified_attrs or not self.cdata_list_attributes: + # Nothing to do. + return modified_attrs + + # There is at least a possibility that we need to modify one of + # the attribute values. + universal: Set[str] = self.cdata_list_attributes.get("*", set()) + tag_specific = self.cdata_list_attributes.get(tag_name.lower(), None) + for attr in list(modified_attrs.keys()): + modified_value: _AttributeValue + if attr in universal or (tag_specific and attr in tag_specific): + # We have a "class"-type attribute whose string + # value is a whitespace-separated list of + # values. Split it into a list. + original_value: _AttributeValue = modified_attrs[attr] + if isinstance(original_value, _RawAttributeValue): + # This is a _RawAttributeValue (a string) that + # needs to be split and converted to a + # AttributeValueList so it can be an + # _AttributeValue. + modified_value = self.attribute_value_list_class( + nonwhitespace_re.findall(original_value) + ) + else: + # html5lib calls setAttributes twice for the + # same tag when rearranging the parse tree. On + # the second call the attribute value here is + # already a list. This can also happen when a + # Tag object is cloned. If this happens, leave + # the value alone rather than trying to split + # it again. + modified_value = original_value + modified_attrs[attr] = modified_value + return modified_attrs + + +class SAXTreeBuilder(TreeBuilder): + """A Beautiful Soup treebuilder that listens for SAX events. + + This is not currently used for anything, and it will be removed + soon. It was a good idea, but it wasn't properly integrated into the + rest of Beautiful Soup, so there have been long stretches where it + hasn't worked properly. + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + warnings.warn( + "The SAXTreeBuilder class was deprecated in 4.13.0 and will be removed soon thereafter. It is completely untested and probably doesn't work; do not use it.", + DeprecationWarning, + stacklevel=2, + ) + super(SAXTreeBuilder, self).__init__(*args, **kwargs) + + def feed(self, markup: _RawMarkup) -> None: + raise NotImplementedError() + + def close(self) -> None: + pass + + def startElement(self, name: str, attrs: Dict[str, str]) -> None: + attrs = AttributeDict((key[1], value) for key, value in list(attrs.items())) + # print("Start %s, %r" % (name, attrs)) + assert self.soup is not None + self.soup.handle_starttag(name, None, None, attrs) + + def endElement(self, name: str) -> None: + # print("End %s" % name) + assert self.soup is not None + self.soup.handle_endtag(name) + + def startElementNS( + self, nsTuple: Tuple[str, str], nodeName: str, attrs: Dict[str, str] + ) -> None: + # Throw away (ns, nodeName) for now. + self.startElement(nodeName, attrs) + + def endElementNS(self, nsTuple: Tuple[str, str], nodeName: str) -> None: + # Throw away (ns, nodeName) for now. + self.endElement(nodeName) + # handler.endElementNS((ns, node.nodeName), node.nodeName) + + def startPrefixMapping(self, prefix: str, nodeValue: str) -> None: + # Ignore the prefix for now. + pass + + def endPrefixMapping(self, prefix: str) -> None: + # Ignore the prefix for now. + # handler.endPrefixMapping(prefix) + pass + + def characters(self, content: str) -> None: + assert self.soup is not None + self.soup.handle_data(content) + + def startDocument(self) -> None: + pass + + def endDocument(self) -> None: + pass + + +class HTMLTreeBuilder(TreeBuilder): + """This TreeBuilder knows facts about HTML, such as which tags are treated + specially by the HTML standard. + """ + + #: Some HTML tags are defined as having no contents. Beautiful Soup + #: treats these specially. + DEFAULT_EMPTY_ELEMENT_TAGS: Set[str] = set( + [ + # These are from HTML5. + "area", + "base", + "br", + "col", + "embed", + "hr", + "img", + "input", + "keygen", + "link", + "menuitem", + "meta", + "param", + "source", + "track", + "wbr", + # These are from earlier versions of HTML and are removed in HTML5. + "basefont", + "bgsound", + "command", + "frame", + "image", + "isindex", + "nextid", + "spacer", + ] + ) + + #: The HTML standard defines these tags as block-level elements. Beautiful + #: Soup does not treat these elements differently from other elements, + #: but it may do so eventually, and this information is available if + #: you need to use it. + DEFAULT_BLOCK_ELEMENTS: Set[str] = set( + [ + "address", + "article", + "aside", + "blockquote", + "canvas", + "dd", + "div", + "dl", + "dt", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "hr", + "li", + "main", + "nav", + "noscript", + "ol", + "output", + "p", + "pre", + "section", + "table", + "tfoot", + "ul", + "video", + ] + ) + + #: These HTML tags need special treatment so they can be + #: represented by a string class other than `bs4.element.NavigableString`. + #: + #: For some of these tags, it's because the HTML standard defines + #: an unusual content model for them. I made this list by going + #: through the HTML spec + #: (https://html.spec.whatwg.org/#metadata-content) and looking for + #: "metadata content" elements that can contain strings. + #: + #: The Ruby tags ( and ) are here despite being normal + #: "phrasing content" tags, because the content they contain is + #: qualitatively different from other text in the document, and it + #: can be useful to be able to distinguish it. + #: + #: TODO: Arguably

foo

" + soup = self.soup(markup) + return doctype.encode("utf8"), soup + + def test_normal_doctypes(self): + """Make sure normal, everyday HTML doctypes are handled correctly.""" + self.assertDoctypeHandled("html") + self.assertDoctypeHandled( + 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"' + ) + + def test_empty_doctype(self): + soup = self.soup("") + doctype = soup.contents[0] + assert "" == doctype.strip() + + def test_mixed_case_doctype(self): + # A lowercase or mixed-case doctype becomes a Doctype. + for doctype_fragment in ("doctype", "DocType"): + doctype_str, soup = self._document_with_doctype("html", doctype_fragment) + + # Make sure a Doctype object was created and that the DOCTYPE + # is uppercase. + doctype = soup.contents[0] + assert doctype.__class__ == Doctype + assert doctype == "html" + assert soup.encode("utf8")[: len(doctype_str)] == b"" + + # Make sure that the doctype was correctly associated with the + # parse tree and that the rest of the document parsed. + assert soup.p.contents[0] == "foo" + + def test_public_doctype_with_url(self): + doctype = 'html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"' + self.assertDoctypeHandled(doctype) + + def test_system_doctype(self): + self.assertDoctypeHandled('foo SYSTEM "http://www.example.com/"') + + def test_namespaced_system_doctype(self): + # We can handle a namespaced doctype with a system ID. + self.assertDoctypeHandled('xsl:stylesheet SYSTEM "htmlent.dtd"') + + def test_namespaced_public_doctype(self): + # Test a namespaced doctype with a public id. + self.assertDoctypeHandled('xsl:stylesheet PUBLIC "htmlent.dtd"') + + def test_real_xhtml_document(self): + """A real XHTML document should come out more or less the same as it went in.""" + markup = b""" + + +Hello. +Goodbye. +""" + with warnings.catch_warnings(record=True) as w: + soup = self.soup(markup) + assert soup.encode("utf-8").replace(b"\n", b"") == markup.replace(b"\n", b"") + + # No warning was issued about parsing an XML document as HTML, + # because XHTML is both. + assert w == [] + + def test_namespaced_html(self): + # When a namespaced XML document is parsed as HTML it should + # be treated as HTML with weird tag names. + markup = b"""content""" + with warnings.catch_warnings(record=True) as w: + soup = self.soup(markup) + + assert 2 == len(soup.find_all("ns1:foo")) + + # n.b. no "you're parsing XML as HTML" warning was given + # because there was no XML declaration. + assert [] == w + + def test_detect_xml_parsed_as_html(self): + # A warning is issued when parsing an XML document as HTML, + # but basic stuff should still work. + markup = b"""string""" + with warnings.catch_warnings(record=True) as w: + soup = self.soup(markup) + assert soup.tag.string == "string" + [warning] = w + assert isinstance(warning.message, XMLParsedAsHTMLWarning) + assert str(warning.message) == XMLParsedAsHTMLWarning.MESSAGE + + # NOTE: the warning is not issued if the document appears to + # be XHTML (tested with test_real_xhtml_document in the + # superclass) or if there is no XML declaration (tested with + # test_namespaced_html in the superclass). + + def test_processing_instruction(self): + # We test both Unicode and bytestring to verify that + # process_markup correctly sets processing_instruction_class + # even when the markup is already Unicode and there is no + # need to process anything. + markup = """""" + soup = self.soup(markup) + assert markup == soup.decode() + + markup = b"""""" + soup = self.soup(markup) + assert markup == soup.encode("utf8") + + def test_deepcopy(self): + """Make sure you can copy the tree builder. + + This is important because the builder is part of a + BeautifulSoup object, and we want to be able to copy that. + """ + copy.deepcopy(self.default_builder) + + def test_p_tag_is_never_empty_element(self): + """A

tag is never designated as an empty-element tag. + + Even if the markup shows it as an empty-element tag, it + shouldn't be presented that way. + """ + soup = self.soup("

") + assert not soup.p.is_empty_element + assert str(soup.p) == "

" + + def test_unclosed_tags_get_closed(self): + """A tag that's not closed by the end of the document should be closed. + + This applies to all tags except empty-element tags. + """ + self.assert_soup("

", "

") + self.assert_soup("", "") + + self.assert_soup("
", "
") + + def test_br_is_always_empty_element_tag(self): + """A
tag is designated as an empty-element tag. + + Some parsers treat

as one
tag, some parsers as + two tags, but it should always be an empty-element tag. + """ + soup = self.soup("

") + assert soup.br.is_empty_element + assert str(soup.br) == "
" + + def test_nested_formatting_elements(self): + self.assert_soup("") + + def test_double_head(self): + html = """ + + +Ordinary HEAD element test + + + +Hello, world! + + +""" + soup = self.soup(html) + assert "text/javascript" == soup.find("script")["type"] + + def test_comment(self): + # Comments are represented as Comment objects. + markup = "

foobaz

" + self.assert_soup(markup) + + soup = self.soup(markup) + comment = soup.find(string="foobar") + assert comment.__class__ == Comment + + # The comment is properly integrated into the tree. + foo = soup.find(string="foo") + assert comment == foo.next_element + baz = soup.find(string="baz") + assert comment == baz.previous_element + + def test_preserved_whitespace_in_pre_and_textarea(self): + """Whitespace must be preserved in
 and \n"
+        self.assert_soup(pre_markup)
+        self.assert_soup(textarea_markup)
+
+        soup = self.soup(pre_markup)
+        assert soup.pre.prettify() == pre_markup
+
+        soup = self.soup(textarea_markup)
+        assert soup.textarea.prettify() == textarea_markup
+
+        soup = self.soup("")
+        assert soup.textarea.prettify() == "\n"
+
+    def test_nested_inline_elements(self):
+        """Inline elements can be nested indefinitely."""
+        b_tag = "Inside a B tag"
+        self.assert_soup(b_tag)
+
+        nested_b_tag = "

A nested tag

" + self.assert_soup(nested_b_tag) + + double_nested_b_tag = "

A doubly nested tag

" + self.assert_soup(double_nested_b_tag) + + def test_nested_block_level_elements(self): + """Block elements can be nested.""" + soup = self.soup("

Foo

") + blockquote = soup.blockquote + assert blockquote.p.b.string == "Foo" + assert blockquote.b.string == "Foo" + + def test_correctly_nested_tables(self): + """One table can go inside another one.""" + markup = ( + '' + "" + "" + ) + + self.assert_soup( + markup, + '
Here's another table:" + '' + "" + "
foo
Here\'s another table:' + '
foo
' + "
", + ) + + self.assert_soup( + "" + "" + "
Foo
Bar
Baz
" + ) + + def test_multivalued_attribute_with_whitespace(self): + # Whitespace separating the values of a multi-valued attribute + # should be ignored. + + markup = '
' + soup = self.soup(markup) + assert ["foo", "bar"] == soup.div["class"] + + # If you search by the literal name of the class it's like the whitespace + # wasn't there. + assert soup.div == soup.find("div", class_="foo bar") + + def test_deeply_nested_multivalued_attribute(self): + # html5lib can set the attributes of the same tag many times + # as it rearranges the tree. This has caused problems with + # multivalued attributes. + markup = '
' + soup = self.soup(markup) + assert ["css"] == soup.div.div["class"] + + def test_multivalued_attribute_on_html(self): + # html5lib uses a different API to set the attributes ot the + # tag. This has caused problems with multivalued + # attributes. + markup = '' + soup = self.soup(markup) + assert ["a", "b"] == soup.html["class"] + + def test_angle_brackets_in_attribute_values_are_escaped(self): + self.assert_soup('', '') + + def test_strings_resembling_character_entity_references(self): + # "&T" and "&p" look like incomplete character entities, but they are + # not. + self.assert_soup( + "

• AT&T is in the s&p 500

", + "

\u2022 AT&T is in the s&p 500

", + ) + + def test_apos_entity(self): + self.assert_soup( + "

Bob's Bar

", + "

Bob's Bar

", + ) + + def test_entities_in_foreign_document_encoding(self): + # “ and ” are invalid numeric entities referencing + # Windows-1252 characters. - references a character common + # to Windows-1252 and Unicode, and ☃ references a + # character only found in Unicode. + # + # All of these entities should be converted to Unicode + # characters. + markup = "

“Hello” -☃

" + soup = self.soup(markup) + assert "“Hello” -☃" == soup.p.string + + def test_entities_in_attributes_converted_to_unicode(self): + expect = '

' + self.assert_soup('

', expect) + self.assert_soup('

', expect) + self.assert_soup('

', expect) + self.assert_soup('

', expect) + + def test_entities_in_text_converted_to_unicode(self): + expect = "

pi\N{LATIN SMALL LETTER N WITH TILDE}ata

" + self.assert_soup("

piñata

", expect) + self.assert_soup("

piñata

", expect) + self.assert_soup("

piñata

", expect) + self.assert_soup("

piñata

", expect) + + def test_quot_entity_converted_to_quotation_mark(self): + self.assert_soup( + "

I said "good day!"

", '

I said "good day!"

' + ) + + def test_out_of_range_entity(self): + expect = "\N{REPLACEMENT CHARACTER}" + self.assert_soup("�", expect) + self.assert_soup("�", expect) + self.assert_soup("�", expect) + + def test_multipart_strings(self): + "Mostly to prevent a recurrence of a bug in the html5lib treebuilder." + soup = self.soup("

\nfoo

") + assert "p" == soup.h2.string.next_element.name + assert "p" == soup.p.name + self.assertConnectedness(soup) + + def test_invalid_html_entity(self): + # The html.parser treebuilder can't distinguish between an + # invalid HTML entity with a semicolon and an invalid HTML + # entity with no semicolon (see its subclass for the tested + # behavior). But the other treebuilders can. + markup = "

a &nosuchentity b

" + soup = self.soup(markup) + assert "

a &nosuchentity b

" == soup.p.decode() + + markup = "

a &nosuchentity; b

" + soup = self.soup(markup) + assert "

a &nosuchentity; b

" == soup.p.decode() + + def test_head_tag_between_head_and_body(self): + "Prevent recurrence of a bug in the html5lib treebuilder." + content = """ + + foo + +""" + soup = self.soup(content) + assert soup.html.body is not None + self.assertConnectedness(soup) + + def test_multiple_copies_of_a_tag(self): + "Prevent recurrence of a bug in the html5lib treebuilder." + content = """ + + + + + +""" + soup = self.soup(content) + self.assertConnectedness(soup.article) + + def test_basic_namespaces(self): + """Parsers don't need to *understand* namespaces, but at the + very least they should not choke on namespaces or lose + data.""" + + markup = b'4' + soup = self.soup(markup) + assert markup == soup.encode() + assert "http://www.w3.org/1999/xhtml" == soup.html["xmlns"] + assert "http://www.w3.org/1998/Math/MathML" == soup.html["xmlns:mathml"] + assert "http://www.w3.org/2000/svg" == soup.html["xmlns:svg"] + + def test_multivalued_attribute_value_becomes_list(self): + markup = b'' + soup = self.soup(markup) + assert ["foo", "bar"] == soup.a["class"] + + # + # Generally speaking, tests below this point are more tests of + # Beautiful Soup than tests of the tree builders. But parsers are + # weird, so we run these tests separately for every tree builder + # to detect any differences between them. + # + + def test_can_parse_unicode_document(self): + # A seemingly innocuous document... but it's in Unicode! And + # it contains characters that can't be represented in the + # encoding found in the declaration! The horror! + markup = 'Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + assert "Sacr\xe9 bleu!" == soup.body.string + + def test_soupstrainer(self): + """Parsers should be able to work with SoupStrainers.""" + strainer = SoupStrainer("b") + soup = self.soup("A bold statement", parse_only=strainer) + assert soup.decode() == "bold" + + def test_single_quote_attribute_values_become_double_quotes(self): + self.assert_soup("", '') + + def test_attribute_values_with_nested_quotes_are_left_alone(self): + text = """a""" + self.assert_soup(text) + + def test_attribute_values_with_double_nested_quotes_get_quoted(self): + text = """a""" + soup = self.soup(text) + soup.foo["attr"] = 'Brawls happen at "Bob\'s Bar"' + self.assert_soup( + soup.foo.decode(), + """a""", + ) + + def test_ampersand_in_attribute_value_gets_escaped(self): + self.assert_soup( + '', + '', + ) + + self.assert_soup( + 'foo', + 'foo', + ) + + def test_escaped_ampersand_in_attribute_value_is_left_alone(self): + self.assert_soup('') + + def test_entities_in_strings_converted_during_parsing(self): + # Both XML and HTML entities are converted to Unicode characters + # during parsing. + text = "

<<sacré bleu!>>

" + expected = ( + "

<<sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!>>

" + ) + self.assert_soup(text, expected) + + def test_smart_quotes_converted_on_the_way_in(self): + # Microsoft smart quotes are converted to Unicode characters during + # parsing. + quote = b"

\x91Foo\x92

" + soup = self.soup(quote, from_encoding="windows-1252") + assert ( + soup.p.string + == "\N{LEFT SINGLE QUOTATION MARK}Foo\N{RIGHT SINGLE QUOTATION MARK}" + ) + + def test_non_breaking_spaces_converted_on_the_way_in(self): + soup = self.soup("  ") + assert soup.a.string == "\N{NO-BREAK SPACE}" * 2 + + def test_entities_converted_on_the_way_out(self): + text = "

<<sacré bleu!>>

" + expected = "

<<sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!>>

".encode( + "utf-8" + ) + soup = self.soup(text) + assert soup.p.encode("utf-8") == expected + + def test_real_iso_8859_document(self): + # Smoke test of interrelated functionality, using an + # easy-to-understand document. + + # Here it is in Unicode. Note that it claims to be in ISO-8859-1. + unicode_html = '

Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!

' + + # That's because we're going to encode it into ISO-8859-1, + # and use that to test. + iso_latin_html = unicode_html.encode("iso-8859-1") + + # Parse the ISO-8859-1 HTML. + soup = self.soup(iso_latin_html) + + # Encode it to UTF-8. + result = soup.encode("utf-8") + + # What do we expect the result to look like? Well, it would + # look like unicode_html, except that the META tag would say + # UTF-8 instead of ISO-8859-1. + expected = unicode_html.replace("ISO-8859-1", "utf-8") + + # And, of course, it would be in UTF-8, not Unicode. + expected = expected.encode("utf-8") + + # Ta-da! + assert result == expected + + def test_real_shift_jis_document(self): + # Smoke test to make sure the parser can handle a document in + # Shift-JIS encoding, without choking. + shift_jis_html = ( + b"
"
+            b"\x82\xb1\x82\xea\x82\xcdShift-JIS\x82\xc5\x83R\x81[\x83f"
+            b"\x83B\x83\x93\x83O\x82\xb3\x82\xea\x82\xbd\x93\xfa\x96{\x8c"
+            b"\xea\x82\xcc\x83t\x83@\x83C\x83\x8b\x82\xc5\x82\xb7\x81B"
+            b"
" + ) + unicode_html = shift_jis_html.decode("shift-jis") + soup = self.soup(unicode_html) + + # Make sure the parse tree is correctly encoded to various + # encodings. + assert soup.encode("utf-8") == unicode_html.encode("utf-8") + assert soup.encode("euc_jp") == unicode_html.encode("euc_jp") + + def test_real_hebrew_document(self): + # A real-world test to make sure we can convert ISO-8859-9 (a + # Hebrew encoding) to UTF-8. + hebrew_document = b"Hebrew (ISO 8859-8) in Visual Directionality

Hebrew (ISO 8859-8) in Visual Directionality

\xed\xe5\xec\xf9" + soup = self.soup(hebrew_document, from_encoding="iso8859-8") + # Some tree builders call it iso8859-8, others call it iso-8859-9. + # That's not a difference we really care about. + assert soup.original_encoding in ("iso8859-8", "iso-8859-8") + assert soup.encode("utf-8") == ( + hebrew_document.decode("iso8859-8").encode("utf-8") + ) + + def test_meta_tag_reflects_current_encoding(self): + # Here's the tag saying that a document is + # encoded in Shift-JIS. + meta_tag = ( + '' + ) + + # Here's a document incorporating that meta tag. + shift_jis_html = ( + "\n%s\n" + '' + "Shift-JIS markup goes here." + ) % meta_tag + soup = self.soup(shift_jis_html) + + # Parse the document, and the charset is seemingly unaffected. + parsed_meta = soup.find("meta", {"http-equiv": "Content-type"}) + content = parsed_meta["content"] + assert "text/html; charset=x-sjis" == content + + # But that value is actually a ContentMetaAttributeValue object. + assert isinstance(content, ContentMetaAttributeValue) + + # And it will take on a value that reflects its current + # encoding. + assert "text/html; charset=utf8" == content.substitute_encoding("utf8") + + # No matter how the tag is encoded, its charset attribute + # will always be accurate. + assert b"charset=utf8" in parsed_meta.encode("utf8") + assert b"charset=shift-jis" in parsed_meta.encode("shift-jis") + + # For the rest of the story, see TestSubstitutions in + # test_tree.py. + + def test_html5_style_meta_tag_reflects_current_encoding(self): + # Here's the tag saying that a document is + # encoded in Shift-JIS. + meta_tag = '' + + # Here's a document incorporating that meta tag. + shift_jis_html = ( + "\n%s\n" + '' + "Shift-JIS markup goes here." + ) % meta_tag + soup = self.soup(shift_jis_html) + + # Parse the document, and the charset is seemingly unaffected. + parsed_meta = soup.find("meta", id="encoding") + charset = parsed_meta["charset"] + assert "x-sjis" == charset + + # But that value is actually a CharsetMetaAttributeValue object. + assert isinstance(charset, CharsetMetaAttributeValue) + + # And it will take on a value that reflects its current + # encoding. + assert "utf8" == charset.substitute_encoding("utf8") + + # No matter how the tag is encoded, its charset attribute + # will always be accurate. + assert b'charset="utf8"' in parsed_meta.encode("utf8") + assert b'charset="shift-jis"' in parsed_meta.encode("shift-jis") + + def test_python_specific_encodings_not_used_in_charset(self): + # You can encode an HTML document using a Python-specific + # encoding, but that encoding won't be mentioned _inside_ the + # resulting document. Instead, the document will appear to + # have no encoding. + for markup in [ + b'' b'' + ]: + soup = self.soup(markup) + for encoding in PYTHON_SPECIFIC_ENCODINGS: + if encoding in ( + "idna", + "mbcs", + "oem", + "undefined", + "string_escape", + "string-escape", + ): + # For one reason or another, these will raise an + # exception if we actually try to use them, so don't + # bother. + continue + encoded = soup.encode(encoding) + assert b'meta charset=""' in encoded + assert encoding.encode("ascii") not in encoded + + def test_tag_with_no_attributes_can_have_attributes_added(self): + data = self.soup("text") + data.a["foo"] = "bar" + assert 'text' == data.a.decode() + + def test_closing_tag_with_no_opening_tag(self): + # Without BeautifulSoup.open_tag_counter, the tag will + # cause _popToTag to be called over and over again as we look + # for a tag that wasn't there. The result is that 'text2' + # will show up outside the body of the document. + soup = self.soup("

text1

text2
") + assert "

text1

text2
" == soup.body.decode() + + def test_worst_case(self): + """Test the worst case (currently) for linking issues.""" + + soup = self.soup(BAD_DOCUMENT) + self.linkage_validator(soup) + + +class XMLTreeBuilderSmokeTest(TreeBuilderSmokeTest): + def test_pickle_and_unpickle_identity(self): + # Pickling a tree, then unpickling it, yields a tree identical + # to the original. + tree = self.soup("foo") + dumped = pickle.dumps(tree, 2) + loaded = pickle.loads(dumped) + assert loaded.__class__ == BeautifulSoup + assert loaded.decode() == tree.decode() + + def test_docstring_generated(self): + soup = self.soup("") + assert soup.encode() == b'\n' + + def test_xml_declaration(self): + markup = b"""\n""" + soup = self.soup(markup) + assert markup == soup.encode("utf8") + + def test_python_specific_encodings_not_used_in_xml_declaration(self): + # You can encode an XML document using a Python-specific + # encoding, but that encoding won't be mentioned _inside_ the + # resulting document. + markup = b"""\n""" + soup = self.soup(markup) + for encoding in PYTHON_SPECIFIC_ENCODINGS: + if encoding in ( + "idna", + "mbcs", + "oem", + "undefined", + "string_escape", + "string-escape", + ): + # For one reason or another, these will raise an + # exception if we actually try to use them, so don't + # bother. + continue + encoded = soup.encode(encoding) + assert b'' in encoded + assert encoding.encode("ascii") not in encoded + + def test_processing_instruction(self): + markup = b"""\n""" + soup = self.soup(markup) + assert markup == soup.encode("utf8") + + def test_real_xhtml_document(self): + """A real XHTML document should come out *exactly* the same as it went in.""" + markup = b""" + + +Hello. +Goodbye. +""" + soup = self.soup(markup) + assert soup.encode("utf-8") == markup + + def test_nested_namespaces(self): + doc = b""" + + + + + +""" + soup = self.soup(doc) + assert doc == soup.encode() + + def test_formatter_processes_script_tag_for_xml_documents(self): + doc = """ + +""" + soup = BeautifulSoup(doc, "lxml-xml") + # lxml would have stripped this while parsing, but we can add + # it later. + soup.script.string = 'console.log("< < hey > > ");' + encoded = soup.encode() + assert b"< < hey > >" in encoded + + def test_can_parse_unicode_document(self): + markup = 'Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + assert "Sacr\xe9 bleu!" == soup.root.string + + def test_can_parse_unicode_document_begining_with_bom(self): + markup = '\N{BYTE ORDER MARK}Sacr\N{LATIN SMALL LETTER E WITH ACUTE} bleu!' + soup = self.soup(markup) + assert "Sacr\xe9 bleu!" == soup.root.string + + def test_popping_namespaced_tag(self): + markup = 'b2012-07-02T20:33:42Zcd' + soup = self.soup(markup) + assert str(soup.rss) == markup + + def test_docstring_includes_correct_encoding(self): + soup = self.soup("") + assert ( + soup.encode("latin1") == b'\n' + ) + + def test_large_xml_document(self): + """A large XML document should come out the same as it went in.""" + markup = ( + b'\n' + + b"0" * (2**12) + + b"" + ) + soup = self.soup(markup) + assert soup.encode("utf-8") == markup + + def test_tags_are_empty_element_if_and_only_if_they_are_empty(self): + self.assert_soup("

", "

") + self.assert_soup("

foo

") + + def test_namespaces_are_preserved(self): + markup = 'This tag is in the a namespaceThis tag is in the b namespace' + soup = self.soup(markup) + root = soup.root + assert "http://example.com/" == root["xmlns:a"] + assert "http://example.net/" == root["xmlns:b"] + + def test_closing_namespaced_tag(self): + markup = '

20010504

' + soup = self.soup(markup) + assert str(soup.p) == markup + + def test_namespaced_attributes(self): + markup = '' + soup = self.soup(markup) + assert str(soup.foo) == markup + + def test_namespaced_attributes_xml_namespace(self): + markup = 'bar' + soup = self.soup(markup) + assert str(soup.foo) == markup + + def test_find_by_prefixed_name(self): + doc = """ + + foo + bar + baz + +""" + soup = self.soup(doc) + + # There are three tags. + assert 3 == len(soup.find_all("tag")) + + # But two of them are ns1:tag and one of them is ns2:tag. + assert 2 == len(soup.find_all("ns1:tag")) + assert 1 == len(soup.find_all("ns2:tag")) + + assert 1, len(soup.find_all("ns2:tag", key="value")) + assert 3, len(soup.find_all(["ns1:tag", "ns2:tag"])) + + def test_copy_tag_preserves_namespace(self): + xml = """ +""" + + soup = self.soup(xml) + tag = soup.document + duplicate = copy.copy(tag) + + # The two tags have the same namespace prefix. + assert tag.prefix == duplicate.prefix + + def test_worst_case(self): + """Test the worst case (currently) for linking issues.""" + + soup = self.soup(BAD_DOCUMENT) + self.linkage_validator(soup) + + +class HTML5TreeBuilderSmokeTest(HTMLTreeBuilderSmokeTest): + """Smoke test for a tree builder that supports HTML5.""" + + def test_real_xhtml_document(self): + # Since XHTML is not HTML5, HTML5 parsers are not tested to handle + # XHTML documents in any particular way. + pass + + def test_html_tags_have_namespace(self): + markup = "" + soup = self.soup(markup) + assert "http://www.w3.org/1999/xhtml" == soup.a.namespace + + def test_svg_tags_have_namespace(self): + markup = "" + soup = self.soup(markup) + namespace = "http://www.w3.org/2000/svg" + assert namespace == soup.svg.namespace + assert namespace == soup.circle.namespace + + def test_mathml_tags_have_namespace(self): + markup = "5" + soup = self.soup(markup) + namespace = "http://www.w3.org/1998/Math/MathML" + assert namespace == soup.math.namespace + assert namespace == soup.msqrt.namespace + + def test_xml_declaration_becomes_comment(self): + markup = '' + soup = self.soup(markup) + assert isinstance(soup.contents[0], Comment) + assert soup.contents[0] == '?xml version="1.0" encoding="utf-8"?' + assert "html" == soup.contents[0].next_element.name diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/__init__.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa2d468ed1791b05c8b6c87d6fcaa41a22997061 GIT binary patch literal 67414 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 v`M?U~{wh`hhTcI{4rc>~L)yz4bP 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 w_>q%^M=x=qbdJ5$l+(-!^9Nw~q<^!dO{< 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 Pf!Sbs(fBD#WA**NiTT;( literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_dammit.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_dammit.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea529b2eed3dd7e82ff614e682b15c3fbeece581 GIT binary patch literal 19786 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 I5jJ4|4}FGt5C8xG literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_formatter.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_formatter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30acb1346a0d61272ea81b4deeb9ebe3b33d5cd4 GIT binary patch literal 7800 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_fuzz.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_fuzz.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97b98e8fc91b6bfbffe7f5b9cff170897197b23b GIT binary patch literal 7039 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_html5lib.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_html5lib.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38a22b535f0c94f3b47c000a84c7475171c86c66 GIT binary patch literal 11962 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 XHv>$b-}dY(g$4K~i{%liBW(2F7#@?* literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_htmlparser.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_htmlparser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..577d1cf4aedfa2fae15e7c5fde175eb1e3f6e168 GIT binary patch literal 7285 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 QiyI8BQR#J&)~N;m4%=XQYXATM literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_navigablestring.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_navigablestring.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3889428051084611018d3d357689f6389f7baf1b GIT binary patch literal 7763 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_pageelement.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_pageelement.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6872ef354ad2cf8d3b4886798805927d833793cd GIT binary patch literal 22908 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 Ux`3a%^*ia7bDs(H%O>Lg1eD)1HUIzs literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_tag.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_tag.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d588adf49163287f528eb318d8163ebbbaf9b015 GIT binary patch literal 14119 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_tree.cpython-312.pyc b/llmlab/lib/python3.12/site-packages/bs4/tests/__pycache__/test_tree.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..575af958bb6c209d5bbe729522e96376bbd92bee GIT binary patch literal 93182 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 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase new file mode 100644 index 0000000..4828f8a --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase @@ -0,0 +1 @@ +

\ No newline at end of file diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase new file mode 100644 index 0000000000000000000000000000000000000000..8a585ce9270e58b125922297f2d099298adac822 GIT binary patch literal 15347 zcmeHOKW`H;6u+P#aRU+(18Xxd6l%E*Nl7L5s!A+KhygMnL5ETmLXBVgZv$er@K!|sD^YeJSDOAWa&ttPlG6X?Atl{} z^qDpjS}5Y|WIWoTq(csczd4*??66BhVoGhy6y1ZDBgWIhQ~nf$4?LB=5tQo zxX3XIMJ!OhCjE@@G@nnHL!!ULItAw?J4Na|Tz{fnYNoHpCUhroxQ^Xm|6~3AZ`jNU z_1CN>Z8L2Ov5UvVto$ukPyf~8Z|ZG_z+Cw)}rtPVgJ$Y!^aQq_qB2x+d@%#VL&Ee zscL#D6CO7NUrf^%e&SnKww(HyG#lR3!%5nHqKHLiq!Uq%XT(ATAI~R!c+#u~ktD)W z#Z-lH42O%htTt3XpZZq_8E}9wb>zG-$Bf4}bwbGBM0e%#VflQ3>E%3$>n4SKSi0u< zER%m$TsEp5ifAh3ZBVWkB$KNF37662`3#lv#vffpN$8m zN~NsW&nsp9m$XI|Y?vkxR-@e#J2vfv={I9yD{8L>?bJ5jl{m^X>DgR>Pz4nzY55>9 zaJF$P4nM{r0N0v8sLEMw1+^QiLKN+(xQwxB!0bXrBv?Z{w${rqtoY4tO&Vk2ajs38ITfhY1|%rRV$pMf6PhuP>A~gb(by@6 zIYN?5j_g2E=LC?WXmn7m$gyJwVL_x)6E>WMna*0~7+ng6=am8TKe^U~eF_~XCRZkW z#PW{M(|AZY!jT)*wowa!XyA7C+-+hS%aO@_kcpK7$) zCWCD<@Kz>oC}@WX+hj0SGTJ5s9fT9I*)juIwVk>gO$LI&wIfvqDdYl5f{7)#xCTIF z2SI2-qp#%56T}6sGt3_+us`Vd;ONzB-y@~Ll>LlA@XZVW@(&R0YF literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase new file mode 100644 index 0000000000000000000000000000000000000000..0fe66dd23fe94a8e451dfb1a84da38ed0984c1f9 GIT binary patch literal 19469 zcmeHP%}&BV5UwW1c<}1c&|0d-m{hN9YYZMVF=z-E6E3Azz?Aa07`*ugp1gb37w}np z1J6Ey_J;^Y+hVrDb~+?vcLObSXLo15`M%w!71Cc4g4b8Y>@_=7*S$g~EsGkt2Bn={ zt2=1kXi~B5P|KmamD`Rb<;p=_zIm%4C&qy-Vu088oOsuGz>Kq!-D0_0%~Ls_F?gfesF!B~xlP=*UCbCH?n*-O%0 z!Q*F>?46hl=N3}p9^s$pfQ;#K?C}VRg&?#Cu4Gl`M+NhN`Lsc{A^94o$;0t3y>S870B{5&zz9DFt<}-BMx(8V;~9 zu^`3{e->4K<9oQkG(Mym>pheEPdQ^GK5fr%nc+{ydd)pa{!emW8I*DurdQ@~y8Kk4 zgV7-WU60=nl>ER&`8c&A8JzU^4}@gt+g^h^gT@rwKLtV<2l@NX63OYId;^?(0~P60 z?9W6QN1A0E6WR+_CBVe3&|S@XJ2R{CP{xr=dJz@rVH;L3n4Q9zrUy|Y_Y}rG!O4js mqyYzMPzM!p)C@wIG(#Cwq{BE*384&|DuI`yvfSgo2>k@d3|T1v literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase new file mode 100644 index 0000000000000000000000000000000000000000..fd411427d765e9b17e1e6a015485a70632bb9554 GIT binary patch literal 12 TcmY$eDbjbbRX@cb^ZOhC75W5K literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase new file mode 100644 index 0000000..6248b2c --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase @@ -0,0 +1 @@ + >tet>< \ No newline at end of file diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase new file mode 100644 index 0000000000000000000000000000000000000000..107da539fc15bd1664e35287ace9feda21cb5820 GIT binary patch literal 11502 zcmeHNy>HV%6gOf+VqhSEDxuawNKi#?;xtXg#SCTdK!q3y#cd3AnkG&P3ldWY7XAYy zCT0f2N_Q3{#Kh8pfq{iTAiQ_)?sEPrNt;$FI=4Ds&hO(s-o1P8XBP^E%c~a(bbUIR z>pt6&8VYYetR1|1@3DT}-suHUu57m=zZDhNUbKCCoqp6en~h@8f`8Us?*#40@z@;v zvWixx>qm8ug?`kSZAMZ199wmM)@|Fljl~QWU$J;93#i=Gnw~*BlHQ#|0?zbH*5 zb%|;A>ykT1x$T5V0o|~j6!-jKFyP&Q0fx?{e_SD_qO!^BSE=P1b3*t-8C14p{iSNc z2V3ItzI+T%ukbpRx(HH0EkaF-OQ}&>bS_;QQIeM5QcmbNA;V7VgCSi+Ka`)}b4~+u zIOf`Y|F-|bcGS`*xVc><+HeK=DuR7kbb;M|VG*n$UVC7lv5TH2TY-e=Ct3={xQ+R4 zwyZppvo(W_ZxdtZ*>Zz`2*oa8?n9GW;CglXx z<}63=pqMsNj5^H-eT8Y@E zP=-sP&U&-KBcEQhQFN;n4^K@xO-DQbCK=e7a4zp`HQ}5I=Oz-?nQ%^KGA3<_C5= zlRW%*ktfj|g`Fl))G`RHqfkU^=K$nAEVm4Oss1xm@?`cmF%gp;&h|LjDKbyFFvm(o zWHM`)cSw5|y>6c;zMKmSoRv`l zPeWS%fLuIZqeLOxJve;>FPgW-2pF5U#T0&+x5X53 zjQLv8ye*brDwwY#Fm>Y}L;QzdMc~-Z@auB}FN(+qLgC{?R>|o0jGKi4oeBP!uvKWO zmx{C@5I3Jxz--`-k(ePz3Jtudax^kV11};Vc?{4p4le@a3||N1H!?MkT}(oo#aihv D9d3o5 literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase new file mode 100644 index 0000000..367106c --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase @@ -0,0 +1,2 @@ + +t \ No newline at end of file diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase new file mode 100644 index 0000000000000000000000000000000000000000..a823d557b4bebed8a9cdb880d281c9de69a1aa0a GIT binary patch literal 3546 zcmdP2$xSTDup1>uLtr!nMnhmU1V%$(Gz3ONU^E0qLtw~uwSNNv*}xU^oQ!vv$DtbH{XnB<{4q&MBMIvxRFa&-_pUv zaZ?A@)wk1eCmnC=bU*Q=8+sfD%u9F-wunGF9Af5kU{XeIH<5gU7$((-f1t0?R%dI;Jq*Qch%_#M(x|K>?1-n+*fFB zm6{d^8#<{hj+7bdpv`Q#2CcfFkUioNUyXr5z+=fRP%u7K(G*r#6$M^Z_&u?|;XuBN z@N6(okxftZk53XI6>lL`P*y0e{H4&t=5>jM|{*N|q#^8%sAhqM+Y3%AITJ zj+ie=x^@H_p!D;o#ZMNvPoPiY!4dto?gr%>8ZfxWSt4CK@!+{gLI_zD^Y~@@!h9AT zhwtJ(69K8%&(5%E2fpgGkYsM!X=s?z8oHP}&TI@w9WRoXm;n8Ha{-ib=yrZ_~b; zLif2&eN24}r`0u!2Q^n!;Z(g+b!QW%0&VHg*@TwX)&r$x>#WdFWGZjuEVhzaKfVQc zE1wv%%}(9W_#3HHZI>9f_+=c57M9cCNo@`2bnw)yoeHG+-$q-W|1arjzM|GxoYGoC z;*bTH!DdtxtcOJ%%uC0=se>6mD|1!l76U4^eq4Nq!{I_ly+tmKJqqfTb*ceU6z362 ztyNgQGww04iSboml65FWdBXI!jzWnWgo#v19R>P(S{7XznX3V~Twq+Re44__&~>h> q43wHvMb7{ew`wA?1}AsyPlT5DF{Md(5}xqoqavh!LXgNIAN~adfn_KF literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase b/llmlab/lib/python3.12/site-packages/bs4/tests/fuzz/crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase new file mode 100644 index 0000000000000000000000000000000000000000..885711554056588a381fd9a251d48ce76a916a59 GIT binary patch literal 103 zcma!IT*$!C&%p3|?)u|48N3V(Hi{|v$wno$1*wb-3(;hvkz^S9^*|aEj@#ts@G|Jx OROIF`00A~ppfmtd#~j4~ literal 0 HcmV?d00001 diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/test_builder.py b/llmlab/lib/python3.12/site-packages/bs4/tests/test_builder.py new file mode 100644 index 0000000..87d6758 --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/tests/test_builder.py @@ -0,0 +1,28 @@ +import pytest +from unittest.mock import patch +from bs4.builder import DetectsXMLParsedAsHTML + + +class TestDetectsXMLParsedAsHTML: + @pytest.mark.parametrize( + "markup,looks_like_xml", + [ + ("No xml declaration", False), + ("obviously HTMLActually XHTML", False), + (" < html>Tricky XHTML", False), + ("", True), + ], + ) + def test_warn_if_markup_looks_like_xml(self, markup, looks_like_xml): + # Test of our ability to guess at whether markup looks XML-ish + # _and_ not HTML-ish. + with patch("bs4.builder.DetectsXMLParsedAsHTML._warn") as mock: + for data in markup, markup.encode("utf8"): + result = DetectsXMLParsedAsHTML.warn_if_markup_looks_like_xml(data) + assert result == looks_like_xml + if looks_like_xml: + assert mock.called + else: + assert not mock.called + mock.reset_mock() diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/test_builder_registry.py b/llmlab/lib/python3.12/site-packages/bs4/tests/test_builder_registry.py new file mode 100644 index 0000000..ad4b5a9 --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/tests/test_builder_registry.py @@ -0,0 +1,139 @@ +"""Tests of the builder registry.""" + +import pytest +import warnings +from typing import Type + +from bs4 import BeautifulSoup +from bs4.builder import ( + builder_registry as registry, + TreeBuilder, + TreeBuilderRegistry, +) +from bs4.builder._htmlparser import HTMLParserTreeBuilder + +from . import ( + HTML5LIB_PRESENT, + LXML_PRESENT, +) + +if HTML5LIB_PRESENT: + from bs4.builder._html5lib import HTML5TreeBuilder + +if LXML_PRESENT: + from bs4.builder._lxml import ( + LXMLTreeBuilderForXML, + LXMLTreeBuilder, + ) + + +# TODO: Split out the lxml and html5lib tests into their own classes +# and gate with pytest.mark.skipIf. +class TestBuiltInRegistry(object): + """Test the built-in registry with the default builders registered.""" + + def test_combination(self): + assert registry.lookup("strict", "html") == HTMLParserTreeBuilder + if LXML_PRESENT: + assert registry.lookup("fast", "html") == LXMLTreeBuilder + assert registry.lookup("permissive", "xml") == LXMLTreeBuilderForXML + if HTML5LIB_PRESENT: + assert registry.lookup("html5lib", "html") == HTML5TreeBuilder + + def test_lookup_by_markup_type(self): + if LXML_PRESENT: + assert registry.lookup("html") == LXMLTreeBuilder + assert registry.lookup("xml") == LXMLTreeBuilderForXML + else: + assert registry.lookup("xml") is None + if HTML5LIB_PRESENT: + assert registry.lookup("html") == HTML5TreeBuilder + else: + assert registry.lookup("html") == HTMLParserTreeBuilder + + def test_named_library(self): + if LXML_PRESENT: + assert registry.lookup("lxml", "xml") == LXMLTreeBuilderForXML + assert registry.lookup("lxml", "html") == LXMLTreeBuilder + if HTML5LIB_PRESENT: + assert registry.lookup("html5lib") == HTML5TreeBuilder + + assert registry.lookup("html.parser") == HTMLParserTreeBuilder + + def test_beautifulsoup_constructor_does_lookup(self): + with warnings.catch_warnings(record=True): + # This will create a warning about not explicitly + # specifying a parser, but we'll ignore it. + + # You can pass in a string. + BeautifulSoup("", features="html") + # Or a list of strings. + BeautifulSoup("", features=["html", "fast"]) + pass + + # You'll get an exception if BS can't find an appropriate + # builder. + with pytest.raises(ValueError): + BeautifulSoup("", features="no-such-feature") + + +class TestRegistry(object): + """Test the TreeBuilderRegistry class in general.""" + + def setup_method(self): + self.registry = TreeBuilderRegistry() + + def builder_for_features(self, *feature_list: str) -> Type[TreeBuilder]: + cls = type( + "Builder_" + "_".join(feature_list), (object,), {"features": feature_list} + ) + + self.registry.register(cls) + return cls + + def test_register_with_no_features(self): + builder = self.builder_for_features() + + # Since the builder advertises no features, you can't find it + # by looking up features. + assert self.registry.lookup("foo") is None + + # But you can find it by doing a lookup with no features, if + # this happens to be the only registered builder. + assert self.registry.lookup() == builder + + def test_register_with_features_makes_lookup_succeed(self): + builder = self.builder_for_features("foo", "bar") + assert self.registry.lookup("foo") is builder + assert self.registry.lookup("bar") is builder + + def test_lookup_fails_when_no_builder_implements_feature(self): + assert self.registry.lookup("baz") is None + + def test_lookup_gets_most_recent_registration_when_no_feature_specified(self): + self.builder_for_features("foo") + builder2 = self.builder_for_features("bar") + assert self.registry.lookup() == builder2 + + def test_lookup_fails_when_no_tree_builders_registered(self): + assert self.registry.lookup() is None + + def test_lookup_gets_most_recent_builder_supporting_all_features(self): + self.builder_for_features("foo") + self.builder_for_features("bar") + has_both_early = self.builder_for_features("foo", "bar", "baz") + has_both_late = self.builder_for_features("foo", "bar", "quux") + self.builder_for_features("bar") + self.builder_for_features("foo") + + # There are two builders featuring 'foo' and 'bar', but + # the one that also features 'quux' was registered later. + assert self.registry.lookup("foo", "bar") == has_both_late + + # There is only one builder featuring 'foo', 'bar', and 'baz'. + assert self.registry.lookup("foo", "bar", "baz") == has_both_early + + def test_lookup_fails_when_cannot_reconcile_requested_features(self): + self.builder_for_features("foo", "bar") + self.builder_for_features("foo", "baz") + assert self.registry.lookup("bar", "baz") is None diff --git a/llmlab/lib/python3.12/site-packages/bs4/tests/test_css.py b/llmlab/lib/python3.12/site-packages/bs4/tests/test_css.py new file mode 100644 index 0000000..b1c4237 --- /dev/null +++ b/llmlab/lib/python3.12/site-packages/bs4/tests/test_css.py @@ -0,0 +1,536 @@ +import pytest +import types + +from bs4 import ( + BeautifulSoup, + ResultSet, +) + +from typing import ( + Any, + List, + Tuple, + Type, +) + +from packaging.version import Version + +from . import ( + SoupTest, + SOUP_SIEVE_PRESENT, +) + +SOUPSIEVE_EXCEPTION_ON_UNSUPPORTED_PSEUDOCLASS: Type[Exception] +if SOUP_SIEVE_PRESENT: + from soupsieve import __version__, SelectorSyntaxError + + # Some behavior changes in soupsieve 2.6 that affects one of our + # tests. For the test to run under all versions of Python + # supported by Beautiful Soup (which includes versions of Python + # not supported by soupsieve 2.6) we need to check both behaviors. + SOUPSIEVE_EXCEPTION_ON_UNSUPPORTED_PSEUDOCLASS = SelectorSyntaxError + if Version(__version__) < Version("2.6"): + SOUPSIEVE_EXCEPTION_ON_UNSUPPORTED_PSEUDOCLASS = NotImplementedError + + +@pytest.mark.skipif(not SOUP_SIEVE_PRESENT, reason="Soup Sieve not installed") +class TestCSSSelectors(SoupTest): + """Test basic CSS selector functionality. + + This functionality is implemented in soupsieve, which has a much + more comprehensive test suite, so this is basically an extra check + that soupsieve works as expected. + """ + + HTML = """ + + + +The title + + + +Hello there. +
+
+

An H1

+

Some text

+

Some more text

+

An H2

+

Another

+Bob +

Another H2

+me + +span1a1 +span1a2 test + +span2a1 + + + +
+ +
+ + + + + + + + +

English

+

English UK

+

English US

+

French

+
+ + +""" + + def setup_method(self): + self._soup = BeautifulSoup(self.HTML, "html.parser") + + def assert_css_selects( + self, selector: str, expected_ids: List[str], **kwargs: Any + ) -> None: + results = self._soup.select(selector, **kwargs) + assert isinstance(results, ResultSet) + el_ids = [el["id"] for el in results] + el_ids.sort() + expected_ids.sort() + assert expected_ids == el_ids, "Selector %s, expected [%s], got [%s]" % ( + selector, + ", ".join(expected_ids), + ", ".join(el_ids), + ) + + assertSelect = assert_css_selects + + def assert_css_select_multiple(self, *tests: Tuple[str, List[str]]): + for selector, expected_ids in tests: + self.assert_css_selects(selector, expected_ids) + + def test_precompiled(self): + sel = self._soup.css.compile("div") + + els = self._soup.select(sel) + assert len(els) == 4 + for div in els: + assert div.name == "div" + + el = self._soup.select_one(sel) + assert "main" == el["id"] + + def test_one_tag_one(self): + els = self._soup.select("title") + assert len(els) == 1 + assert els[0].name == "title" + assert els[0].contents == ["The title"] + + def test_one_tag_many(self): + els = self._soup.select("div") + assert len(els) == 4 + for div in els: + assert div.name == "div" + + el = self._soup.select_one("div") + assert "main" == el["id"] + + def test_select_one_returns_none_if_no_match(self): + match = self._soup.select_one("nonexistenttag") + assert None is match + + def test_tag_in_tag_one(self): + self.assert_css_selects("div div", ["inner", "data1"]) + + def test_tag_in_tag_many(self): + for selector in ("html div", "html body div", "body div"): + self.assert_css_selects(selector, ["data1", "main", "inner", "footer"]) + + def test_limit(self): + self.assert_css_selects("html div", ["main"], limit=1) + self.assert_css_selects("html body div", ["inner", "main"], limit=2) + self.assert_css_selects( + "body div", ["data1", "main", "inner", "footer"], limit=10 + ) + + def test_tag_no_match(self): + assert len(self._soup.select("del")) == 0 + + def test_invalid_tag(self): + with pytest.raises(SelectorSyntaxError): + self._soup.select("tag%t") + + def test_select_dashed_tag_ids(self): + self.assert_css_selects("custom-dashed-tag", ["dash1", "dash2"]) + + def test_select_dashed_by_id(self): + dashed = self._soup.select('custom-dashed-tag[id="dash2"]') + assert dashed[0].name == "custom-dashed-tag" + assert dashed[0]["id"] == "dash2" + + def test_dashed_tag_text(self): + assert self._soup.select("body > custom-dashed-tag")[0].text == "Hello there." + + def test_select_dashed_matches_find_all(self): + assert self._soup.select("custom-dashed-tag") == self._soup.find_all( + "custom-dashed-tag" + ) + + def test_header_tags(self): + self.assert_css_select_multiple( + ("h1", ["header1"]), + ("h2", ["header2", "header3"]), + ) + + def test_class_one(self): + for selector in (".onep", "p.onep", "html p.onep"): + els = self._soup.select(selector) + assert len(els) == 1 + assert els[0].name == "p" + assert els[0]["class"] == ["onep"] + + def test_class_mismatched_tag(self): + els = self._soup.select("div.onep") + assert len(els) == 0 + + def test_one_id(self): + for selector in ("div#inner", "#inner", "div div#inner"): + self.assert_css_selects(selector, ["inner"]) + + def test_bad_id(self): + els = self._soup.select("#doesnotexist") + assert len(els) == 0 + + def test_items_in_id(self): + els = self._soup.select("div#inner p") + assert len(els) == 3 + for el in els: + assert el.name == "p" + assert els[1]["class"] == ["onep"] + assert not els[0].has_attr("class") + + def test_a_bunch_of_emptys(self): + for selector in ("div#main del", "div#main div.oops", "div div#main"): + assert len(self._soup.select(selector)) == 0 + + def test_multi_class_support(self): + for selector in ( + ".class1", + "p.class1", + ".class2", + "p.class2", + ".class3", + "p.class3", + "html p.class2", + "div#inner .class2", + ): + self.assert_css_selects(selector, ["pmulti"]) + + def test_multi_class_selection(self): + for selector in (".class1.class3", ".class3.class2", ".class1.class2.class3"): + self.assert_css_selects(selector, ["pmulti"]) + + def test_child_selector(self): + self.assert_css_selects(".s1 > a", ["s1a1", "s1a2"]) + self.assert_css_selects(".s1 > a span", ["s1a2s1"]) + + def test_child_selector_id(self): + self.assert_css_selects(".s1 > a#s1a2 span", ["s1a2s1"]) + + def test_attribute_equals(self): + self.assert_css_select_multiple( + ('p[class="onep"]', ["p1"]), + ('p[id="p1"]', ["p1"]), + ('[class="onep"]', ["p1"]), + ('[id="p1"]', ["p1"]), + ('link[rel="stylesheet"]', ["l1"]), + ('link[type="text/css"]', ["l1"]), + ('link[href="blah.css"]', ["l1"]), + ('link[href="no-blah.css"]', []), + ('[rel="stylesheet"]', ["l1"]), + ('[type="text/css"]', ["l1"]), + ('[href="blah.css"]', ["l1"]), + ('[href="no-blah.css"]', []), + ('p[href="no-blah.css"]', []), + ('[href="no-blah.css"]', []), + ) + + def test_attribute_tilde(self): + self.assert_css_select_multiple( + ('p[class~="class1"]', ["pmulti"]), + ('p[class~="class2"]', ["pmulti"]), + ('p[class~="class3"]', ["pmulti"]), + ('[class~="class1"]', ["pmulti"]), + ('[class~="class2"]', ["pmulti"]), + ('[class~="class3"]', ["pmulti"]), + ('a[rel~="friend"]', ["bob"]), + ('a[rel~="met"]', ["bob"]), + ('[rel~="friend"]', ["bob"]), + ('[rel~="met"]', ["bob"]), + ) + + def test_attribute_startswith(self): + self.assert_css_select_multiple( + ('[rel^="style"]', ["l1"]), + ('link[rel^="style"]', ["l1"]), + ('notlink[rel^="notstyle"]', []), + ('[rel^="notstyle"]', []), + ('link[rel^="notstyle"]', []), + ('link[href^="bla"]', ["l1"]), + ('a[href^="http://"]', ["bob", "me"]), + ('[href^="http://"]', ["bob", "me"]), + ('[id^="p"]', ["pmulti", "p1"]), + ('[id^="m"]', ["me", "main"]), + ('div[id^="m"]', ["main"]), + ('a[id^="m"]', ["me"]), + ('div[data-tag^="dashed"]', ["data1"]), + ) + + def test_attribute_endswith(self): + self.assert_css_select_multiple( + ('[href$=".css"]', ["l1"]), + ('link[href$=".css"]', ["l1"]), + ('link[id$="1"]', ["l1"]), + ( + '[id$="1"]', + ["data1", "l1", "p1", "header1", "s1a1", "s2a1", "s1a2s1", "dash1"], + ), + ('div[id$="1"]', ["data1"]), + ('[id$="noending"]', []), + ) + + def test_attribute_contains(self): + self.assert_css_select_multiple( + # From test_attribute_startswith + ('[rel*="style"]', ["l1"]), + ('link[rel*="style"]', ["l1"]), + ('notlink[rel*="notstyle"]', []), + ('[rel*="notstyle"]', []), + ('link[rel*="notstyle"]', []), + ('link[href*="bla"]', ["l1"]), + ('[href*="http://"]', ["bob", "me"]), + ('[id*="p"]', ["pmulti", "p1"]), + ('div[id*="m"]', ["main"]), + ('a[id*="m"]', ["me"]), + # From test_attribute_endswith + ('[href*=".css"]', ["l1"]), + ('link[href*=".css"]', ["l1"]), + ('link[id*="1"]', ["l1"]), + ( + '[id*="1"]', + [ + "data1", + "l1", + "p1", + "header1", + "s1a1", + "s1a2", + "s2a1", + "s1a2s1", + "dash1", + ], + ), + ('div[id*="1"]', ["data1"]), + ('[id*="noending"]', []), + # New for this test + ('[href*="."]', ["bob", "me", "l1"]), + ('a[href*="."]', ["bob", "me"]), + ('link[href*="."]', ["l1"]), + ('div[id*="n"]', ["main", "inner"]), + ('div[id*="nn"]', ["inner"]), + ('div[data-tag*="edval"]', ["data1"]), + ) + + def test_attribute_exact_or_hypen(self): + self.assert_css_select_multiple( + ('p[lang|="en"]', ["lang-en", "lang-en-gb", "lang-en-us"]), + ('[lang|="en"]', ["lang-en", "lang-en-gb", "lang-en-us"]), + ('p[lang|="fr"]', ["lang-fr"]), + ('p[lang|="gb"]', []), + ) + + def test_attribute_exists(self): + self.assert_css_select_multiple( + ("[rel]", ["l1", "bob", "me"]), + ("link[rel]", ["l1"]), + ("a[rel]", ["bob", "me"]), + ("[lang]", ["lang-en", "lang-en-gb", "lang-en-us", "lang-fr"]), + ("p[class]", ["p1", "pmulti"]), + ("[blah]", []), + ("p[blah]", []), + ("div[data-tag]", ["data1"]), + ) + + def test_quoted_space_in_selector_name(self): + html = """
nope
+
yes
+ """ + soup = BeautifulSoup(html, "html.parser") + [chosen] = soup.select('div[style="display: right"]') + assert "yes" == chosen.string + + def test_unsupported_pseudoclass(self): + with pytest.raises(SOUPSIEVE_EXCEPTION_ON_UNSUPPORTED_PSEUDOCLASS): + self._soup.select("a:no-such-pseudoclass") + + with pytest.raises(SelectorSyntaxError): + self._soup.select("a:nth-of-type(a)") + + def test_nth_of_type(self): + # Try to select first paragraph + els = self._soup.select("div#inner p:nth-of-type(1)") + assert len(els) == 1 + assert els[0].string == "Some text" + + # Try to select third paragraph + els = self._soup.select("div#inner p:nth-of-type(3)") + assert len(els) == 1 + assert els[0].string == "Another" + + # Try to select (non-existent!) fourth paragraph + els = self._soup.select("div#inner p:nth-of-type(4)") + assert len(els) == 0 + + # Zero will select no tags. + els = self._soup.select("div p:nth-of-type(0)") + assert len(els) == 0 + + def test_nth_of_type_direct_descendant(self): + els = self._soup.select("div#inner > p:nth-of-type(1)") + assert len(els) == 1 + assert els[0].string == "Some text" + + def test_id_child_selector_nth_of_type(self): + self.assert_css_selects("#inner > p:nth-of-type(2)", ["p1"]) + + def test_select_on_element(self): + # Other tests operate on the tree; this operates on an element + # within the tree. + inner = self._soup.find("div", id="main") + selected = inner.select("div") + # The
tag was selected. The