From 7bde30c618416f4d6527c905ae0da7035e47e6a8 Mon Sep 17 00:00:00 2001 From: Corey Goldberg <1113081+cgoldberg@users.noreply.github.com> Date: Wed, 18 Jun 2025 15:31:55 -0400 Subject: [PATCH 1/3] [py] Bump python requirements --- .github/workflows/ci-python.yml | 4 ++-- py/pyproject.toml | 4 ++-- py/requirements.txt | 24 +++++++++--------------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci-python.yml b/.github/workflows/ci-python.yml index 7c8718c914e33..713ab6d884275 100644 --- a/.github/workflows/ci-python.yml +++ b/.github/workflows/ci-python.yml @@ -27,7 +27,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install tox==4.25.0 + pip install tox==4.27.0 - name: Generate docs run: tox -c py/tox.ini env: @@ -47,7 +47,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install tox==4.25.0 + pip install tox==4.27.0 - name: Run type checking run: | tox -c py/tox.ini || true diff --git a/py/pyproject.toml b/py/pyproject.toml index 46e6b03d3e1ee..e3381c826ade6 100644 --- a/py/pyproject.toml +++ b/py/pyproject.toml @@ -25,10 +25,10 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] dependencies = [ - "urllib3[socks]~=2.4.0", + "urllib3[socks]~=2.5.0", "trio~=0.30.0", "trio-websocket~=0.12.2", - "certifi>=2025.4.26", + "certifi>=2025.6.15", "typing_extensions~=4.14.0", "websocket-client~=1.8.0", ] diff --git a/py/requirements.txt b/py/requirements.txt index 4094855ba24ba..b76d59225db4f 100644 --- a/py/requirements.txt +++ b/py/requirements.txt @@ -1,12 +1,10 @@ -async-generator==1.10 attrs==25.3.0 -cachetools==6.0.0 -certifi==2025.4.26 +cachetools==6.1.0 +certifi==2025.6.15 cffi==1.17.1 chardet==5.2.0 charset-normalizer==3.4.2 colorama==0.4.6 -cryptography==45.0.3 debugpy==1.8.14 distlib==0.3.9 docutils==0.21.2 @@ -21,12 +19,11 @@ iniconfig==2.1.0 jaraco.classes==3.4.0 jaraco.context==6.0.1 jaraco.functools==4.1.0 -jeepney==0.9.0 keyring==25.6.0 markdown-it-py==3.0.0 mdurl==0.1.2 more-itertools==10.7.0 -multidict==6.4.4 +multidict==6.5.0 nh3==0.2.21 outcome==1.3.0.post0 packaging==25.0 @@ -35,30 +32,27 @@ pluggy==1.6.0 py==1.11.0 pycparser==2.22 Pygments==2.19.1 -pyOpenSSL==25.1.0 -pyparsing==3.2.3 pyproject-api==1.9.1 PySocks==1.7.1 -pytest==8.4.0 +pytest==8.4.1 pytest-instafail==0.5.0 pytest-mock==3.14.1 pytest-trio==0.8.0 +pywin32-ctypes==0.2.3 readme_renderer==44.0 -requests==2.32.3 +requests==2.32.4 requests-toolbelt==1.0.0 rfc3986==2.0.0 rich==14.0.0 -SecretStorage==3.3.3 sniffio==1.3.1 sortedcontainers==2.4.0 -toml==0.10.2 -tox==4.26.0 +tox==4.27.0 trio==0.30.0 trio-websocket==0.12.2 twine==6.1.0 typing_extensions==4.14.0 -urllib3[socks]==2.4.0 +urllib3[socks]==2.5.0 virtualenv==20.31.2 websocket-client==1.8.0 wsproto==1.2.0 -zipp==3.22.0 +zipp==3.23.0 From d37231bb63b909acfe0f489b4a668def6aebfd56 Mon Sep 17 00:00:00 2001 From: Corey Goldberg <1113081+cgoldberg@users.noreply.github.com> Date: Wed, 18 Jun 2025 16:29:35 -0400 Subject: [PATCH 2/3] [py] Bump requirements lock --- py/requirements.txt | 3 + py/requirements_lock.txt | 360 +++++++++++++++++++-------------------- 2 files changed, 179 insertions(+), 184 deletions(-) diff --git a/py/requirements.txt b/py/requirements.txt index b76d59225db4f..e5403f20224cc 100644 --- a/py/requirements.txt +++ b/py/requirements.txt @@ -5,6 +5,7 @@ cffi==1.17.1 chardet==5.2.0 charset-normalizer==3.4.2 colorama==0.4.6 +cryptography==45.0.4 debugpy==1.8.14 distlib==0.3.9 docutils==0.21.2 @@ -19,6 +20,7 @@ iniconfig==2.1.0 jaraco.classes==3.4.0 jaraco.context==6.0.1 jaraco.functools==4.1.0 +jeepney==0.9.0 keyring==25.6.0 markdown-it-py==3.0.0 mdurl==0.1.2 @@ -44,6 +46,7 @@ requests==2.32.4 requests-toolbelt==1.0.0 rfc3986==2.0.0 rich==14.0.0 +SecretStorage==3.3.3 sniffio==1.3.1 sortedcontainers==2.4.0 tox==4.27.0 diff --git a/py/requirements_lock.txt b/py/requirements_lock.txt index 1c68fa8278486..13dd92bfc3b39 100644 --- a/py/requirements_lock.txt +++ b/py/requirements_lock.txt @@ -4,10 +4,6 @@ # # bazel run //py:requirements.update # -async-generator==1.10 \ - --hash=sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b \ - --hash=sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144 - # via -r py/requirements.txt attrs==25.3.0 \ --hash=sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3 \ --hash=sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b @@ -19,15 +15,15 @@ backports-tarfile==1.2.0 \ --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \ --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991 # via jaraco-context -cachetools==6.0.0 \ - --hash=sha256:82e73ba88f7b30228b5507dce1a1f878498fc669d972aef2dde4f3a3c24f103e \ - --hash=sha256:f225782b84438f828328fc2ad74346522f27e5b1440f4e9fd18b20ebfd1aa2cf +cachetools==6.1.0 \ + --hash=sha256:1c7bb3cf9193deaf3508b7c5f2a79986c13ea38965c5adcff1f84519cf39163e \ + --hash=sha256:b4c4f404392848db3ce7aac34950d17be4d864da4b8b66911008e430bc544587 # via # -r py/requirements.txt # tox -certifi==2025.4.26 \ - --hash=sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6 \ - --hash=sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3 +certifi==2025.6.15 \ + --hash=sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057 \ + --hash=sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b # via # -r py/requirements.txt # requests @@ -210,47 +206,46 @@ colorama==0.4.6 \ # via # -r py/requirements.txt # tox -cryptography==45.0.3 \ - --hash=sha256:00094838ecc7c6594171e8c8a9166124c1197b074cfca23645cee573910d76bc \ - --hash=sha256:050ce5209d5072472971e6efbfc8ec5a8f9a841de5a4db0ebd9c2e392cb81972 \ - --hash=sha256:232954730c362638544758a8160c4ee1b832dc011d2c41a306ad8f7cccc5bb0b \ - --hash=sha256:25286aacb947286620a31f78f2ed1a32cded7be5d8b729ba3fb2c988457639e4 \ - --hash=sha256:2f8f8f0b73b885ddd7f3d8c2b2234a7d3ba49002b0223f58cfde1bedd9563c56 \ - --hash=sha256:38deed72285c7ed699864f964a3f4cf11ab3fb38e8d39cfcd96710cd2b5bb716 \ - --hash=sha256:3ad69eeb92a9de9421e1f6685e85a10fbcfb75c833b42cc9bc2ba9fb00da4710 \ - --hash=sha256:5555365a50efe1f486eed6ac7062c33b97ccef409f5970a0b6f205a7cfab59c8 \ - --hash=sha256:555e5e2d3a53b4fabeca32835878b2818b3f23966a4efb0d566689777c5a12c8 \ - --hash=sha256:57a6500d459e8035e813bd8b51b671977fb149a8c95ed814989da682314d0782 \ - --hash=sha256:5833bb4355cb377ebd880457663a972cd044e7f49585aee39245c0d592904578 \ - --hash=sha256:71320fbefd05454ef2d457c481ba9a5b0e540f3753354fff6f780927c25d19b0 \ - --hash=sha256:7573d9eebaeceeb55285205dbbb8753ac1e962af3d9640791d12b36864065e71 \ - --hash=sha256:92d5f428c1a0439b2040435a1d6bc1b26ebf0af88b093c3628913dd464d13fa1 \ - --hash=sha256:97787952246a77d77934d41b62fb1b6f3581d83f71b44796a4158d93b8f5c490 \ - --hash=sha256:9bb5bf55dcb69f7067d80354d0a348368da907345a2c448b0babc4215ccd3497 \ - --hash=sha256:9cc80ce69032ffa528b5e16d217fa4d8d4bb7d6ba8659c1b4d74a1b0f4235fca \ - --hash=sha256:9e4253ed8f5948a3589b3caee7ad9a5bf218ffd16869c516535325fece163dcc \ - --hash=sha256:9eda14f049d7f09c2e8fb411dda17dd6b16a3c76a1de5e249188a32aeb92de19 \ - --hash=sha256:a2b56de3417fd5f48773ad8e91abaa700b678dc7fe1e0c757e1ae340779acf7b \ - --hash=sha256:af3f92b1dc25621f5fad065288a44ac790c5798e986a34d393ab27d2b27fcff9 \ - --hash=sha256:c5edcb90da1843df85292ef3a313513766a78fbbb83f584a5a58fb001a5a9d57 \ - --hash=sha256:c824c9281cb628015bfc3c59335163d4ca0540d49de4582d6c2637312907e4b1 \ - --hash=sha256:c92519d242703b675ccefd0f0562eb45e74d438e001f8ab52d628e885751fb06 \ - --hash=sha256:ca932e11218bcc9ef812aa497cdf669484870ecbcf2d99b765d6c27a86000942 \ - --hash=sha256:cb6ab89421bc90e0422aca911c69044c2912fc3debb19bb3c1bfe28ee3dff6ab \ - --hash=sha256:cfd84777b4b6684955ce86156cfb5e08d75e80dc2585e10d69e47f014f0a5342 \ - --hash=sha256:d377dde61c5d67eb4311eace661c3efda46c62113ff56bf05e2d679e02aebb5b \ - --hash=sha256:d54ae41e6bd70ea23707843021c778f151ca258081586f0cfa31d936ae43d1b2 \ - --hash=sha256:dc10ec1e9f21f33420cc05214989544727e776286c1c16697178978327b95c9c \ - --hash=sha256:ec21313dd335c51d7877baf2972569f40a4291b76a0ce51391523ae358d05899 \ - --hash=sha256:ec64ee375b5aaa354b2b273c921144a660a511f9df8785e6d1c942967106438e \ - --hash=sha256:ed43d396f42028c1f47b5fec012e9e12631266e3825e95c00e3cf94d472dac49 \ - --hash=sha256:edd6d51869beb7f0d472e902ef231a9b7689508e83880ea16ca3311a00bf5ce7 \ - --hash=sha256:f22af3c78abfbc7cbcdf2c55d23c3e022e1a462ee2481011d518c7fb9c9f3d65 \ - --hash=sha256:fae1e637f527750811588e4582988932c222f8251f7b7ea93739acb624e1487f \ - --hash=sha256:fed5aaca1750e46db870874c9c273cd5182a9e9deb16f06f7bdffdb5c2bde4b9 - # via - # -r py/requirements.txt - # pyopenssl +cryptography==45.0.4 \ + --hash=sha256:0339a692de47084969500ee455e42c58e449461e0ec845a34a6a9b9bf7df7fb8 \ + --hash=sha256:03dbff8411206713185b8cebe31bc5c0eb544799a50c09035733716b386e61a4 \ + --hash=sha256:06509dc70dd71fa56eaa138336244e2fbaf2ac164fc9b5e66828fccfd2b680d6 \ + --hash=sha256:0cf13c77d710131d33e63626bd55ae7c0efb701ebdc2b3a7952b9b23a0412862 \ + --hash=sha256:23b9c3ea30c3ed4db59e7b9619272e94891f8a3a5591d0b656a7582631ccf750 \ + --hash=sha256:25eb4d4d3e54595dc8adebc6bbd5623588991d86591a78c2548ffb64797341e2 \ + --hash=sha256:2882338b2a6e0bd337052e8b9007ced85c637da19ef9ecaf437744495c8c2999 \ + --hash=sha256:3530382a43a0e524bc931f187fc69ef4c42828cf7d7f592f7f249f602b5a4ab0 \ + --hash=sha256:425a9a6ac2823ee6e46a76a21a4e8342d8fa5c01e08b823c1f19a8b74f096069 \ + --hash=sha256:46cf7088bf91bdc9b26f9c55636492c1cce3e7aaf8041bbf0243f5e5325cfb2d \ + --hash=sha256:4828190fb6c4bcb6ebc6331f01fe66ae838bb3bd58e753b59d4b22eb444b996c \ + --hash=sha256:49fe9155ab32721b9122975e168a6760d8ce4cffe423bcd7ca269ba41b5dfac1 \ + --hash=sha256:4ca0f52170e821bc8da6fc0cc565b7bb8ff8d90d36b5e9fdd68e8a86bdf72036 \ + --hash=sha256:51dfbd4d26172d31150d84c19bbe06c68ea4b7f11bbc7b3a5e146b367c311349 \ + --hash=sha256:5f31e6b0a5a253f6aa49be67279be4a7e5a4ef259a9f33c69f7d1b1191939872 \ + --hash=sha256:627ba1bc94f6adf0b0a2e35d87020285ead22d9f648c7e75bb64f367375f3b22 \ + --hash=sha256:680806cf63baa0039b920f4976f5f31b10e772de42f16310a6839d9f21a26b0d \ + --hash=sha256:6a3511ae33f09094185d111160fd192c67aa0a2a8d19b54d36e4c78f651dc5ad \ + --hash=sha256:6a5bf57554e80f75a7db3d4b1dacaa2764611ae166ab42ea9a72bcdb5d577637 \ + --hash=sha256:6b613164cb8425e2f8db5849ffb84892e523bf6d26deb8f9bb76ae86181fa12b \ + --hash=sha256:7405ade85c83c37682c8fe65554759800a4a8c54b2d96e0f8ad114d31b808d57 \ + --hash=sha256:7aad98a25ed8ac917fdd8a9c1e706e5a0956e06c498be1f713b61734333a4507 \ + --hash=sha256:7bedbe4cc930fa4b100fc845ea1ea5788fcd7ae9562e669989c11618ae8d76ee \ + --hash=sha256:7ef2dde4fa9408475038fc9aadfc1fb2676b174e68356359632e980c661ec8f6 \ + --hash=sha256:817ee05c6c9f7a69a16200f0c90ab26d23a87701e2a284bd15156783e46dbcc8 \ + --hash=sha256:944e9ccf67a9594137f942d5b52c8d238b1b4e46c7a0c2891b7ae6e01e7c80a4 \ + --hash=sha256:964bcc28d867e0f5491a564b7debb3ffdd8717928d315d12e0d7defa9e43b723 \ + --hash=sha256:96d4819e25bf3b685199b304a0029ce4a3caf98947ce8a066c9137cc78ad2c58 \ + --hash=sha256:a77c6fb8d76e9c9f99f2f3437c1a4ac287b34eaf40997cfab1e9bd2be175ac39 \ + --hash=sha256:b0a97c927497e3bc36b33987abb99bf17a9a175a19af38a892dc4bbb844d7ee2 \ + --hash=sha256:b97737a3ffbea79eebb062eb0d67d72307195035332501722a9ca86bab9e3ab2 \ + --hash=sha256:bbc505d1dc469ac12a0a064214879eac6294038d6b24ae9f71faae1448a9608d \ + --hash=sha256:c22fe01e53dc65edd1945a2e6f0015e887f84ced233acecb64b4daadb32f5c97 \ + --hash=sha256:ce1678a2ccbe696cf3af15a75bb72ee008d7ff183c9228592ede9db467e64f1b \ + --hash=sha256:e00a6c10a5c53979d6242f123c0a97cff9f3abed7f064fc412c36dc521b5f257 \ + --hash=sha256:eaa3e28ea2235b33220b949c5a0d6cf79baa80eab2eb5607ca8ab7525331b9ff \ + --hash=sha256:f3fe7a5ae34d5a414957cc7f457e2b92076e72938423ac64d215722f6cf49a9e + # via + # -r py/requirements.txt # secretstorage debugpy==1.8.14 \ --hash=sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15 \ @@ -396,111 +391,117 @@ more-itertools==10.7.0 \ # -r py/requirements.txt # jaraco-classes # jaraco-functools -multidict==6.4.4 \ - --hash=sha256:0327ad2c747a6600e4797d115d3c38a220fdb28e54983abe8964fd17e95ae83c \ - --hash=sha256:058cc59b9e9b143cc56715e59e22941a5d868c322242278d28123a5d09cdf6b0 \ - --hash=sha256:0d2b9712211b860d123815a80b859075d86a4d54787e247d7fbee9db6832cf1c \ - --hash=sha256:0e05c39962baa0bb19a6b210e9b1422c35c093b651d64246b6c2e1a7e242d9fd \ - --hash=sha256:0f14ea68d29b43a9bf37953881b1e3eb75b2739e896ba4a6aa4ad4c5b9ffa145 \ - --hash=sha256:169c4ba7858176b797fe551d6e99040c531c775d2d57b31bcf4de6d7a669847f \ - --hash=sha256:19d08b4f22eae45bb018b9f06e2838c1e4b853c67628ef8ae126d99de0da6395 \ - --hash=sha256:1d0121ccce8c812047d8d43d691a1ad7641f72c4f730474878a5aeae1b8ead8c \ - --hash=sha256:232b7237e57ec3c09be97206bfb83a0aa1c5d7d377faa019c68a210fa35831f1 \ - --hash=sha256:2e543a40e4946cf70a88a3be87837a3ae0aebd9058ba49e91cacb0b2cd631e2b \ - --hash=sha256:329ae97fc2f56f44d91bc47fe0972b1f52d21c4b7a2ac97040da02577e2daca2 \ - --hash=sha256:3312f63261b9df49be9d57aaa6abf53a6ad96d93b24f9cc16cf979956355ce6e \ - --hash=sha256:33a12ebac9f380714c298cbfd3e5b9c0c4e89c75fe612ae496512ee51028915f \ - --hash=sha256:343892a27d1a04d6ae455ecece12904d242d299ada01633d94c4f431d68a8c49 \ - --hash=sha256:3e9f1cd61a0ab857154205fb0b1f3d3ace88d27ebd1409ab7af5096e409614cd \ - --hash=sha256:3ef4e9096ff86dfdcbd4a78253090ba13b1d183daa11b973e842465d94ae1772 \ - --hash=sha256:4219390fb5bf8e548e77b428bb36a21d9382960db5321b74d9d9987148074d6b \ - --hash=sha256:496bcf01c76a70a31c3d746fd39383aad8d685ce6331e4c709e9af4ced5fa221 \ - --hash=sha256:49a29d7133b1fc214e818bbe025a77cc6025ed9a4f407d2850373ddde07fd04a \ - --hash=sha256:4d7b50b673ffb4ff4366e7ab43cf1f0aef4bd3608735c5fbdf0bdb6f690da411 \ - --hash=sha256:4efc31dfef8c4eeb95b6b17d799eedad88c4902daba39ce637e23a17ea078915 \ - --hash=sha256:4f5f29794ac0e73d2a06ac03fd18870adc0135a9d384f4a306a951188ed02f95 \ - --hash=sha256:4ffc3c6a37e048b5395ee235e4a2a0d639c2349dffa32d9367a42fc20d399772 \ - --hash=sha256:50855d03e9e4d66eab6947ba688ffb714616f985838077bc4b490e769e48da51 \ - --hash=sha256:51d662c072579f63137919d7bb8fc250655ce79f00c82ecf11cab678f335062e \ - --hash=sha256:530d86827a2df6504526106b4c104ba19044594f8722d3e87714e847c74a0275 \ - --hash=sha256:5363f9b2a7f3910e5c87d8b1855c478c05a2dc559ac57308117424dfaad6805c \ - --hash=sha256:55ae0721c1513e5e3210bca4fc98456b980b0c2c016679d3d723119b6b202c42 \ - --hash=sha256:5883d6ee0fd9d8a48e9174df47540b7545909841ac82354c7ae4cbe9952603bd \ - --hash=sha256:5bce06b83be23225be1905dcdb6b789064fae92499fbc458f59a8c0e68718601 \ - --hash=sha256:5e0ba18a9afd495f17c351d08ebbc4284e9c9f7971d715f196b79636a4d0de44 \ - --hash=sha256:5e2bcda30d5009996ff439e02a9f2b5c3d64a20151d34898c000a6281faa3781 \ - --hash=sha256:603f39bd1cf85705c6c1ba59644b480dfe495e6ee2b877908de93322705ad7cf \ - --hash=sha256:60d849912350da557fe7de20aa8cf394aada6980d0052cc829eeda4a0db1c1db \ - --hash=sha256:622f26ea6a7e19b7c48dd9228071f571b2fbbd57a8cd71c061e848f281550e6b \ - --hash=sha256:632a3bf8f1787f7ef7d3c2f68a7bde5be2f702906f8b5842ad6da9d974d0aab3 \ - --hash=sha256:66ed0731f8e5dfd8369a883b6e564aca085fb9289aacabd9decd70568b9a30de \ - --hash=sha256:69133376bc9a03f8c47343d33f91f74a99c339e8b58cea90433d8e24bb298031 \ - --hash=sha256:69ee9e6ba214b5245031b76233dd95408a0fd57fdb019ddcc1ead4790932a8e8 \ - --hash=sha256:6a2f58a66fe2c22615ad26156354005391e26a2f3721c3621504cd87c1ea87bf \ - --hash=sha256:6a602151dbf177be2450ef38966f4be3467d41a86c6a845070d12e17c858a156 \ - --hash=sha256:6ed5ae5605d4ad5a049fad2a28bb7193400700ce2f4ae484ab702d1e3749c3f9 \ - --hash=sha256:73484a94f55359780c0f458bbd3c39cb9cf9c182552177d2136e828269dee529 \ - --hash=sha256:75493f28dbadecdbb59130e74fe935288813301a8554dc32f0c631b6bdcdf8b0 \ - --hash=sha256:7cf3bd54c56aa16fdb40028d545eaa8d051402b61533c21e84046e05513d5780 \ - --hash=sha256:7e23f2f841fcb3ebd4724a40032d32e0892fbba4143e43d2a9e7695c5e50e6bd \ - --hash=sha256:7f3d3b3c34867579ea47cbd6c1f2ce23fbfd20a273b6f9e3177e256584f1eacc \ - --hash=sha256:82ffabefc8d84c2742ad19c37f02cde5ec2a1ee172d19944d380f920a340e4b9 \ - --hash=sha256:83ec4967114295b8afd120a8eec579920c882831a3e4c3331d591a8e5bfbbc0f \ - --hash=sha256:87a728af265e08f96b6318ebe3c0f68b9335131f461efab2fc64cc84a44aa6ed \ - --hash=sha256:87cb72263946b301570b0f63855569a24ee8758aaae2cd182aae7d95fbc92ca7 \ - --hash=sha256:8adee3ac041145ffe4488ea73fa0a622b464cc25340d98be76924d0cda8545ff \ - --hash=sha256:8cc403092a49509e8ef2d2fd636a8ecefc4698cc57bbe894606b14579bc2a955 \ - --hash=sha256:8cd8f81f1310182362fb0c7898145ea9c9b08a71081c5963b40ee3e3cac589b1 \ - --hash=sha256:8ffb40b74400e4455785c2fa37eba434269149ec525fc8329858c862e4b35373 \ - --hash=sha256:93ec84488a384cd7b8a29c2c7f467137d8a73f6fe38bb810ecf29d1ade011a7c \ - --hash=sha256:941f1bec2f5dbd51feeb40aea654c2747f811ab01bdd3422a48a4e4576b7d76a \ - --hash=sha256:98af87593a666f739d9dba5d0ae86e01b0e1a9cfcd2e30d2d361fbbbd1a9162d \ - --hash=sha256:995f985e2e268deaf17867801b859a282e0448633f1310e3704b30616d269d69 \ - --hash=sha256:9abcf56a9511653fa1d052bfc55fbe53dbee8f34e68bd6a5a038731b0ca42d15 \ - --hash=sha256:9bbf7bd39822fd07e3609b6b4467af4c404dd2b88ee314837ad1830a7f4a8299 \ - --hash=sha256:9c17341ee04545fd962ae07330cb5a39977294c883485c8d74634669b1f7fe04 \ - --hash=sha256:9f193eeda1857f8e8d3079a4abd258f42ef4a4bc87388452ed1e1c4d2b0c8740 \ - --hash=sha256:9faf1b1dcaadf9f900d23a0e6d6c8eadd6a95795a0e57fcca73acce0eb912065 \ - --hash=sha256:9fcad2945b1b91c29ef2b4050f590bfcb68d8ac8e0995a74e659aa57e8d78e01 \ - --hash=sha256:a145c550900deb7540973c5cdb183b0d24bed6b80bf7bddf33ed8f569082535e \ - --hash=sha256:a4d1cb1327c6082c4fce4e2a438483390964c02213bc6b8d782cf782c9b1471f \ - --hash=sha256:a887b77f51d3d41e6e1a63cf3bc7ddf24de5939d9ff69441387dfefa58ac2e26 \ - --hash=sha256:a920f9cf2abdf6e493c519492d892c362007f113c94da4c239ae88429835bad1 \ - --hash=sha256:aff4cafea2d120327d55eadd6b7f1136a8e5a0ecf6fb3b6863e8aca32cd8e50a \ - --hash=sha256:b0f1987787f5f1e2076b59692352ab29a955b09ccc433c1f6b8e8e18666f608b \ - --hash=sha256:b308402608493638763abc95f9dc0030bbd6ac6aff784512e8ac3da73a88af08 \ - --hash=sha256:b61e98c3e2a861035aaccd207da585bdcacef65fe01d7a0d07478efac005e028 \ - --hash=sha256:b9eb4c59c54421a32b3273d4239865cb14ead53a606db066d7130ac80cc8ec93 \ - --hash=sha256:ba852168d814b2c73333073e1c7116d9395bea69575a01b0b3c89d2d5a87c8fb \ - --hash=sha256:bb5ac9e5bfce0e6282e7f59ff7b7b9a74aa8e5c60d38186a4637f5aa764046ad \ - --hash=sha256:bb61ffd3ab8310d93427e460f565322c44ef12769f51f77277b4abad7b6f7223 \ - --hash=sha256:bbfcb60396f9bcfa63e017a180c3105b8c123a63e9d1428a36544e7d37ca9e20 \ - --hash=sha256:bd4557071b561a8b3b6075c3ce93cf9bfb6182cb241805c3d66ced3b75eff4ac \ - --hash=sha256:be06e73c06415199200e9a2324a11252a3d62030319919cde5e6950ffeccf72e \ - --hash=sha256:c04157266344158ebd57b7120d9b0b35812285d26d0e78193e17ef57bfe2979a \ - --hash=sha256:c10d17371bff801af0daf8b073c30b6cf14215784dc08cd5c43ab5b7b8029bbc \ - --hash=sha256:c27e5dcf520923d6474d98b96749e6805f7677e93aaaf62656005b8643f907ab \ - --hash=sha256:c93a6fb06cc8e5d3628b2b5fda215a5db01e8f08fc15fadd65662d9b857acbe4 \ - --hash=sha256:cbebaa076aaecad3d4bb4c008ecc73b09274c952cf6a1b78ccfd689e51f5a5b0 \ - --hash=sha256:cc5d83c6619ca5c9672cb78b39ed8542f1975a803dee2cda114ff73cbb076edd \ - --hash=sha256:d1a20707492db9719a05fc62ee215fd2c29b22b47c1b1ba347f9abc831e26683 \ - --hash=sha256:d1f7cbd4f1f44ddf5fd86a8675b7679176eae770f2fc88115d6dddb6cefb59bc \ - --hash=sha256:d21c1212171cf7da703c5b0b7a0e85be23b720818aef502ad187d627316d5645 \ - --hash=sha256:d2fa86af59f8fc1972e121ade052145f6da22758f6996a197d69bb52f8204e7e \ - --hash=sha256:d5b1cc3ab8c31d9ebf0faa6e3540fb91257590da330ffe6d2393d4208e638925 \ - --hash=sha256:d693307856d1ef08041e8b6ff01d5b4618715007d288490ce2c7e29013c12b9a \ - --hash=sha256:d6b15c55721b1b115c5ba178c77104123745b1417527ad9641a4c5e2047450f0 \ - --hash=sha256:d832c608f94b9f92a0ec8b7e949be7792a642b6e535fcf32f3e28fab69eeb046 \ - --hash=sha256:d83f18315b9fca5db2452d1881ef20f79593c4aa824095b62cb280019ef7aa3d \ - --hash=sha256:d877447e7368c7320832acb7159557e49b21ea10ffeb135c1077dbbc0816b598 \ - --hash=sha256:dc388f75a1c00000824bf28b7633e40854f4127ede80512b44c3cfeeea1839a2 \ - --hash=sha256:dc8c9736d8574b560634775ac0def6bdc1661fc63fa27ffdfc7264c565bcb4f2 \ - --hash=sha256:e32053d6d3a8b0dfe49fde05b496731a0e6099a4df92154641c00aa76786aef5 \ - --hash=sha256:e5f8a146184da7ea12910a4cec51ef85e44f6268467fb489c3caf0cd512f29c2 \ - --hash=sha256:ecde56ea2439b96ed8a8d826b50c57364612ddac0438c39e473fafad7ae1c23b \ - --hash=sha256:f682c42003c7264134bfe886376299db4cc0c6cd06a3295b41b347044bcb5482 \ - --hash=sha256:fad6daaed41021934917f4fb03ca2db8d8a4d79bf89b17ebe77228eb6710c003 \ - --hash=sha256:fc60f91c02e11dfbe3ff4e1219c085695c339af72d1641800fe6075b91850c8f +multidict==6.5.0 \ + --hash=sha256:03c0923da300120830fc467e23805d63bbb4e98b94032bd863bc7797ea5fa653 \ + --hash=sha256:046a7540cfbb4d5dc846a1fd9843f3ba980c6523f2e0c5b8622b4a5c94138ae6 \ + --hash=sha256:08db204213d0375a91a381cae0677ab95dd8c67a465eb370549daf6dbbf8ba10 \ + --hash=sha256:0ad73a60e11aa92f1f2c9330efdeaac4531b719fc568eb8d312fd4112f34cc18 \ + --hash=sha256:0b5ac6ebaf5d9814b15f399337ebc6d3a7f4ce9331edd404e76c49a01620b68d \ + --hash=sha256:0e5b19f8cd67235fab3e195ca389490415d9fef5a315b1fa6f332925dc924262 \ + --hash=sha256:0ec1c3fbbb0b655a6540bce408f48b9a7474fd94ed657dcd2e890671fefa7743 \ + --hash=sha256:0f32a1777465a35c35ddbbd7fc1293077938a69402fcc59e40b2846d04a120dd \ + --hash=sha256:177b081e4dec67c3320b16b3aa0babc178bbf758553085669382c7ec711e1ec8 \ + --hash=sha256:17f78a52c214481d30550ec18208e287dfc4736f0c0148208334b105fd9e0887 \ + --hash=sha256:1bb986c8ea9d49947bc325c51eced1ada6d8d9b4c5b15fd3fcdc3c93edef5a74 \ + --hash=sha256:20d30c9410ac3908abbaa52ee5967a754c62142043cf2ba091e39681bd51d21a \ + --hash=sha256:220c74009507e847a3a6fc5375875f2a2e05bd9ce28cf607be0e8c94600f4472 \ + --hash=sha256:2261b538145723ca776e55208640fffd7ee78184d223f37c2b40b9edfe0e818a \ + --hash=sha256:2540395b63723da748f850568357a39cd8d8d4403ca9439f9fcdad6dd423c780 \ + --hash=sha256:2966d0099cb2e2039f9b0e73e7fd5eb9c85805681aa2a7f867f9d95b35356921 \ + --hash=sha256:2d24a00d34808b22c1f15902899b9d82d0faeca9f56281641c791d8605eacd35 \ + --hash=sha256:2e118a202904623b1d2606d1c8614e14c9444b59d64454b0c355044058066469 \ + --hash=sha256:300da0fa4f8457d9c4bd579695496116563409e676ac79b5e4dca18e49d1c308 \ + --hash=sha256:3233f21abdcd180b2624eb6988a1e1287210e99bca986d8320afca5005d85844 \ + --hash=sha256:3e86eb90015c6f21658dbd257bb8e6aa18bdb365b92dd1fba27ec04e58cdc31b \ + --hash=sha256:3f805b8b951d1fadc5bc18c3c93e509608ac5a883045ee33bc22e28806847c20 \ + --hash=sha256:3fe9fada8bc0839466b09fa3f6894f003137942984843ec0c3848846329a36ae \ + --hash=sha256:40ff26f58323795f5cd2855e2718a1720a1123fb90df4553426f0efd76135462 \ + --hash=sha256:42bdee30424c1f4dcda96e07ac60e2a4ede8a89f8ae2f48b5e4ccc060f294c52 \ + --hash=sha256:44cb5c53fb2d4cbcee70a768d796052b75d89b827643788a75ea68189f0980a1 \ + --hash=sha256:46bb05d50219655c42a4b8fcda9c7ee658a09adbb719c48e65a20284e36328ea \ + --hash=sha256:4c78d5ec00fdd35c91680ab5cf58368faad4bd1a8721f87127326270248de9bc \ + --hash=sha256:4d30a2cc106a7d116b52ee046207614db42380b62e6b1dd2a50eba47c5ca5eb1 \ + --hash=sha256:4e990cbcb6382f9eae4ec720bcac6a1351509e6fc4a5bb70e4984b27973934e6 \ + --hash=sha256:51d33fafa82640c0217391d4ce895d32b7e84a832b8aee0dcc1b04d8981ec7f4 \ + --hash=sha256:529b03600466480ecc502000d62e54f185a884ed4570dee90d9a273ee80e37b5 \ + --hash=sha256:53d92df1752df67a928fa7f884aa51edae6f1cf00eeb38cbcf318cf841c17456 \ + --hash=sha256:54f524d73f4d54e87e03c98f6af601af4777e4668a52b1bd2ae0a4d6fc7b392b \ + --hash=sha256:5634b35f225977605385f56153bd95a7133faffc0ffe12ad26e10517537e8dfc \ + --hash=sha256:58b2ded1a7982cf7b8322b0645713a0086b2b3cf5bb9f7c01edfc1a9f98d20dc \ + --hash=sha256:5b02e1ca495d71e07e652e4cef91adae3bf7ae4493507a263f56e617de65dafc \ + --hash=sha256:5cc7968b7d1bf8b973c307d38aa3a2f2c783f149bcac855944804252f1df5105 \ + --hash=sha256:60c3f8f13d443426c55f88cf3172547bbc600a86d57fd565458b9259239a6737 \ + --hash=sha256:63b3b24fadc7067282c88fae5b2f366d5b3a7c15c021c2838de8c65a50eeefb4 \ + --hash=sha256:64306121171d988af77d74be0d8c73ee1a69cf6f96aea7fa6030c88f32a152dd \ + --hash=sha256:67c4a640952371c9ca65b6a710598be246ef3be5ca83ed38c16a7660d3980877 \ + --hash=sha256:680210de2c38eef17ce46b8df8bf2c1ece489261a14a6e43c997d49843a27c99 \ + --hash=sha256:6994bad9d471ef2156f2b6850b51e20ee409c6b9deebc0e57be096be9faffdce \ + --hash=sha256:69ad681ad7c93a41ee7005cc83a144b5b34a3838bcf7261e2b5356057b0f78de \ + --hash=sha256:6bb5f65ff91daf19ce97f48f63585e51595539a8a523258b34f7cef2ec7e0617 \ + --hash=sha256:6c65068cc026f217e815fa519d8e959a7188e94ec163ffa029c94ca3ef9d4a73 \ + --hash=sha256:6cb9bcedd9391b313e5ec2fb3aa07c03e050550e7b9e4646c076d5c24ba01532 \ + --hash=sha256:6dcee5e7e92060b4bb9bb6f01efcbb78c13d0e17d9bc6eec71660dd71dc7b0c2 \ + --hash=sha256:70b599f70ae6536e5976364d3c3cf36f40334708bd6cebdd1e2438395d5e7676 \ + --hash=sha256:7673ee4f63879ecd526488deb1989041abcb101b2d30a9165e1e90c489f3f7fb \ + --hash=sha256:76803a29fd71869a8b59c2118c9dcfb3b8f9c8723e2cce6baeb20705459505cf \ + --hash=sha256:7f78caf409914f108f4212b53a9033abfdc2cbab0647e9ac3a25bb0f21ab43d2 \ + --hash=sha256:7fe92a62326eef351668eec4e2dfc494927764a0840a1895cff16707fceffcd3 \ + --hash=sha256:80d696fa38d738fcebfd53eec4d2e3aeb86a67679fd5e53c325756682f152826 \ + --hash=sha256:828bab777aa8d29d59700018178061854e3a47727e0611cb9bec579d3882de3b \ + --hash=sha256:82d0cf0ea49bae43d9e8c3851e21954eff716259ff42da401b668744d1760bcb \ + --hash=sha256:84a51e3baa77ded07be4766a9e41d977987b97e49884d4c94f6d30ab6acaee14 \ + --hash=sha256:84ca75ad8a39ed75f079a8931435a5b51ee4c45d9b32e1740f99969a5d1cc2ee \ + --hash=sha256:86fb42ed5ed1971c642cc52acc82491af97567534a8e381a8d50c02169c4e684 \ + --hash=sha256:8b2d61afbafc679b7eaf08e9de4fa5d38bd5dc7a9c0a577c9f9588fb49f02dbb \ + --hash=sha256:8b4bf6bb15a05796a07a248084e3e46e032860c899c7a9b981030e61368dba95 \ + --hash=sha256:8de67f79314d24179e9b1869ed15e88d6ba5452a73fc9891ac142e0ee018b5d6 \ + --hash=sha256:9232a117341e7e979d210e41c04e18f1dc3a1d251268df6c818f5334301274e1 \ + --hash=sha256:942bd8002492ba819426a8d7aefde3189c1b87099cdf18aaaefefcf7f3f7b6d2 \ + --hash=sha256:95750a9a9741cd1855d1b6cb4c6031ae01c01ad38d280217b64bfae986d39d56 \ + --hash=sha256:96d109e663d032280ef8ef62b50924b2e887d5ddf19e301844a6cb7e91a172a6 \ + --hash=sha256:9a19bd108c35877b57393243d392d024cfbfdefe759fd137abb98f6fc910b64c \ + --hash=sha256:9cc1e10c14ce8112d1e6d8971fe3cdbe13e314f68bea0e727429249d4a6ce164 \ + --hash=sha256:a05b5604c5a75df14a63eeeca598d11b2c3745b9008539b70826ea044063a572 \ + --hash=sha256:a10227168a24420c158747fc201d4279aa9af1671f287371597e2b4f2ff21879 \ + --hash=sha256:a133e7ddc9bc7fb053733d0ff697ce78c7bf39b5aec4ac12857b6116324c8d75 \ + --hash=sha256:a42995bdcaff4e22cb1280ae7752c3ed3fbb398090c6991a2797a4a0e5ed16a9 \ + --hash=sha256:a72933bc308d7a64de37f0d51795dbeaceebdfb75454f89035cdfc6a74cfd129 \ + --hash=sha256:a7d130ed7a112e25ab47309962ecafae07d073316f9d158bc7b3936b52b80121 \ + --hash=sha256:a9695fc1462f17b131c111cf0856a22ff154b0480f86f539d24b2778571ff94d \ + --hash=sha256:aadc3cb78be90a887f8f6b73945b840da44b4a483d1c9750459ae69687940c97 \ + --hash=sha256:b15f817276c96cde9060569023808eec966bd8da56a97e6aa8116f34ddab6534 \ + --hash=sha256:b4ac1dd5eb0ecf6f7351d5a9137f30a83f7182209c5d37f61614dfdce5714853 \ + --hash=sha256:b4bf507c991db535a935b2127cf057a58dbc688c9f309c72080795c63e796f58 \ + --hash=sha256:b4e47ef51237841d1087e1e1548071a6ef22e27ed0400c272174fa585277c4b4 \ + --hash=sha256:b555329c9894332401f03b9a87016f0b707b6fccd4706793ec43b4a639e75869 \ + --hash=sha256:b8a09aec921b34bd8b9f842f0bcfd76c6a8c033dc5773511e15f2d517e7e1068 \ + --hash=sha256:bab4a8337235365f4111a7011a1f028826ca683834ebd12de4b85e2844359c36 \ + --hash=sha256:be4c08f3a2a6cc42b414496017928d95898964fed84b1b2dace0c9ee763061f9 \ + --hash=sha256:bee5c0b79fca78fd2ab644ca4dc831ecf793eb6830b9f542ee5ed2c91bc35a0e \ + --hash=sha256:c0078358470da8dc90c37456f4a9cde9f86200949a048d53682b9cd21e5bbf2b \ + --hash=sha256:c96aedff25f4e47b6697ba048b2c278f7caa6df82c7c3f02e077bcc8d47b4b76 \ + --hash=sha256:cbbc88abea2388fde41dd574159dec2cda005cb61aa84950828610cb5010f21a \ + --hash=sha256:d1c185fc1069781e3fc8b622c4331fb3b433979850392daa5efbb97f7f9959bb \ + --hash=sha256:d245973d4ecc04eea0a8e5ebec7882cf515480036e1b48e65dffcfbdf86d00be \ + --hash=sha256:d8646b4259450c59b9286db280dd57745897897284f6308edbdf437166d93855 \ + --hash=sha256:d98f4ac9c1ede7e9d04076e2e6d967e15df0079a6381b297270f6bcab661195e \ + --hash=sha256:d99a59d64bb1f7f2117bec837d9e534c5aeb5dcedf4c2b16b9753ed28fdc20a3 \ + --hash=sha256:df7ecbc65a53a2ce1b3a0c82e6ad1a43dcfe7c6137733f9176a92516b9f5b851 \ + --hash=sha256:e053a4d690f4352ce46583080fefade9a903ce0fa9d820db1be80bdb9304fa2f \ + --hash=sha256:e279259bcb936732bfa1a8eec82b5d2352b3df69d2fa90d25808cfc403cee90a \ + --hash=sha256:e2977ef8b7ce27723ee8c610d1bd1765da4f3fbe5a64f9bf1fd3b4770e31fbc0 \ + --hash=sha256:e355ac668a8c3e49c2ca8daa4c92f0ad5b705d26da3d5af6f7d971e46c096da7 \ + --hash=sha256:e3b1425fe54ccfde66b8cfb25d02be34d5dfd2261a71561ffd887ef4088b4b69 \ + --hash=sha256:e80de5ad995de210fd02a65c2350649b8321d09bd2e44717eaefb0f5814503e8 \ + --hash=sha256:e8ef15cc97c9890212e1caf90f0d63f6560e1e101cf83aeaf63a57556689fb34 \ + --hash=sha256:e95c5e07a06594bdc288117ca90e89156aee8cb2d7c330b920d9c3dd19c05414 \ + --hash=sha256:f34a90fbd9959d0f857323bd3c52b3e6011ed48f78d7d7b9e04980b8a41da3af \ + --hash=sha256:f94c6ea6405fcf81baef1e459b209a78cda5442e61b5b7a57ede39d99b5204a0 \ + --hash=sha256:fa097ae2a29f573de7e2d86620cbdda5676d27772d4ed2669cfa9961a0d73955 \ + --hash=sha256:fcb2aa79ac6aef8d5b709bbfc2fdb1d75210ba43038d70fbb595b35af470ce06 \ + --hash=sha256:fdeae096ca36c12d8aca2640b8407a9d94e961372c68435bef14e31cce726138 \ + --hash=sha256:ff07b504c23b67f2044533244c230808a1258b3493aaf3ea2a0785f70b7be461 \ + --hash=sha256:ffa58e3e215af8f6536dc837a990e456129857bb6fd546b3991be470abd9597a # via -r py/requirements.txt nh3==0.2.21 \ --hash=sha256:087ffadfdcd497658c3adc797258ce0f06be8a537786a7217649fc1c0c60c293 \ @@ -579,14 +580,6 @@ pygments==2.19.1 \ # pytest # readme-renderer # rich -pyopenssl==25.1.0 \ - --hash=sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab \ - --hash=sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b - # via -r py/requirements.txt -pyparsing==3.2.3 \ - --hash=sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf \ - --hash=sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be - # via -r py/requirements.txt pyproject-api==1.9.1 \ --hash=sha256:43c9918f49daab37e302038fc1aed54a8c7a91a9fa935d00b9a485f37e0f5335 \ --hash=sha256:7d6238d92f8962773dd75b5f0c4a6a27cce092a14b623b811dba656f3b628948 @@ -600,9 +593,9 @@ pysocks==1.7.1 \ # via # -r py/requirements.txt # urllib3 -pytest==8.4.0 \ - --hash=sha256:14d920b48472ea0dbf68e45b96cd1ffda4705f33307dcc86c676c1b5104838a6 \ - --hash=sha256:f40f825768ad76c0977cbacdf1fd37c6f7a468e460ea6a0636078f8972d4517e +pytest==8.4.1 \ + --hash=sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7 \ + --hash=sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c # via # -r py/requirements.txt # pytest-instafail @@ -620,15 +613,19 @@ pytest-trio==0.8.0 \ --hash=sha256:8363db6336a79e6c53375a2123a41ddbeccc4aa93f93788651641789a56fb52e \ --hash=sha256:e6a7e7351ae3e8ec3f4564d30ee77d1ec66e1df611226e5618dbb32f9545c841 # via -r py/requirements.txt +pywin32-ctypes==0.2.3 \ + --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 \ + --hash=sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755 + # via -r py/requirements.txt readme-renderer==44.0 \ --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 \ --hash=sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1 # via # -r py/requirements.txt # twine -requests==2.32.3 \ - --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ - --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +requests==2.32.4 \ + --hash=sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c \ + --hash=sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422 # via # -r py/requirements.txt # id @@ -670,10 +667,6 @@ sortedcontainers==2.4.0 \ # via # -r py/requirements.txt # trio -toml==0.10.2 \ - --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ - --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f - # via -r py/requirements.txt tomli==2.2.1 \ --hash=sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6 \ --hash=sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd \ @@ -711,9 +704,9 @@ tomli==2.2.1 \ # pyproject-api # pytest # tox -tox==4.26.0 \ - --hash=sha256:75f17aaf09face9b97bd41645028d9f722301e912be8b4c65a3f938024560224 \ - --hash=sha256:a83b3b67b0159fa58e44e646505079e35a43317a62d2ae94725e0586266faeca +tox==4.27.0 \ + --hash=sha256:2b8a7fb986b82aa2c830c0615082a490d134e0626dbc9189986da46a313c4f20 \ + --hash=sha256:b97d5ecc0c0d5755bcc5348387fef793e1bfa68eb33746412f4c60881d7f5f57 # via -r py/requirements.txt trio==0.30.0 \ --hash=sha256:0781c857c0c81f8f51e0089929a26b5bb63d57f927728a5586f7e36171f064df \ @@ -737,12 +730,11 @@ typing-extensions==4.14.0 \ # -r py/requirements.txt # exceptiongroup # multidict - # pyopenssl # rich # tox -urllib3[socks]==2.4.0 \ - --hash=sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466 \ - --hash=sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 +urllib3[socks]==2.5.0 \ + --hash=sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760 \ + --hash=sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc # via # -r py/requirements.txt # requests @@ -763,9 +755,9 @@ wsproto==1.2.0 \ # via # -r py/requirements.txt # trio-websocket -zipp==3.22.0 \ - --hash=sha256:dd2f28c3ce4bc67507bfd3781d21b7bb2be31103b51a4553ad7d90b84e57ace5 \ - --hash=sha256:fe208f65f2aca48b81f9e6fd8cf7b8b32c26375266b009b413d45306b6148343 +zipp==3.23.0 \ + --hash=sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e \ + --hash=sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166 # via # -r py/requirements.txt # importlib-metadata From a732eb7d92e34b0514c48862ef10c155655e6c65 Mon Sep 17 00:00:00 2001 From: Corey Goldberg <1113081+cgoldberg@users.noreply.github.com> Date: Thu, 19 Jun 2025 10:32:22 -0400 Subject: [PATCH 3/3] [py] Update unit tests --- .../remote/remote_connection_tests.py | 112 +++++++++++------- 1 file changed, 66 insertions(+), 46 deletions(-) diff --git a/py/test/unit/selenium/webdriver/remote/remote_connection_tests.py b/py/test/unit/selenium/webdriver/remote/remote_connection_tests.py index 2c126878691cc..f0713b8a9df12 100644 --- a/py/test/unit/selenium/webdriver/remote/remote_connection_tests.py +++ b/py/test/unit/selenium/webdriver/remote/remote_connection_tests.py @@ -19,7 +19,8 @@ from urllib import parse import pytest -import urllib3 +from urllib3 import PoolManager, ProxyManager, make_headers +from urllib3.contrib.socks import SOCKSProxyManager from urllib3.util import Retry, Timeout from selenium import __version__ @@ -90,7 +91,11 @@ def test_get_proxy_url_http(mock_proxy_settings): def test_get_auth_header_if_client_config_pass_basic_auth(): custom_config = ClientConfig( - remote_server_addr="http://remote", keep_alive=True, username="user", password="pass", auth_type=AuthType.BASIC + remote_server_addr="http://localhost:4444", + keep_alive=True, + username="user", + password="pass", + auth_type=AuthType.BASIC, ) remote_connection = RemoteConnection(custom_config.remote_server_addr, client_config=custom_config) headers = remote_connection.client_config.get_auth_header() @@ -99,7 +104,7 @@ def test_get_auth_header_if_client_config_pass_basic_auth(): def test_get_auth_header_if_client_config_pass_bearer_token(): custom_config = ClientConfig( - remote_server_addr="http://remote", keep_alive=True, auth_type=AuthType.BEARER, token="dXNlcjpwYXNz" + remote_server_addr="http://localhost:4444", keep_alive=True, auth_type=AuthType.BEARER, token="dXNlcjpwYXNz" ) remote_connection = RemoteConnection(custom_config.remote_server_addr, client_config=custom_config) headers = remote_connection.client_config.get_auth_header() @@ -108,7 +113,10 @@ def test_get_auth_header_if_client_config_pass_bearer_token(): def test_get_auth_header_if_client_config_pass_x_api_key(): custom_config = ClientConfig( - remote_server_addr="http://remote", keep_alive=True, auth_type=AuthType.X_API_KEY, token="abcdefgh123456789" + remote_server_addr="http://localhost:4444", + keep_alive=True, + auth_type=AuthType.X_API_KEY, + token="abcdefgh123456789", ) remote_connection = RemoteConnection(custom_config.remote_server_addr, client_config=custom_config) headers = remote_connection.client_config.get_auth_header() @@ -129,9 +137,9 @@ def test_get_proxy_url_https_via_client_config(): ) remote_connection = RemoteConnection(client_config=client_config) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.ProxyManager) + assert isinstance(conn, ProxyManager) conn.proxy_url = "https://http_proxy.com:8080" - conn.connection_pool_kw["proxy_headers"] = urllib3.make_headers(proxy_basic_auth="admin:admin") + conn.connection_pool_kw["proxy_headers"] = make_headers(proxy_basic_auth="admin:admin") def test_get_proxy_url_http_via_client_config(): @@ -147,9 +155,9 @@ def test_get_proxy_url_http_via_client_config(): ) remote_connection = RemoteConnection(client_config=client_config) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.ProxyManager) + assert isinstance(conn, ProxyManager) conn.proxy_url = "http://http_proxy.com:8080" - conn.connection_pool_kw["proxy_headers"] = urllib3.make_headers(proxy_basic_auth="admin:admin") + conn.connection_pool_kw["proxy_headers"] = make_headers(proxy_basic_auth="admin:admin") def test_get_proxy_direct_via_client_config(): @@ -158,7 +166,7 @@ def test_get_proxy_direct_via_client_config(): ) remote_connection = RemoteConnection(client_config=client_config) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) proxy_url = remote_connection.client_config.get_proxy_url() assert proxy_url is None @@ -172,7 +180,7 @@ def test_get_proxy_system_matches_no_proxy_via_client_config(): ) remote_connection = RemoteConnection(client_config=client_config) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) proxy_url = remote_connection.client_config.get_proxy_url() assert proxy_url is None @@ -204,7 +212,7 @@ def test_get_proxy_url_https_auth(mock_proxy_auth_settings): def test_get_connection_manager_without_proxy(mock_proxy_settings_missing): remote_connection = RemoteConnection("http://remote", keep_alive=False) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) def test_get_connection_manager_for_certs_and_timeout(): @@ -223,33 +231,40 @@ def test_default_socket_timeout_is_correct(): assert conn.connection_pool_kw["timeout"] is None -def test_get_connection_manager_with_proxy(mock_proxy_settings): +def test_get_connection_manager_with_http_proxy(mock_proxy_settings): remote_connection = RemoteConnection("http://remote", keep_alive=False) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.ProxyManager) + assert isinstance(conn, ProxyManager) assert conn.proxy.scheme == "http" assert conn.proxy.host == "http_proxy.com" assert conn.proxy.port == 8080 + + +def test_get_connection_manager_with_https_proxy(mock_proxy_settings): remote_connection_https = RemoteConnection("https://remote", keep_alive=False) conn = remote_connection_https._get_connection_manager() - assert isinstance(conn, urllib3.ProxyManager) + assert isinstance(conn, ProxyManager) assert conn.proxy.scheme == "http" assert conn.proxy.host == "https_proxy.com" assert conn.proxy.port == 8080 -def test_get_connection_manager_with_auth_proxy(mock_proxy_auth_settings): - proxy_auth_header = urllib3.make_headers(proxy_basic_auth="user:password") +def test_get_connection_manager_with_auth_http_proxy(mock_proxy_auth_settings): + proxy_auth_header = make_headers(proxy_basic_auth="user:password") remote_connection = RemoteConnection("http://remote", keep_alive=False) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.ProxyManager) + assert isinstance(conn, ProxyManager) assert conn.proxy.scheme == "http" assert conn.proxy.host == "http_proxy.com" assert conn.proxy.port == 8080 assert conn.proxy_headers == proxy_auth_header + + +def test_get_connection_manager_with_auth_https_proxy(mock_proxy_auth_settings): + proxy_auth_header = make_headers(proxy_basic_auth="user:password") remote_connection_https = RemoteConnection("https://remote", keep_alive=False) conn = remote_connection_https._get_connection_manager() - assert isinstance(conn, urllib3.ProxyManager) + assert isinstance(conn, ProxyManager) assert conn.proxy.scheme == "https" assert conn.proxy.host == "https_proxy.com" assert conn.proxy.port == 8080 @@ -263,33 +278,32 @@ def test_get_connection_manager_with_auth_proxy(mock_proxy_auth_settings): ".localhost", "localhost:80", "locahost", - "127.0.0.1", "LOCALHOST", "LOCALHOST:80", "http://localhost", "https://localhost", "test.localhost", " localhost", - "::1", + "127.0.0.1", "127.0.0.2", + "::1", ], ) def test_get_connection_manager_when_no_proxy_set(mock_no_proxy_settings, url): remote_connection = RemoteConnection(url) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) def test_ignore_proxy_env_vars(mock_proxy_settings): remote_connection = RemoteConnection("http://remote", ignore_proxy=True) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) def test_get_socks_proxy_when_set(mock_socks_proxy_settings): - remote_connection = RemoteConnection("http://127.0.0.1:4444/wd/hub") + remote_connection = RemoteConnection("http://remote") conn = remote_connection._get_connection_manager() - from urllib3.contrib.socks import SOCKSProxyManager assert isinstance(conn, SOCKSProxyManager) @@ -360,17 +374,17 @@ def mock_no_proxy_settings(monkeypatch): @patch("selenium.webdriver.remote.remote_connection.RemoteConnection.get_remote_connection_headers") def test_override_user_agent_in_headers(mock_get_remote_connection_headers, remote_connection): - RemoteConnection.user_agent = "custom-agent/1.0 (python 3.8)" + RemoteConnection.user_agent = "custom-agent/1.0 (python 3.13)" mock_get_remote_connection_headers.return_value = { "Accept": "application/json", "Content-Type": "application/json;charset=UTF-8", - "User-Agent": "custom-agent/1.0 (python 3.8)", + "User-Agent": "custom-agent/1.0 (python 3.13)", } headers = RemoteConnection.get_remote_connection_headers(parse.urlparse("http://remote")) - assert headers.get("User-Agent") == "custom-agent/1.0 (python 3.8)" + assert headers.get("User-Agent") == "custom-agent/1.0 (python 3.13)" assert headers.get("Accept") == "application/json" assert headers.get("Content-Type") == "application/json;charset=UTF-8" @@ -379,7 +393,7 @@ def test_override_user_agent_in_headers(mock_get_remote_connection_headers, remo def test_override_user_agent_via_client_config(mock_get_remote_connection_headers): client_config = ClientConfig( remote_server_addr="http://localhost:4444", - user_agent="custom-agent/1.0 (python 3.8)", + user_agent="custom-agent/1.0 (python 3.13)", extra_headers={"Content-Type": "application/xml;charset=UTF-8"}, ) remote_connection = RemoteConnection(client_config=client_config) @@ -387,12 +401,12 @@ def test_override_user_agent_via_client_config(mock_get_remote_connection_header mock_get_remote_connection_headers.return_value = { "Accept": "application/json", "Content-Type": "application/xml;charset=UTF-8", - "User-Agent": "custom-agent/1.0 (python 3.8)", + "User-Agent": "custom-agent/1.0 (python 3.13)", } headers = remote_connection.get_remote_connection_headers(parse.urlparse("http://localhost:4444")) - assert headers.get("User-Agent") == "custom-agent/1.0 (python 3.8)" + assert headers.get("User-Agent") == "custom-agent/1.0 (python 3.13)" assert headers.get("Accept") == "application/json" assert headers.get("Content-Type") == "application/xml;charset=UTF-8" @@ -431,7 +445,9 @@ def test_register_extra_headers_via_client_config(mock_request): def test_backwards_compatibility_with_appium_connection(): # Keep backward compatibility for AppiumConnection - https://github.com/SeleniumHQ/selenium/issues/14694 - client_config = ClientConfig(remote_server_addr="http://remote", ca_certs="/path/to/cacert.pem", timeout=300) + client_config = ClientConfig( + remote_server_addr="http://localhost:4444", ca_certs="/path/to/cacert.pem", timeout=300 + ) remote_connection = RemoteConnection(client_config=client_config) assert remote_connection._ca_certs == "/path/to/cacert.pem" assert remote_connection._timeout == 300 @@ -443,12 +459,12 @@ def test_backwards_compatibility_with_appium_connection(): def test_get_connection_manager_with_timeout_from_client_config(): - remote_connection = RemoteConnection(remote_server_addr="http://remote", keep_alive=False) + remote_connection = RemoteConnection(remote_server_addr="http://localhost:4444", keep_alive=False) remote_connection.set_timeout(10) conn = remote_connection._get_connection_manager() assert remote_connection.get_timeout() == 10 assert conn.connection_pool_kw["timeout"] == 10 - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) def test_connection_manager_with_timeout_via_client_config(): @@ -456,45 +472,47 @@ def test_connection_manager_with_timeout_via_client_config(): remote_connection = RemoteConnection(client_config=client_config) conn = remote_connection._get_connection_manager() assert conn.connection_pool_kw["timeout"] == 300 - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) def test_get_connection_manager_with_ca_certs(): - remote_connection = RemoteConnection(remote_server_addr="http://remote") + remote_connection = RemoteConnection(remote_server_addr="http://localhost:4444") remote_connection.set_certificate_bundle_path("/path/to/cacert.pem") conn = remote_connection._get_connection_manager() assert conn.connection_pool_kw["timeout"] is None assert conn.connection_pool_kw["cert_reqs"] == "CERT_REQUIRED" assert conn.connection_pool_kw["ca_certs"] == "/path/to/cacert.pem" - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) def test_connection_manager_with_ca_certs_via_client_config(): - client_config = ClientConfig(remote_server_addr="http://remote", ca_certs="/path/to/cacert.pem") + client_config = ClientConfig(remote_server_addr="http://localhost:4444", ca_certs="/path/to/cacert.pem") remote_connection = RemoteConnection(client_config=client_config) conn = remote_connection._get_connection_manager() assert conn.connection_pool_kw["timeout"] is None assert conn.connection_pool_kw["cert_reqs"] == "CERT_REQUIRED" assert conn.connection_pool_kw["ca_certs"] == "/path/to/cacert.pem" - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) def test_get_connection_manager_ignores_certificates(): - remote_connection = RemoteConnection(remote_server_addr="http://remote", keep_alive=False, ignore_certificates=True) + remote_connection = RemoteConnection( + remote_server_addr="http://localhost:4444", keep_alive=False, ignore_certificates=True + ) remote_connection.set_timeout(10) conn = remote_connection._get_connection_manager() assert conn.connection_pool_kw["timeout"] == 10 assert conn.connection_pool_kw["cert_reqs"] == "CERT_NONE" - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) remote_connection.reset_timeout() assert remote_connection.get_timeout() is None def test_connection_manager_ignores_certificates_via_client_config(): - client_config = ClientConfig(remote_server_addr="http://remote", ignore_certificates=True, timeout=10) + client_config = ClientConfig(remote_server_addr="http://localhost:4444", ignore_certificates=True, timeout=10) remote_connection = RemoteConnection(client_config=client_config) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) assert conn.connection_pool_kw["timeout"] == 10 assert conn.connection_pool_kw["cert_reqs"] == "CERT_NONE" @@ -503,12 +521,14 @@ def test_get_connection_manager_with_custom_args(): custom_args = {"init_args_for_pool_manager": {"retries": 3, "block": True}} remote_connection = RemoteConnection( - remote_server_addr="http://remote", keep_alive=False, init_args_for_pool_manager=custom_args + remote_server_addr="http://localhost:4444", keep_alive=False, init_args_for_pool_manager=custom_args ) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.PoolManager) - assert conn.connection_pool_kw["retries"] == 3 + assert isinstance(conn, PoolManager) + assert isinstance(conn.connection_pool_kw["retries"], Retry) + assert conn.connection_pool_kw["retries"].total == 3 assert conn.connection_pool_kw["block"] is True + assert conn.connection_pool_kw["timeout"] is None def test_connection_manager_with_custom_args_via_client_config(): @@ -520,6 +540,6 @@ def test_connection_manager_with_custom_args_via_client_config(): ) remote_connection = RemoteConnection(client_config=client_config) conn = remote_connection._get_connection_manager() - assert isinstance(conn, urllib3.PoolManager) + assert isinstance(conn, PoolManager) assert conn.connection_pool_kw["retries"] == retries assert conn.connection_pool_kw["timeout"] == timeout