From d539119fedeab85bc2b0be96a47ce94f5859d3f0 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Mon, 8 May 2023 11:15:41 +0200 Subject: [PATCH 01/64] PR #493 --- CHANGES.rst | 4 ++++ docxtpl/__init__.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index d416af9..97b0841 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,7 @@ +0.16.7 (2023-05-08) +------------------- +- PR #493 - thanks to AdrianVorobel + 0.16.6 (2023-03-12) ------------------- - PR #482 - thanks to dreizehnutters diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 29a1c08..926de74 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,7 +4,7 @@ @author: Eric Lapouyade """ -__version__ = '0.16.6' +__version__ = '0.16.7' # flake8: noqa from .inline_image import InlineImage From d43c6debbf40c6526862e5298adf030b767c95f2 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Mon, 8 May 2023 11:44:44 +0200 Subject: [PATCH 02/64] Changed README.rst --- README.rst | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 11c1e0d..6b1807f 100644 --- a/README.rst +++ b/README.rst @@ -21,10 +21,6 @@ You save the document as a .docx file (xml format) : it will be your .docx templ Now you can use python-docx-template to generate as many word documents you want from this .docx template and context variables you will associate. -Share ------ - -If you like this project, please rate and share it here : http://rate.re/github/elapouya/python-docx-template Documentation ------------- @@ -34,8 +30,9 @@ Please, `read the doc `_ Other projects -------------- -Have a look at some of my other projects : +If you like python-docx-template, please have a look at some of my other projects : +- `django-listing `_ : A listing/table library on steroid for Djano - `python-textops3 `_ : Chainable text operations - `django-robohash-svg `_ : Create svg robots avatars From 24de22bfc6c67d3f959f6715e0c15a691019314c Mon Sep 17 00:00:00 2001 From: dralex Date: Sat, 10 Feb 2024 21:17:49 +0100 Subject: [PATCH 03/64] regen pipfile.lock with newer jinja2 dependency version --- Pipfile.lock | 111 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 45 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 48aee29..fa56326 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0368a5e08ceb2b4910a110742515b5ff1d04a3a3af2b91b49d922ef9aaab6915" + "sha256": "cfe74878731d3094ce80d2d9eb9f4ea9d6e770a4a2ae3cf07a017fd07d3b5f03" }, "pipfile-spec": 6, "requires": { @@ -37,11 +37,12 @@ }, "jinja2": { "hashes": [ - "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", - "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], + "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==3.1.2" + "version": "==3.1.3" }, "lxml": { "hashes": [ @@ -121,49 +122,69 @@ }, "markupsafe": { "hashes": [ - "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003", - "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88", - "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5", - "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7", - "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a", - "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603", - "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1", - "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135", - "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247", - "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6", - "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601", - "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77", - "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02", - "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e", - "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63", - "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f", - "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980", - "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b", - "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812", - "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff", - "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96", - "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1", - "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925", - "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a", - "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6", - "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e", - "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f", - "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4", - "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f", - "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3", - "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c", - "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a", - "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417", - "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a", - "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a", - "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37", - "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452", - "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933", - "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a", - "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7" + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" ], "markers": "python_version >= '3.7'", - "version": "==2.1.1" + "version": "==2.1.5" }, "mccabe": { "hashes": [ From 58de890f92af5b19071276eb08ec59f560b8963e Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Wed, 1 May 2024 16:50:16 +0200 Subject: [PATCH 04/64] v0.17.0 -> requires python-docx 1.1.1+ --- CHANGES.rst | 10 ++ Pipfile.lock | 217 +++++++++++++++++++++++++------------------- docxtpl/__init__.py | 2 +- docxtpl/template.py | 6 +- setup.py | 2 +- 5 files changed, 140 insertions(+), 97 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 97b0841..1fd4d89 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,13 @@ +0.17.0 (2024-05-01) +------------------- +- Add support to python-docx 1.1.1 + Note : docxtpl 0.17.0 requires python-docx 1.1.1+ and + is incompatible with previous python-docx versions. + +0.16.8 (2024-02-23) +------------------- +- PR #527 : upgrade Jinja2 in Pipfile.lock + 0.16.7 (2023-05-08) ------------------- - PR #493 - thanks to AdrianVorobel diff --git a/Pipfile.lock b/Pipfile.lock index fa56326..1613110 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "cfe74878731d3094ce80d2d9eb9f4ea9d6e770a4a2ae3cf07a017fd07d3b5f03" + "sha256": "0368a5e08ceb2b4910a110742515b5ff1d04a3a3af2b91b49d922ef9aaab6915" }, "pipfile-spec": 6, "requires": { @@ -17,11 +17,19 @@ }, "default": {}, "develop": { + "babel": { + "hashes": [ + "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", + "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" + ], + "markers": "python_version >= '3.7'", + "version": "==2.14.0" + }, "docxcompose": { "hashes": [ - "sha256:f91b6e4b136937152081c07471596368324cce2bffa82dfec579f6fa20f59161" + "sha256:bcf2799a0b63c29eb77a3d799a2f28443ae0f69f8691ff3d753f706be515c3e9" ], - "version": "==1.3.5" + "version": "==1.4.0" }, "docxtpl": { "editable": true, @@ -29,96 +37,102 @@ }, "flake8": { "hashes": [ - "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d", - "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d" + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" ], "index": "pypi", - "version": "==4.0.1" + "version": "==7.0.0" }, "jinja2": { "hashes": [ "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], - "index": "pypi", "markers": "python_version >= '3.7'", "version": "==3.1.3" }, "lxml": { "hashes": [ - "sha256:04da965dfebb5dac2619cb90fcf93efdb35b3c6994fea58a157a834f2f94b318", - "sha256:0538747a9d7827ce3e16a8fdd201a99e661c7dee3c96c885d8ecba3c35d1032c", - "sha256:0645e934e940107e2fdbe7c5b6fb8ec6232444260752598bc4d09511bd056c0b", - "sha256:079b68f197c796e42aa80b1f739f058dcee796dc725cc9a1be0cdb08fc45b000", - "sha256:0f3f0059891d3254c7b5fb935330d6db38d6519ecd238ca4fce93c234b4a0f73", - "sha256:10d2017f9150248563bb579cd0d07c61c58da85c922b780060dcc9a3aa9f432d", - "sha256:1355755b62c28950f9ce123c7a41460ed9743c699905cbe664a5bcc5c9c7c7fb", - "sha256:13c90064b224e10c14dcdf8086688d3f0e612db53766e7478d7754703295c7c8", - "sha256:1423631e3d51008871299525b541413c9b6c6423593e89f9c4cfbe8460afc0a2", - "sha256:1436cf0063bba7888e43f1ba8d58824f085410ea2025befe81150aceb123e345", - "sha256:1a7c59c6ffd6ef5db362b798f350e24ab2cfa5700d53ac6681918f314a4d3b94", - "sha256:1e1cf47774373777936c5aabad489fef7b1c087dcd1f426b621fda9dcc12994e", - "sha256:206a51077773c6c5d2ce1991327cda719063a47adc02bd703c56a662cdb6c58b", - "sha256:21fb3d24ab430fc538a96e9fbb9b150029914805d551deeac7d7822f64631dfc", - "sha256:27e590352c76156f50f538dbcebd1925317a0f70540f7dc8c97d2931c595783a", - "sha256:287605bede6bd36e930577c5925fcea17cb30453d96a7b4c63c14a257118dbb9", - "sha256:2aaf6a0a6465d39b5ca69688fce82d20088c1838534982996ec46633dc7ad6cc", - "sha256:32a73c53783becdb7eaf75a2a1525ea8e49379fb7248c3eeefb9412123536387", - "sha256:41fb58868b816c202e8881fd0f179a4644ce6e7cbbb248ef0283a34b73ec73bb", - "sha256:4780677767dd52b99f0af1f123bc2c22873d30b474aa0e2fc3fe5e02217687c7", - "sha256:4878e667ebabe9b65e785ac8da4d48886fe81193a84bbe49f12acff8f7a383a4", - "sha256:487c8e61d7acc50b8be82bda8c8d21d20e133c3cbf41bd8ad7eb1aaeb3f07c97", - "sha256:4beea0f31491bc086991b97517b9683e5cfb369205dac0148ef685ac12a20a67", - "sha256:4cfbe42c686f33944e12f45a27d25a492cc0e43e1dc1da5d6a87cbcaf2e95627", - "sha256:4d5bae0a37af799207140652a700f21a85946f107a199bcb06720b13a4f1f0b7", - "sha256:4e285b5f2bf321fc0857b491b5028c5f276ec0c873b985d58d7748ece1d770dd", - "sha256:57e4d637258703d14171b54203fd6822fda218c6c2658a7d30816b10995f29f3", - "sha256:5974895115737a74a00b321e339b9c3f45c20275d226398ae79ac008d908bff7", - "sha256:5ef87fca280fb15342726bd5f980f6faf8b84a5287fcc2d4962ea8af88b35130", - "sha256:603a464c2e67d8a546ddaa206d98e3246e5db05594b97db844c2f0a1af37cf5b", - "sha256:6653071f4f9bac46fbc30f3c7838b0e9063ee335908c5d61fb7a4a86c8fd2036", - "sha256:6ca2264f341dd81e41f3fffecec6e446aa2121e0b8d026fb5130e02de1402785", - "sha256:6d279033bf614953c3fc4a0aa9ac33a21e8044ca72d4fa8b9273fe75359d5cca", - "sha256:6d949f53ad4fc7cf02c44d6678e7ff05ec5f5552b235b9e136bd52e9bf730b91", - "sha256:6daa662aba22ef3258934105be2dd9afa5bb45748f4f702a3b39a5bf53a1f4dc", - "sha256:6eafc048ea3f1b3c136c71a86db393be36b5b3d9c87b1c25204e7d397cee9536", - "sha256:830c88747dce8a3e7525defa68afd742b4580df6aa2fdd6f0855481e3994d391", - "sha256:86e92728ef3fc842c50a5cb1d5ba2bc66db7da08a7af53fb3da79e202d1b2cd3", - "sha256:8caf4d16b31961e964c62194ea3e26a0e9561cdf72eecb1781458b67ec83423d", - "sha256:8d1a92d8e90b286d491e5626af53afef2ba04da33e82e30744795c71880eaa21", - "sha256:8f0a4d179c9a941eb80c3a63cdb495e539e064f8054230844dcf2fcb812b71d3", - "sha256:9232b09f5efee6a495a99ae6824881940d6447debe272ea400c02e3b68aad85d", - "sha256:927a9dd016d6033bc12e0bf5dee1dde140235fc8d0d51099353c76081c03dc29", - "sha256:93e414e3206779ef41e5ff2448067213febf260ba747fc65389a3ddaa3fb8715", - "sha256:98cafc618614d72b02185ac583c6f7796202062c41d2eeecdf07820bad3295ed", - "sha256:9c3a88d20e4fe4a2a4a84bf439a5ac9c9aba400b85244c63a1ab7088f85d9d25", - "sha256:9f36de4cd0c262dd9927886cc2305aa3f2210db437aa4fed3fb4940b8bf4592c", - "sha256:a60f90bba4c37962cbf210f0188ecca87daafdf60271f4c6948606e4dabf8785", - "sha256:a614e4afed58c14254e67862456d212c4dcceebab2eaa44d627c2ca04bf86837", - "sha256:ae06c1e4bc60ee076292e582a7512f304abdf6c70db59b56745cca1684f875a4", - "sha256:b122a188cd292c4d2fcd78d04f863b789ef43aa129b233d7c9004de08693728b", - "sha256:b570da8cd0012f4af9fa76a5635cd31f707473e65a5a335b186069d5c7121ff2", - "sha256:bcaa1c495ce623966d9fc8a187da80082334236a2a1c7e141763ffaf7a405067", - "sha256:bd34f6d1810d9354dc7e35158aa6cc33456be7706df4420819af6ed966e85448", - "sha256:be9eb06489bc975c38706902cbc6888f39e946b81383abc2838d186f0e8b6a9d", - "sha256:c4b2e0559b68455c085fb0f6178e9752c4be3bba104d6e881eb5573b399d1eb2", - "sha256:c62e8dd9754b7debda0c5ba59d34509c4688f853588d75b53c3791983faa96fc", - "sha256:c852b1530083a620cb0de5f3cd6826f19862bafeaf77586f1aef326e49d95f0c", - "sha256:d9fc0bf3ff86c17348dfc5d322f627d78273eba545db865c3cd14b3f19e57fa5", - "sha256:dad7b164905d3e534883281c050180afcf1e230c3d4a54e8038aa5cfcf312b84", - "sha256:e5f66bdf0976ec667fc4594d2812a00b07ed14d1b44259d19a41ae3fff99f2b8", - "sha256:e8f0c9d65da595cfe91713bc1222af9ecabd37971762cb830dea2fc3b3bb2acf", - "sha256:edffbe3c510d8f4bf8640e02ca019e48a9b72357318383ca60e3330c23aaffc7", - "sha256:eea5d6443b093e1545ad0210e6cf27f920482bfcf5c77cdc8596aec73523bb7e", - "sha256:ef72013e20dd5ba86a8ae1aed7f56f31d3374189aa8b433e7b12ad182c0d2dfb", - "sha256:f05251bbc2145349b8d0b77c0d4e5f3b228418807b1ee27cefb11f69ed3d233b", - "sha256:f1be258c4d3dc609e654a1dc59d37b17d7fef05df912c01fc2e15eb43a9735f3", - "sha256:f9ced82717c7ec65a67667bb05865ffe38af0e835cdd78728f1209c8fffe0cad", - "sha256:fe17d10b97fdf58155f858606bddb4e037b805a60ae023c009f760d8361a4eb8", - "sha256:fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f" + "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7", + "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726", + "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03", + "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140", + "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a", + "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05", + "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03", + "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419", + "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4", + "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e", + "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67", + "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50", + "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894", + "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf", + "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947", + "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1", + "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd", + "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3", + "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92", + "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3", + "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457", + "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74", + "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf", + "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1", + "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4", + "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975", + "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5", + "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe", + "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7", + "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1", + "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2", + "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409", + "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f", + "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f", + "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5", + "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24", + "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e", + "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4", + "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a", + "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c", + "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de", + "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f", + "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b", + "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5", + "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7", + "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a", + "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c", + "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9", + "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e", + "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab", + "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941", + "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5", + "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45", + "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7", + "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892", + "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746", + "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c", + "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53", + "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe", + "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184", + "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38", + "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df", + "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9", + "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b", + "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2", + "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0", + "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda", + "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b", + "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5", + "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380", + "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33", + "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8", + "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1", + "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889", + "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9", + "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f", + "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.9.1" + "version": "==4.9.2" }, "markupsafe": { "hashes": [ @@ -188,40 +202,59 @@ }, "mccabe": { "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" ], - "version": "==0.6.1" + "markers": "python_version >= '3.6'", + "version": "==0.7.0" }, "pycodestyle": { "hashes": [ - "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20", - "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f" + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==2.8.0" + "markers": "python_version >= '3.8'", + "version": "==2.11.1" }, "pyflakes": { "hashes": [ - "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c", - "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e" + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.0" + "markers": "python_version >= '3.8'", + "version": "==3.2.0" }, "python-docx": { "hashes": [ - "sha256:1105d233a0956dd8dd1e710d20b159e2d72ac3c301041b95f4d4ceb3e0ebebc4" + "sha256:15473bd40a7c16d9367b0a4b2cbbab0a787904fa2f7cadae1ed6f96201dcbb66", + "sha256:fc09412cef1a9ce7756d52376158f94f2a0edd0fc722da1d0a074f01d83e5021" ], - "version": "==0.8.11" + "markers": "python_version >= '3.7'", + "version": "==1.1.1" + }, + "setuptools": { + "hashes": [ + "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", + "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" + ], + "markers": "python_version >= '3.8'", + "version": "==69.5.1" }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.16.0" + }, + "typing-extensions": { + "hashes": [ + "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", + "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + ], + "markers": "python_version >= '3.8'", + "version": "==4.11.0" } } } diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 926de74..5ae5209 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,7 +4,7 @@ @author: Eric Lapouyade """ -__version__ = '0.16.7' +__version__ = '0.17.0' # flake8: noqa from .inline_image import InlineImage diff --git a/docxtpl/template.py b/docxtpl/template.py index 943bf29..31e9671 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -321,7 +321,7 @@ def map_tree(self, tree): root.replace(body, tree) def get_headers_footers(self, uri): - for relKey, val in self.docx._part._rels.items(): + for relKey, val in self.docx._part.rels.items(): if (val.reltype == uri) and (val.target_part.blob): yield relKey, val.target_part @@ -343,11 +343,11 @@ def build_headers_footers_xml(self, context, uri, jinja_env=None): yield relKey, xml.encode(encoding) def map_headers_footers_xml(self, relKey, xml): - part = self.docx._part._rels[relKey].target_part + part = self.docx._part.rels[relKey].target_part new_part = XmlPart.load(part.partname, part.content_type, xml, part.package) for rId, rel in part.rels.items(): new_part.load_rel(rel.reltype, rel._target, rel.rId, rel.is_external) - self.docx._part._rels[relKey]._target = new_part + self.docx._part.rels[relKey]._target = new_part def render( self, diff --git a/setup.py b/setup.py index e6762c1..2eae6c5 100644 --- a/setup.py +++ b/setup.py @@ -61,7 +61,7 @@ def get_version(pkg): license='LGPL 2.1', packages=['docxtpl'], install_requires=['six', - 'python-docx', + 'python-docx>=1.1.1', 'docxcompose', 'jinja2', 'lxml'], From d322120d2a5749f8c150ed4705b1dee5fbaae193 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Wed, 1 May 2024 16:56:11 +0200 Subject: [PATCH 05/64] Fix CHANGES.rst --- CHANGES.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 1fd4d89..e6b5686 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,8 +1,6 @@ 0.17.0 (2024-05-01) ------------------- - Add support to python-docx 1.1.1 - Note : docxtpl 0.17.0 requires python-docx 1.1.1+ and - is incompatible with previous python-docx versions. 0.16.8 (2024-02-23) ------------------- From e0d5eb0e0a82d62be5f01942084da8ad0f000596 Mon Sep 17 00:00:00 2001 From: Jean Marcos da Rosa Date: Tue, 9 Jul 2024 10:33:26 -0300 Subject: [PATCH 06/64] Added hyperlink option in InlineImage --- docxtpl/inline_image.py | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/docxtpl/inline_image.py b/docxtpl/inline_image.py index 43af07b..e96eec6 100644 --- a/docxtpl/inline_image.py +++ b/docxtpl/inline_image.py @@ -4,7 +4,8 @@ @author: Eric Lapouyade """ - +from docx.oxml import OxmlElement, parse_xml +from docx.oxml.ns import qn class InlineImage(object): """Class to generate an inline image @@ -15,17 +16,45 @@ class InlineImage(object): image_descriptor = None width = None height = None + anchor = None - def __init__(self, tpl, image_descriptor, width=None, height=None): + def __init__(self, tpl, image_descriptor, width=None, height=None, anchor=None): self.tpl, self.image_descriptor = tpl, image_descriptor self.width, self.height = width, height + self.anchor = anchor + + def _add_hyperlink(self, run, url, part): + # Create a relationship for the hyperlink + r_id = part.relate_to(url, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', is_external=True) + + # Find the and element + docPr = run.xpath('.//wp:docPr')[0] + cNvPr = run.xpath('.//pic:cNvPr')[0] + + # Create the element + hlinkClick1 = OxmlElement('a:hlinkClick') + hlinkClick1.set(qn('r:id'), r_id) + hlinkClick2 = OxmlElement('a:hlinkClick') + hlinkClick2.set(qn('r:id'), r_id) + + # Insert the element right after the element + docPr.append(hlinkClick1) + cNvPr.append(hlinkClick2) + + return run def _insert_image(self): pic = self.tpl.current_rendering_part.new_pic_inline( self.image_descriptor, self.width, - self.height + self.height, ).xml + if self.anchor: + run = parse_xml(pic) + if run.xpath('.//a:blip'): + hyperlink = self._add_hyperlink(run, self.anchor, self.tpl.current_rendering_part) + pic = hyperlink.xml + return '%s' \ '' % pic From 664bb845fa50c1dbec8a7dd41517c5252f87eb1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 19:38:23 +0000 Subject: [PATCH 07/64] Bump setuptools from 69.5.1 to 70.0.0 Bumps [setuptools](https://github.com/pypa/setuptools) from 69.5.1 to 70.0.0. - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/compare/v69.5.1...v70.0.0) --- updated-dependencies: - dependency-name: setuptools dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Pipfile.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 1613110..90501d1 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -234,11 +234,12 @@ }, "setuptools": { "hashes": [ - "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", - "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" ], + "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==69.5.1" + "version": "==70.0.0" }, "six": { "hashes": [ From 0642badebc6f6ee4356660d73bbfc4922f45eb10 Mon Sep 17 00:00:00 2001 From: jkpet <60282159+jkpet@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:03:07 +1000 Subject: [PATCH 08/64] Update index.rst Updating 'sub-document' documentation to make explicit what was already implicit. --- docs/index.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index e54c757..517c3e8 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -288,6 +288,16 @@ calling method `new_subdoc()` :: tpl = DocxTemplate('templates/merge_docx_master_tpl.docx') sd = tpl.new_subdoc('templates/merge_docx_subdoc.docx') + context = { + 'mysubdoc': sd, + } + + tpl.render(context) + tpl.save('output/merge_docx.docx') + +In the above example, the content of 'templates/merge_docx_subdoc.docx' will be inserted into the parent document in place of the declared +variable `{{ mysubdoc }}`. + See `tests/merge_docx.py` for full code. .. _Escaping: From b7872d7723009ea6ceba3098bd55989ebaf1d469 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Sun, 21 Jul 2024 15:37:37 +0200 Subject: [PATCH 09/64] Add poetry env --- poetry.lock | 387 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 21 +++ 2 files changed, 408 insertions(+) create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..a6f6e73 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,387 @@ +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. + +[[package]] +name = "babel" +version = "2.15.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, + {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "docxcompose" +version = "1.4.0" +description = "Compose .docx documents" +optional = false +python-versions = "*" +files = [ + {file = "docxcompose-1.4.0.tar.gz", hash = "sha256:bcf2799a0b63c29eb77a3d799a2f28443ae0f69f8691ff3d753f706be515c3e9"}, +] + +[package.dependencies] +babel = "*" +lxml = "*" +python-docx = ">=0.8.8" +setuptools = "*" +six = "*" + +[package.extras] +test = ["pytest"] +tests = ["pytest"] + +[[package]] +name = "flake8" +version = "7.1.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.8.1" +files = [ + {file = "flake8-7.1.0-py2.py3-none-any.whl", hash = "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a"}, + {file = "flake8-7.1.0.tar.gz", hash = "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.12.0,<2.13.0" +pyflakes = ">=3.2.0,<3.3.0" + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "lxml" +version = "5.2.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, + {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, + {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, + {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, + {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, + {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, + {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, + {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, + {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, + {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, + {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, + {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, + {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, + {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, + {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, + {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, + {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, + {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, + {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, + {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, + {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, + {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, + {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, + {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, + {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, + {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, + {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, + {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, + {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, + {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, + {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, + {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, + {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, + {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, + {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, + {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, + {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, + {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, + {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.10)"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "pycodestyle" +version = "2.12.0" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.12.0-py2.py3-none-any.whl", hash = "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4"}, + {file = "pycodestyle-2.12.0.tar.gz", hash = "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c"}, +] + +[[package]] +name = "pyflakes" +version = "3.2.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, +] + +[[package]] +name = "python-docx" +version = "1.1.2" +description = "Create, read, and update Microsoft Word .docx files." +optional = false +python-versions = ">=3.7" +files = [ + {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"}, + {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"}, +] + +[package.dependencies] +lxml = ">=3.1.0" +typing-extensions = ">=4.9.0" + +[[package]] +name = "setuptools" +version = "71.0.4" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-71.0.4-py3-none-any.whl", hash = "sha256:ed2feca703be3bdbd94e6bb17365d91c6935c6b2a8d0bb09b66a2c435ba0b1a5"}, + {file = "setuptools-71.0.4.tar.gz", hash = "sha256:48297e5d393a62b7cb2a10b8f76c63a73af933bd809c9e0d0d6352a1a0135dd8"}, +] + +[package.extras] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "0a19499992b7770bc844b87288ec61c29b194487b3e99437a9004e66d7965ca8" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..692505d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,21 @@ +[tool.poetry] +name = "docxtpl" +version = "0.17.0" +description = "Python docx template engine" +authors = ["Eric Lapouyade"] +readme = "README.rst" + +[tool.poetry.dependencies] +python = "^3.11" +six = "^1.16.0" +python-docx = "^1.1.2" +docxcompose = "^1.4.0" +jinja2 = "^3.1.4" + + +[tool.poetry.group.dev.dependencies] +flake8 = "^7.1.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" From a50b52b317002a2035d67a6ab3e06b705597cdf4 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Sun, 21 Jul 2024 16:10:44 +0200 Subject: [PATCH 10/64] PR #552 + black all files --- docxtpl/__init__.py | 2 +- docxtpl/__main__.py | 107 +++--- docxtpl/inline_image.py | 32 +- docxtpl/listing.py | 2 + docxtpl/richtext.py | 103 +++--- docxtpl/subdoc.py | 30 +- docxtpl/template.py | 473 ++++++++++++++++---------- poetry.lock | 120 ++++++- pyproject.toml | 1 + tests/cellbg.py | 42 +-- tests/comments.py | 4 +- tests/custom_jinja_filters.py | 16 +- tests/doc_properties.py | 6 +- tests/dynamic_table.py | 14 +- tests/embedded.py | 26 +- tests/escape.py | 72 ++-- tests/escape_auto.py | 14 +- tests/header_footer.py | 18 +- tests/header_footer_entities.py | 10 +- tests/header_footer_image.py | 12 +- tests/header_footer_image_file_obj.py | 20 +- tests/header_footer_inline_image.py | 20 +- tests/header_footer_utf8.py | 20 +- tests/horizontal_merge.py | 4 +- tests/inline_image.py | 36 +- tests/less_cells_after_loop.py | 4 +- tests/merge_docx.py | 12 +- tests/merge_paragraph.py | 10 +- tests/module_execute.py | 20 +- tests/multi_rendering.py | 42 +-- tests/nested_for.py | 42 +-- tests/order.py | 26 +- tests/preserve_spaces.py | 8 +- tests/replace_picture.py | 10 +- tests/richtext.py | 89 ++--- tests/richtext_and_if.py | 10 +- tests/richtext_eastAsia.py | 17 +- tests/runtests.py | 12 +- tests/subdoc.py | 40 +-- tests/template_error.py | 16 +- tests/vertical_merge.py | 20 +- tests/vertical_merge_nested.py | 4 +- tests/word2016.py | 12 +- 43 files changed, 946 insertions(+), 652 deletions(-) diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 5ae5209..b2d6d3a 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,7 +4,7 @@ @author: Eric Lapouyade """ -__version__ = '0.17.0' +__version__ = "0.17.0" # flake8: noqa from .inline_image import InlineImage diff --git a/docxtpl/__main__.py b/docxtpl/__main__.py index 17b3b05..6295641 100644 --- a/docxtpl/__main__.py +++ b/docxtpl/__main__.py @@ -4,32 +4,41 @@ from .template import DocxTemplate, TemplateError -TEMPLATE_ARG = 'template_path' -JSON_ARG = 'json_path' -OUTPUT_ARG = 'output_filename' -OVERWRITE_ARG = 'overwrite' -QUIET_ARG = 'quiet' +TEMPLATE_ARG = "template_path" +JSON_ARG = "json_path" +OUTPUT_ARG = "output_filename" +OVERWRITE_ARG = "overwrite" +QUIET_ARG = "quiet" def make_arg_parser(): parser = argparse.ArgumentParser( - usage='python -m docxtpl [-h] [-o] [-q] {} {} {}'.format(TEMPLATE_ARG, JSON_ARG, OUTPUT_ARG), - description='Make docx file from existing template docx and json data.') - parser.add_argument(TEMPLATE_ARG, - type=str, - help='The path to the template docx file.') - parser.add_argument(JSON_ARG, - type=str, - help='The path to the json file with the data.') - parser.add_argument(OUTPUT_ARG, - type=str, - help='The filename to save the generated docx.') - parser.add_argument('-' + OVERWRITE_ARG[0], '--' + OVERWRITE_ARG, - action='store_true', - help='If output file already exists, overwrites without asking for confirmation') - parser.add_argument('-' + QUIET_ARG[0], '--' + QUIET_ARG, - action='store_true', - help='Do not display unnecessary messages') + usage="python -m docxtpl [-h] [-o] [-q] {} {} {}".format( + TEMPLATE_ARG, JSON_ARG, OUTPUT_ARG + ), + description="Make docx file from existing template docx and json data.", + ) + parser.add_argument( + TEMPLATE_ARG, type=str, help="The path to the template docx file." + ) + parser.add_argument( + JSON_ARG, type=str, help="The path to the json file with the data." + ) + parser.add_argument( + OUTPUT_ARG, type=str, help="The filename to save the generated docx." + ) + parser.add_argument( + "-" + OVERWRITE_ARG[0], + "--" + OVERWRITE_ARG, + action="store_true", + help="If output file already exists, overwrites without asking for confirmation", + ) + parser.add_argument( + "-" + QUIET_ARG[0], + "--" + QUIET_ARG, + action="store_true", + help="Do not display unnecessary messages", + ) return parser @@ -43,18 +52,21 @@ def get_args(parser): if e.code == 0: raise SystemExit else: - raise RuntimeError('Correct usage is:\n{parser.usage}'.format(parser=parser)) + raise RuntimeError( + "Correct usage is:\n{parser.usage}".format(parser=parser) + ) def is_argument_valid(arg_name, arg_value, overwrite): # Basic checks for the arguments if arg_name == TEMPLATE_ARG: - return os.path.isfile(arg_value) and arg_value.endswith('.docx') + return os.path.isfile(arg_value) and arg_value.endswith(".docx") elif arg_name == JSON_ARG: - return os.path.isfile(arg_value) and arg_value.endswith('.json') + return os.path.isfile(arg_value) and arg_value.endswith(".json") elif arg_name == OUTPUT_ARG: - return arg_value.endswith('.docx') and check_exists_ask_overwrite( - arg_value, overwrite) + return arg_value.endswith(".docx") and check_exists_ask_overwrite( + arg_value, overwrite + ) elif arg_name in [OVERWRITE_ARG, QUIET_ARG]: return arg_value in [True, False] @@ -65,13 +77,18 @@ def check_exists_ask_overwrite(arg_value, overwrite): # confirmed returns True, else raises OSError. if os.path.exists(arg_value) and not overwrite: try: - msg = 'File %s already exists, would you like to overwrite the existing file? (y/n)' % arg_value - if input(msg).lower() == 'y': + msg = ( + "File %s already exists, would you like to overwrite the existing file? (y/n)" + % arg_value + ) + if input(msg).lower() == "y": return True else: raise OSError except OSError: - raise RuntimeError('File %s already exists, please choose a different name.' % arg_value) + raise RuntimeError( + "File %s already exists, please choose a different name." % arg_value + ) else: return True @@ -87,7 +104,8 @@ def validate_all_args(parsed_args): raise RuntimeError( 'The specified {arg_name} "{arg_value}" is not valid.'.format( arg_name=arg_name, arg_value=arg_value - )) + ) + ) def get_json_data(json_path): @@ -97,17 +115,18 @@ def get_json_data(json_path): return json_data except json.JSONDecodeError as e: print( - 'There was an error on line {e.lineno}, column {e.colno} while trying to parse file {json_path}'.format( + "There was an error on line {e.lineno}, column {e.colno} while trying to parse file {json_path}".format( e=e, json_path=json_path - )) - raise RuntimeError('Failed to get json data.') + ) + ) + raise RuntimeError("Failed to get json data.") def make_docxtemplate(template_path): try: return DocxTemplate(template_path) except TemplateError: - raise RuntimeError('Could not create docx template.') + raise RuntimeError("Could not create docx template.") def render_docx(doc, json_data): @@ -115,7 +134,7 @@ def render_docx(doc, json_data): doc.render(json_data) return doc except TemplateError: - raise RuntimeError('An error ocurred while trying to render the docx') + raise RuntimeError("An error ocurred while trying to render the docx") def save_file(doc, parsed_args): @@ -123,10 +142,14 @@ def save_file(doc, parsed_args): output_path = parsed_args[OUTPUT_ARG] doc.save(output_path) if not parsed_args[QUIET_ARG]: - print('Document successfully generated and saved at {output_path}'.format(output_path=output_path)) + print( + "Document successfully generated and saved at {output_path}".format( + output_path=output_path + ) + ) except OSError as e: - print('{e.strerror}. Could not save file {e.filename}.'.format(e=e)) - raise RuntimeError('Failed to save file.') + print("{e.strerror}. Could not save file {e.filename}.".format(e=e)) + raise RuntimeError("Failed to save file.") def main(): @@ -142,12 +165,12 @@ def main(): doc = render_docx(doc, json_data) save_file(doc, parsed_args) except RuntimeError as e: - print('Error: '+e.__str__()) + print("Error: " + e.__str__()) return finally: if not parsed_args[QUIET_ARG]: - print('Exiting program!') + print("Exiting program!") -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/docxtpl/inline_image.py b/docxtpl/inline_image.py index e96eec6..f860749 100644 --- a/docxtpl/inline_image.py +++ b/docxtpl/inline_image.py @@ -7,11 +7,13 @@ from docx.oxml import OxmlElement, parse_xml from docx.oxml.ns import qn + class InlineImage(object): """Class to generate an inline image This is much faster than using Subdoc class. """ + tpl = None image_descriptor = None width = None @@ -25,17 +27,21 @@ def __init__(self, tpl, image_descriptor, width=None, height=None, anchor=None): def _add_hyperlink(self, run, url, part): # Create a relationship for the hyperlink - r_id = part.relate_to(url, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', is_external=True) + r_id = part.relate_to( + url, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", + is_external=True, + ) # Find the and element - docPr = run.xpath('.//wp:docPr')[0] - cNvPr = run.xpath('.//pic:cNvPr')[0] + docPr = run.xpath(".//wp:docPr")[0] + cNvPr = run.xpath(".//pic:cNvPr")[0] # Create the element - hlinkClick1 = OxmlElement('a:hlinkClick') - hlinkClick1.set(qn('r:id'), r_id) - hlinkClick2 = OxmlElement('a:hlinkClick') - hlinkClick2.set(qn('r:id'), r_id) + hlinkClick1 = OxmlElement("a:hlinkClick") + hlinkClick1.set(qn("r:id"), r_id) + hlinkClick2 = OxmlElement("a:hlinkClick") + hlinkClick2.set(qn("r:id"), r_id) # Insert the element right after the element docPr.append(hlinkClick1) @@ -51,12 +57,16 @@ def _insert_image(self): ).xml if self.anchor: run = parse_xml(pic) - if run.xpath('.//a:blip'): - hyperlink = self._add_hyperlink(run, self.anchor, self.tpl.current_rendering_part) + if run.xpath(".//a:blip"): + hyperlink = self._add_hyperlink( + run, self.anchor, self.tpl.current_rendering_part + ) pic = hyperlink.xml - return '%s' \ - '' % pic + return ( + "%s" + '' % pic + ) def __unicode__(self): return self._insert_image() diff --git a/docxtpl/listing.py b/docxtpl/listing.py index 4a7f85c..afe637e 100644 --- a/docxtpl/listing.py +++ b/docxtpl/listing.py @@ -5,6 +5,7 @@ @author: Eric Lapouyade """ import six + try: from html import escape except ImportError: @@ -19,6 +20,7 @@ class Listing(object): use {{ mylisting }} in your template and context={ mylisting:Listing(the_listing_with_newlines) } """ + def __init__(self, text): # If not a string : cast to string (ex: int, dict etc...) if not isinstance(text, (six.text_type, six.binary_type)): diff --git a/docxtpl/richtext.py b/docxtpl/richtext.py index 02ab0b9..453ce2a 100644 --- a/docxtpl/richtext.py +++ b/docxtpl/richtext.py @@ -5,6 +5,7 @@ @author: Eric Lapouyade """ import six + try: from html import escape except ImportError: @@ -13,29 +14,33 @@ class RichText(object): - """ class to generate Rich Text when using templates variables + """class to generate Rich Text when using templates variables This is much faster than using Subdoc class, but this only for texts INSIDE an existing paragraph. """ + def __init__(self, text=None, **text_prop): - self.xml = '' + self.xml = "" if text: self.add(text, **text_prop) - def add(self, text, - style=None, - color=None, - highlight=None, - size=None, - subscript=None, - superscript=None, - bold=False, - italic=False, - underline=False, - strike=False, - font=None, - url_id=None): + def add( + self, + text, + style=None, + color=None, + highlight=None, + size=None, + subscript=None, + superscript=None, + bold=False, + italic=False, + underline=False, + strike=False, + font=None, + url_id=None, + ): # If a RichText is added if isinstance(text, RichText): @@ -46,55 +51,65 @@ def add(self, text, if not isinstance(text, (six.text_type, six.binary_type)): text = six.text_type(text) if not isinstance(text, six.text_type): - text = text.decode('utf-8', errors='ignore') + text = text.decode("utf-8", errors="ignore") text = escape(text) - prop = u'' + prop = "" if style: - prop += u'' % style + prop += '' % style if color: - if color[0] == '#': + if color[0] == "#": color = color[1:] - prop += u'' % color + prop += '' % color if highlight: - if highlight[0] == '#': + if highlight[0] == "#": highlight = highlight[1:] - prop += u'' % highlight + prop += '' % highlight if size: - prop += u'' % size - prop += u'' % size + prop += '' % size + prop += '' % size if subscript: - prop += u'' + prop += '' if superscript: - prop += u'' + prop += '' if bold: - prop += u'' + prop += "" if italic: - prop += u'' + prop += "" if underline: - if underline not in ['single', 'double', 'thick', 'dotted', 'dash', 'dotDash', 'dotDotDash', 'wave']: - underline = 'single' - prop += u'' % underline + if underline not in [ + "single", + "double", + "thick", + "dotted", + "dash", + "dotDash", + "dotDotDash", + "wave", + ]: + underline = "single" + prop += '' % underline if strike: - prop += u'' + prop += "" if font: - regional_font = u'' - if ':' in font: - region, font = font.split(':', 1) - regional_font = u' w:{region}="{font}"'.format(font=font, region=region) - prop += ( - u'' - .format(font=font, regional_font=regional_font) + regional_font = "" + if ":" in font: + region, font = font.split(":", 1) + regional_font = ' w:{region}="{font}"'.format(font=font, region=region) + prop += ''.format( + font=font, regional_font=regional_font ) - xml = u'' + xml = "" if prop: - xml += u'%s' % prop - xml += u'%s' % text + xml += "%s" % prop + xml += '%s' % text if url_id: - xml = (u'%s' - % (url_id, xml)) + xml = '%s' % ( + url_id, + xml, + ) self.xml += xml def __unicode__(self): diff --git a/docxtpl/subdoc.py b/docxtpl/subdoc.py index 84a1777..e8da093 100644 --- a/docxtpl/subdoc.py +++ b/docxtpl/subdoc.py @@ -18,8 +18,8 @@ class SubdocComposer(Composer): def attach_parts(self, doc, remove_property_fields=True): - """ Attach docx parts instead of appending the whole document - thus subdoc insertion can be delegated to jinja2 """ + """Attach docx parts instead of appending the whole document + thus subdoc insertion can be delegated to jinja2""" self.reset_reference_mapping() # Remove custom property fields but keep the values @@ -51,22 +51,23 @@ def attach_parts(self, doc, remove_property_fields=True): def add_diagrams(self, doc, element): # While waiting docxcompose 1.3.3 - dgm_rels = xpath(element, './/dgm:relIds[@r:dm]') + dgm_rels = xpath(element, ".//dgm:relIds[@r:dm]") for dgm_rel in dgm_rels: for item, rt_type in ( - ('dm', RT.DIAGRAM_DATA), - ('lo', RT.DIAGRAM_LAYOUT), - ('qs', RT.DIAGRAM_QUICK_STYLE), - ('cs', RT.DIAGRAM_COLORS) + ("dm", RT.DIAGRAM_DATA), + ("lo", RT.DIAGRAM_LAYOUT), + ("qs", RT.DIAGRAM_QUICK_STYLE), + ("cs", RT.DIAGRAM_COLORS), ): - dm_rid = dgm_rel.get('{%s}%s' % (NS['r'], item)) + dm_rid = dgm_rel.get("{%s}%s" % (NS["r"], item)) dm_part = doc.part.rels[dm_rid].target_part new_rid = self.doc.part.relate_to(dm_part, rt_type) - dgm_rel.set('{%s}%s' % (NS['r'], item), new_rid) + dgm_rel.set("{%s}%s" % (NS["r"], item), new_rid) class Subdoc(object): - """ Class for subdocument to insert into master document """ + """Class for subdocument to insert into master document""" + def __init__(self, tpl, docpath=None): self.tpl = tpl self.docx = tpl.get_docx() @@ -83,8 +84,13 @@ def __getattr__(self, name): def _get_xml(self): if self.subdocx.element.body.sectPr is not None: self.subdocx.element.body.remove(self.subdocx.element.body.sectPr) - xml = re.sub(r']*>', '', etree.tostring( - self.subdocx.element.body, encoding='unicode', pretty_print=False)) + xml = re.sub( + r"]*>", + "", + etree.tostring( + self.subdocx.element.body, encoding="unicode", pretty_print=False + ), + ) return xml def __unicode__(self): diff --git a/docxtpl/template.py b/docxtpl/template.py index 31e9671..98d66ec 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -18,6 +18,7 @@ from docx.opc.constants import RELATIONSHIP_TYPE as REL_TYPE from jinja2 import Environment, Template, meta from jinja2.exceptions import TemplateError + try: from html import escape # noqa: F401 except ImportError: @@ -31,10 +32,14 @@ class DocxTemplate(object): - """ Class for managing docx files as they were jinja2 templates """ + """Class for managing docx files as they were jinja2 templates""" - HEADER_URI = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" - FOOTER_URI = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" + HEADER_URI = ( + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" + ) + FOOTER_URI = ( + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" + ) def __init__(self, template_file: Union[IO[bytes], str, PathLike]) -> None: self.template_file = template_file @@ -58,10 +63,10 @@ def render_init(self): def __getattr__(self, name): return getattr(self.docx, name) - def xml_to_string(self, xml, encoding='unicode'): + def xml_to_string(self, xml, encoding="unicode"): # Be careful : pretty_print MUST be set to False, otherwise patch_xml() # won't work properly - return etree.tostring(xml, encoding='unicode', pretty_print=False) + return etree.tostring(xml, encoding="unicode", pretty_print=False) def get_docx(self): self.init_docx() @@ -71,121 +76,178 @@ def get_xml(self): return self.xml_to_string(self.docx._element.body) def write_xml(self, filename): - with open(filename, 'w') as fh: + with open(filename, "w") as fh: fh.write(self.get_xml()) def patch_xml(self, src_xml): - """ Make a lots of cleaning to have a raw xml understandable by jinja2 : + """Make a lots of cleaning to have a raw xml understandable by jinja2 : strip all unnecessary xml tags, manage table cell background color and colspan, - unescape html entities, etc... """ + unescape html entities, etc...""" # replace {{ by {{ ( works with {{ }} {% and %} {# and #}) - src_xml = re.sub(r'(?<={)(<[^>]*>)+(?=[\{%\#])|(?<=[%\}\#])(<[^>]*>)+(?=\})', '', - src_xml, flags=re.DOTALL) + src_xml = re.sub( + r"(?<={)(<[^>]*>)+(?=[\{%\#])|(?<=[%\}\#])(<[^>]*>)+(?=\})", + "", + src_xml, + flags=re.DOTALL, + ) # replace {{jinja2 stuff}} by {{jinja2 stuff}} # same thing with {% ... %} and {# #} # "jinja2 stuff" could a variable, a 'if' etc... anything jinja2 will understand def striptags(m): - return re.sub('.*?(|]*>)', '', - m.group(0), flags=re.DOTALL) - src_xml = re.sub(r'{%(?:(?!%}).)*|{#(?:(?!#}).)*|{{(?:(?!}}).)*', striptags, - src_xml, flags=re.DOTALL) + return re.sub( + ".*?(|]*>)", "", m.group(0), flags=re.DOTALL + ) + + src_xml = re.sub( + r"{%(?:(?!%}).)*|{#(?:(?!#}).)*|{{(?:(?!}}).)*", + striptags, + src_xml, + flags=re.DOTALL, + ) # manage table cell colspan def colspan(m): cell_xml = m.group(1) + m.group(3) - cell_xml = re.sub(r'](?:(?!]).)*.*?', - '', cell_xml, flags=re.DOTALL) - cell_xml = re.sub(r'', '', cell_xml, count=1) - return re.sub(r'(]*>)', r'\1' - % m.group(2), cell_xml) - src_xml = re.sub(r'(](?:(?!]).)*){%\s*colspan\s+([^%]*)\s*%}(.*?)', - colspan, src_xml, flags=re.DOTALL) + cell_xml = re.sub( + r"](?:(?!]).)*.*?", + "", + cell_xml, + flags=re.DOTALL, + ) + cell_xml = re.sub(r"", "", cell_xml, count=1) + return re.sub( + r"(]*>)", + r'\1' % m.group(2), + cell_xml, + ) + + src_xml = re.sub( + r"(](?:(?!]).)*){%\s*colspan\s+([^%]*)\s*%}(.*?)", + colspan, + src_xml, + flags=re.DOTALL, + ) # manage table cell background color def cellbg(m): cell_xml = m.group(1) + m.group(3) - cell_xml = re.sub(r'](?:(?!]).)*.*?', - '', cell_xml, flags=re.DOTALL) - cell_xml = re.sub(r'', '', cell_xml, count=1) - return re.sub(r'(]*>)', - r'\1' - % m.group(2), cell_xml) - src_xml = re.sub(r'(](?:(?!]).)*){%\s*cellbg\s+([^%]*)\s*%}(.*?)', - cellbg, src_xml, flags=re.DOTALL) + cell_xml = re.sub( + r"](?:(?!]).)*.*?", + "", + cell_xml, + flags=re.DOTALL, + ) + cell_xml = re.sub(r"", "", cell_xml, count=1) + return re.sub( + r"(]*>)", + r'\1' % m.group(2), + cell_xml, + ) + + src_xml = re.sub( + r"(](?:(?!]).)*){%\s*cellbg\s+([^%]*)\s*%}(.*?)", + cellbg, + src_xml, + flags=re.DOTALL, + ) # ensure space preservation - src_xml = re.sub(r'((?:(?!).)*)({{.*?}}|{%.*?%})', - r'\1\2', - src_xml, flags=re.DOTALL) - src_xml = re.sub(r'({{r\s.*?}}|{%r\s.*?%})', - r'\1', - src_xml, flags=re.DOTALL) + src_xml = re.sub( + r"((?:(?!).)*)({{.*?}}|{%.*?%})", + r'\1\2', + src_xml, + flags=re.DOTALL, + ) + src_xml = re.sub( + r"({{r\s.*?}}|{%r\s.*?%})", + r'\1', + src_xml, + flags=re.DOTALL, + ) # {%- will merge with previous paragraph text - src_xml = re.sub(r'(?:(?!).)*?{%-', '{%', src_xml, flags=re.DOTALL) + src_xml = re.sub(r"(?:(?!).)*?{%-", "{%", src_xml, flags=re.DOTALL) # -%} will merge with next paragraph text - src_xml = re.sub(r'-%}(?:(?!]|{%|{{).)*?]*?>', '%}', src_xml, flags=re.DOTALL) + src_xml = re.sub( + r"-%}(?:(?!]|{%|{{).)*?]*?>", "%}", src_xml, flags=re.DOTALL + ) - for y in ['tr', 'tc', 'p', 'r']: + for y in ["tr", "tc", "p", "r"]: # replace into xml code the row/paragraph/run containing # {%y xxx %} or {{y xxx}} template tag # by {% xxx %} or {{ xx }} without any surrounding tags : # This is mandatory to have jinja2 generating correct xml code - pat = r'](?:(?!]).)*({%%|{{)%(y)s ([^}%%]*(?:%%}|}})).*?' % {'y': y} - src_xml = re.sub(pat, r'\1 \2', src_xml, flags=re.DOTALL) + pat = ( + r"](?:(?!]).)*({%%|{{)%(y)s ([^}%%]*(?:%%}|}})).*?" + % {"y": y} + ) + src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) - for y in ['tr', 'tc', 'p']: + for y in ["tr", "tc", "p"]: # same thing, but for {#y xxx #} (but not where y == 'r', since that # makes less sense to use comments in that context - pat = r'](?:(?!]).)*({#)%(y)s ([^}#]*(?:#})).*?' % {'y': y} - src_xml = re.sub(pat, r'\1 \2', src_xml, flags=re.DOTALL) + pat = ( + r"](?:(?!]).)*({#)%(y)s ([^}#]*(?:#})).*?" + % {"y": y} + ) + src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) # add vMerge # use {% vm %} to make this table cell and its copies be vertically merged within a {% for %} def v_merge_tc(m): def v_merge(m1): return ( - '' + - m1.group(1) + # Everything between ```` and ````. - "{% if loop.first %}" + - m1.group(2) + # Everything before ``{% vm %}``. - m1.group(3) + # Everything after ``{% vm %}``. - "{% endif %}" + - m1.group(4) # ````. + '' + + m1.group(1) # Everything between ```` and ````. + + "{% if loop.first %}" + + m1.group(2) # Everything before ``{% vm %}``. + + m1.group(3) # Everything after ``{% vm %}``. + + "{% endif %}" + + m1.group(4) # ````. ) + return re.sub( - r'(].*?)(.*?)(?:{%\s*vm\s*%})(.*?)()', + r"(].*?)(.*?)(?:{%\s*vm\s*%})(.*?)()", v_merge, m.group(), # Everything between ```` and ```` with ``{% vm %}`` inside. flags=re.DOTALL, ) - src_xml = re.sub(r'](?:(?!]).)*?{%\s*vm\s*%}.*?]', - v_merge_tc, src_xml, flags=re.DOTALL) + + src_xml = re.sub( + r"](?:(?!]).)*?{%\s*vm\s*%}.*?]", + v_merge_tc, + src_xml, + flags=re.DOTALL, + ) # Use ``{% hm %}`` to make table cell become horizontally merged within # a ``{% for %}``. def h_merge_tc(m): - xml_to_patch = m.group() # Everything between ```` and ```` with ``{% hm %}`` inside. + xml_to_patch = ( + m.group() + ) # Everything between ```` and ```` with ``{% hm %}`` inside. def with_gridspan(m1): return ( - m1.group(1) + # ``w:gridSpan w:val="``. - '{{ ' + m1.group(2) + ' * loop.length }}' + # Content of ``w:val``, multiplied by loop length. - m1.group(3) # Closing quotation mark. + m1.group(1) # ``w:gridSpan w:val="``. + + "{{ " + + m1.group(2) + + " * loop.length }}" # Content of ``w:val``, multiplied by loop length. + + m1.group(3) # Closing quotation mark. ) def without_gridspan(m2): return ( - '' + - m2.group(1) + # Everything between ```` and ````. - m2.group(2) + # Everything before ``{% hm %}``. - m2.group(3) + # Everything after ``{% hm %}``. - m2.group(4) # ````. + '' + + m2.group(1) # Everything between ```` and ````. + + m2.group(2) # Everything before ``{% hm %}``. + + m2.group(3) # Everything after ``{% hm %}``. + + m2.group(4) # ````. ) - if re.search(r'w:gridSpan', xml_to_patch): + if re.search(r"w:gridSpan", xml_to_patch): # Simple case, there's already ``gridSpan``, multiply its value. xml = re.sub( @@ -195,15 +257,15 @@ def without_gridspan(m2): flags=re.DOTALL, ) xml = re.sub( - r'{%\s*hm\s*%}', - '', + r"{%\s*hm\s*%}", + "", xml, # Patched xml. flags=re.DOTALL, ) else: # There're no ``gridSpan``, add one. xml = re.sub( - r'(].*?)(.*?)(?:{%\s*hm\s*%})(.*?)()', + r"(].*?)(.*?)(?:{%\s*hm\s*%})(.*?)()", without_gridspan, xml_to_patch, flags=re.DOTALL, @@ -212,24 +274,31 @@ def without_gridspan(m2): # Discard every other cell generated in loop. return "{% if loop.first %}" + xml + "{% endif %}" - src_xml = re.sub(r'](?:(?!]).)*?{%\s*hm\s*%}.*?]', - h_merge_tc, src_xml, flags=re.DOTALL) + src_xml = re.sub( + r"](?:(?!]).)*?{%\s*hm\s*%}.*?]", + h_merge_tc, + src_xml, + flags=re.DOTALL, + ) def clean_tags(m): - return (m.group(0) - .replace(r"‘", "'") - .replace('<', '<') - .replace('>', '>') - .replace(u'“', u'"') - .replace(u'”', u'"') - .replace(u"‘", u"'") - .replace(u"’", u"'")) - src_xml = re.sub(r'(?<=\{[\{%])(.*?)(?=[\}%]})', clean_tags, src_xml) + return ( + m.group(0) + .replace(r"‘", "'") + .replace("<", "<") + .replace(">", ">") + .replace("“", '"') + .replace("”", '"') + .replace("‘", "'") + .replace("’", "'") + ) + + src_xml = re.sub(r"(?<=\{[\{%])(.*?)(?=[\}%]})", clean_tags, src_xml) return src_xml def render_xml_part(self, src_xml, part, context, jinja_env=None): - src_xml = re.sub(r'])', r'\n])", r"\n]+>', '', x), - src_xml.splitlines()[line_number:(line_number + 7)]) + exc.docx_context = map( + lambda x: re.sub(r"<[^>]+>", "", x), + src_xml.splitlines()[line_number : (line_number + 7)], + ) raise exc - dst_xml = re.sub(r'\n])', r'])", r" None: + def render_properties( + self, context: Dict[str, Any], jinja_env: Optional[Environment] = None + ) -> None: # List of string attributes of docx.opc.coreprops.CoreProperties which are strings. # It seems that some attributes cannot be written as strings. Those are commented out. properties = [ - 'author', + "author", # 'category', - 'comments', + "comments", # 'content_status', - 'identifier', + "identifier", # 'keywords', - 'language', + "language", # 'last_modified_by', - 'subject', - 'title', + "subject", + "title", # 'version', ] if jinja_env is None: @@ -280,32 +354,53 @@ def render_properties(self, context: Dict[str, Any], jinja_env: Optional[Environ def resolve_listing(self, xml): def resolve_text(run_properties, paragraph_properties, m): - xml = m.group(0).replace('\t', '' - '%s' - '%s' % (run_properties, run_properties)) - xml = xml.replace('\a', '' - '%s%s' % (paragraph_properties, run_properties)) - xml = xml.replace('\n', '') - xml = xml.replace('\f', '' - '' - '%s%s' % (paragraph_properties, run_properties)) + xml = m.group(0).replace( + "\t", + "" + "%s" + '%s' % (run_properties, run_properties), + ) + xml = xml.replace( + "\a", + "" + '%s%s' + % (paragraph_properties, run_properties), + ) + xml = xml.replace("\n", '') + xml = xml.replace( + "\f", + "" + '' + '%s%s' + % (paragraph_properties, run_properties), + ) return xml def resolve_run(paragraph_properties, m): - run_properties = re.search(r'.*?', m.group(0)) - run_properties = run_properties.group(0) if run_properties else '' - return re.sub(r']*)?>.*?', - lambda x: resolve_text(run_properties, paragraph_properties, x), m.group(0), - flags=re.DOTALL) + run_properties = re.search(r".*?", m.group(0)) + run_properties = run_properties.group(0) if run_properties else "" + return re.sub( + r"]*)?>.*?", + lambda x: resolve_text(run_properties, paragraph_properties, x), + m.group(0), + flags=re.DOTALL, + ) def resolve_paragraph(m): - paragraph_properties = re.search(r'.*?', m.group(0)) - paragraph_properties = paragraph_properties.group(0) if paragraph_properties else '' - return re.sub(r']*)?>.*?', - lambda x: resolve_run(paragraph_properties, x), - m.group(0), flags=re.DOTALL) + paragraph_properties = re.search(r".*?", m.group(0)) + paragraph_properties = ( + paragraph_properties.group(0) if paragraph_properties else "" + ) + return re.sub( + r"]*)?>.*?", + lambda x: resolve_run(paragraph_properties, x), + m.group(0), + flags=re.DOTALL, + ) - xml = re.sub(r']*)?>.*?', resolve_paragraph, xml, flags=re.DOTALL) + xml = re.sub( + r"]*)?>.*?", resolve_paragraph, xml, flags=re.DOTALL + ) return xml @@ -332,7 +427,7 @@ def get_headers_footers_encoding(self, xml): m = re.match(r'<\?xml[^\?]+\bencoding="([^"]+)"', xml, re.I) if m: return m.group(1) - return 'utf-8' + return "utf-8" def build_headers_footers_xml(self, context, uri, jinja_env=None): for relKey, part in self.get_headers_footers(uri): @@ -353,7 +448,7 @@ def render( self, context: Dict[str, Any], jinja_env: Optional[Environment] = None, - autoescape: bool = False + autoescape: bool = False, ) -> None: # init template working attributes self.render_init() @@ -377,14 +472,12 @@ def render( self.map_tree(tree) # Headers - headers = self.build_headers_footers_xml(context, self.HEADER_URI, - jinja_env) + headers = self.build_headers_footers_xml(context, self.HEADER_URI, jinja_env) for relKey, xml in headers: self.map_headers_footers_xml(relKey, xml) # Footers - footers = self.build_headers_footers_xml(context, self.FOOTER_URI, - jinja_env) + footers = self.build_headers_footers_xml(context, self.FOOTER_URI, jinja_env) for relKey, xml in footers: self.map_headers_footers_xml(relKey, xml) @@ -399,15 +492,15 @@ def fix_tables(self, xml): parser = etree.XMLParser(recover=True) tree = etree.fromstring(xml, parser=parser) # get namespace - ns = '{' + tree.nsmap['w'] + '}' + ns = "{" + tree.nsmap["w"] + "}" # walk trough xml and find table - for t in tree.iter(ns+'tbl'): - tblGrid = t.find(ns+'tblGrid') - columns = tblGrid.findall(ns+'gridCol') + for t in tree.iter(ns + "tbl"): + tblGrid = t.find(ns + "tblGrid") + columns = tblGrid.findall(ns + "gridCol") to_add = 0 # walk trough all rows and try to find if there is higher cell count - for r in t.iter(ns+'tr'): - cells = r.findall(ns+'tc') + for r in t.iter(ns + "tr"): + cells = r.findall(ns + "tc") if (len(columns) + to_add) < len(cells): to_add = len(cells) - len(columns) # is necessary to add columns? @@ -417,39 +510,44 @@ def fix_tables(self, xml): width = 0.0 new_average = None for c in columns: - if not c.get(ns+'w') is None: - width += float(c.get(ns+'w')) + if not c.get(ns + "w") is None: + width += float(c.get(ns + "w")) # try to keep proportion of table if width > 0: old_average = width / len(columns) new_average = width / (len(columns) + to_add) # scale the old columns for c in columns: - c.set(ns+'w', str(int(float(c.get(ns+'w')) * - new_average/old_average))) + c.set( + ns + "w", + str( + int(float(c.get(ns + "w")) * new_average / old_average) + ), + ) # add new columns for i in range(to_add): - etree.SubElement(tblGrid, ns+'gridCol', - {ns+'w': str(int(new_average))}) + etree.SubElement( + tblGrid, ns + "gridCol", {ns + "w": str(int(new_average))} + ) # Refetch columns after columns addition. - columns = tblGrid.findall(ns + 'gridCol') + columns = tblGrid.findall(ns + "gridCol") columns_len = len(columns) cells_len_max = 0 def get_cell_len(total, cell): - tc_pr = cell.find(ns + 'tcPr') - grid_span = None if tc_pr is None else tc_pr.find(ns + 'gridSpan') + tc_pr = cell.find(ns + "tcPr") + grid_span = None if tc_pr is None else tc_pr.find(ns + "gridSpan") if grid_span is not None: - return total + int(grid_span.get(ns + 'val')) + return total + int(grid_span.get(ns + "val")) return total + 1 # Calculate max of table cells to compare with `gridCol`. - for r in t.iter(ns + 'tr'): - cells = r.findall(ns + 'tc') + for r in t.iter(ns + "tr"): + cells = r.findall(ns + "tc") cells_len = functools.reduce(get_cell_len, cells, 0) cells_len_max = max(cells_len_max, cells_len) @@ -463,11 +561,11 @@ def get_cell_len(total, cell): removed_width = 0.0 for c in columns[-to_remove:]: - removed_width += float(c.get(ns + 'w')) + removed_width += float(c.get(ns + "w")) tblGrid.remove(c) - columns_left = tblGrid.findall(ns + 'gridCol') + columns_left = tblGrid.findall(ns + "gridCol") # Distribute `removed_width` across all columns that has # left after extras removal. @@ -477,15 +575,15 @@ def get_cell_len(total, cell): extra_space = int(extra_space) for c in columns_left: - c.set(ns+'w', str(int(float(c.get(ns+'w')) + extra_space))) + c.set(ns + "w", str(int(float(c.get(ns + "w")) + extra_space))) return tree def fix_docpr_ids(self, tree): # some Ids may have some collisions : so renumbering all of them : - for elt in tree.xpath('//wp:docPr', namespaces=docx.oxml.ns.nsmap): + for elt in tree.xpath("//wp:docPr", namespaces=docx.oxml.ns.nsmap): self.docx_ids_index += 1 - elt.attrib['id'] = str(self.docx_ids_index) + elt.attrib["id"] = str(self.docx_ids_index) def new_subdoc(self, docpath=None): self.init_docx() @@ -493,13 +591,13 @@ def new_subdoc(self, docpath=None): @staticmethod def get_file_crc(file_obj): - if hasattr(file_obj, 'read'): + if hasattr(file_obj, "read"): buf = file_obj.read() else: - with open(file_obj, 'rb') as fh: + with open(file_obj, "rb") as fh: buf = fh.read() - crc = (binascii.crc32(buf) & 0xFFFFFFFF) + crc = binascii.crc32(buf) & 0xFFFFFFFF return crc def replace_media(self, src_file, dst_file): @@ -522,10 +620,10 @@ def replace_media(self, src_file, dst_file): """ crc = self.get_file_crc(src_file) - if hasattr(dst_file, 'read'): + if hasattr(dst_file, "read"): self.crc_to_new_media[crc] = dst_file.read() else: - with open(dst_file, 'rb') as fh: + with open(dst_file, "rb") as fh: self.crc_to_new_media[crc] = fh.read() def replace_pic(self, embedded_file, dst_file): @@ -543,11 +641,11 @@ def replace_pic(self, embedded_file, dst_file): for replace_embedded and replace_media) """ - if hasattr(dst_file, 'read'): + if hasattr(dst_file, "read"): # NOTE: file extension not checked self.pics_to_replace[embedded_file] = dst_file.read() else: - with open(dst_file, 'rb') as fh: + with open(dst_file, "rb") as fh: self.pics_to_replace[embedded_file] = fh.read() def replace_embedded(self, src_file, dst_file): @@ -563,7 +661,7 @@ def replace_embedded(self, src_file, dst_file): Note2 : it is important to have the source file as it is required to calculate its CRC to find them in the docx """ - with open(dst_file, 'rb') as fh: + with open(dst_file, "rb") as fh: crc = self.get_file_crc(src_file) self.crc_to_new_embedded[crc] = fh.read() @@ -594,7 +692,7 @@ def replace_zipname(self, zipname, dst_file): "word/embeddings/". Note that the file is renamed by MSWord, so you have to guess a little bit... """ - with open(dst_file, 'rb') as fh: + with open(dst_file, "rb") as fh: self.zipname_to_replace[zipname] = fh.read() def reset_replacements(self): @@ -619,11 +717,9 @@ def reset_replacements(self): self.pics_to_replace = {} def post_processing(self, docx_file): - if (self.crc_to_new_media or - self.crc_to_new_embedded or - self.zipname_to_replace): + if self.crc_to_new_media or self.crc_to_new_embedded or self.zipname_to_replace: - if hasattr(docx_file, 'read'): + if hasattr(docx_file, "read"): tmp_file = io.BytesIO() DocxTemplate(docx_file).save(tmp_file) tmp_file.seek(0) @@ -632,27 +728,31 @@ def post_processing(self, docx_file): docx_file.seek(0) else: - tmp_file = '%s_docxtpl_before_replace_medias' % docx_file + tmp_file = "%s_docxtpl_before_replace_medias" % docx_file os.rename(docx_file, tmp_file) with zipfile.ZipFile(tmp_file) as zin: - with zipfile.ZipFile(docx_file, 'w') as zout: + with zipfile.ZipFile(docx_file, "w") as zout: for item in zin.infolist(): buf = zin.read(item.filename) if item.filename in self.zipname_to_replace: zout.writestr(item, self.zipname_to_replace[item.filename]) - elif (item.filename.startswith('word/media/') and - item.CRC in self.crc_to_new_media): + elif ( + item.filename.startswith("word/media/") + and item.CRC in self.crc_to_new_media + ): zout.writestr(item, self.crc_to_new_media[item.CRC]) - elif (item.filename.startswith('word/embeddings/') and - item.CRC in self.crc_to_new_embedded): + elif ( + item.filename.startswith("word/embeddings/") + and item.CRC in self.crc_to_new_embedded + ): zout.writestr(item, self.crc_to_new_embedded[item.CRC]) else: zout.writestr(item, buf) - if not hasattr(tmp_file, 'read'): + if not hasattr(tmp_file, "read"): os.remove(tmp_file) - if hasattr(docx_file, 'read'): + if hasattr(docx_file, "read"): docx_file.seek(0) def pre_processing(self): @@ -677,9 +777,7 @@ def _replace_pics(self): # make sure all template images defined by user were replaced for img_id, replaced in replaced_pics.items(): if not replaced: - raise ValueError( - "Picture %s not found in the docx template" % img_id - ) + raise ValueError("Picture %s not found in the docx template" % img_id) def get_pic_map(self): return self.pic_map @@ -690,16 +788,17 @@ def _replace_docx_part_pics(self, doc_part, replaced_pics): part_map = {} - gds = et.xpath('//a:graphic/a:graphicData', namespaces=docx.oxml.ns.nsmap) + gds = et.xpath("//a:graphic/a:graphicData", namespaces=docx.oxml.ns.nsmap) for gd in gds: rel = None # Either IMAGE, CHART, SMART_ART, ... try: - if gd.attrib['uri'] == docx.oxml.ns.nsmap['pic']: + if gd.attrib["uri"] == docx.oxml.ns.nsmap["pic"]: # Either PICTURE or LINKED_PICTURE image - blip = gd.xpath('pic:pic/pic:blipFill/a:blip', - namespaces=docx.oxml.ns.nsmap)[0] - dest = blip.xpath('@r:embed', namespaces=docx.oxml.ns.nsmap) + blip = gd.xpath( + "pic:pic/pic:blipFill/a:blip", namespaces=docx.oxml.ns.nsmap + )[0] + dest = blip.xpath("@r:embed", namespaces=docx.oxml.ns.nsmap) if len(dest) > 0: rel = dest[0] else: @@ -707,24 +806,29 @@ def _replace_docx_part_pics(self, doc_part, replaced_pics): else: continue - non_visual_properties = 'pic:pic/pic:nvPicPr/pic:cNvPr/' - filename = gd.xpath('%s@name' % non_visual_properties, - namespaces=docx.oxml.ns.nsmap)[0] - titles = gd.xpath('%s@title' % non_visual_properties, - namespaces=docx.oxml.ns.nsmap) + non_visual_properties = "pic:pic/pic:nvPicPr/pic:cNvPr/" + filename = gd.xpath( + "%s@name" % non_visual_properties, namespaces=docx.oxml.ns.nsmap + )[0] + titles = gd.xpath( + "%s@title" % non_visual_properties, namespaces=docx.oxml.ns.nsmap + ) if titles: title = titles[0] else: title = "" - descriptions = gd.xpath('%s@descr' % non_visual_properties, - namespaces=docx.oxml.ns.nsmap) + descriptions = gd.xpath( + "%s@descr" % non_visual_properties, namespaces=docx.oxml.ns.nsmap + ) if descriptions: description = descriptions[0] else: description = "" - part_map[filename] = (doc_part.rels[rel].target_ref, - doc_part.rels[rel].target_part) + part_map[filename] = ( + doc_part.rels[rel].target_ref, + doc_part.rels[rel].target_part, + ) # replace data for img_id, img_data in six.iteritems(self.pics_to_replace): @@ -741,8 +845,7 @@ def _replace_docx_part_pics(self, doc_part, replaced_pics): def build_url_id(self, url): self.init_docx() - return self.docx._part.relate_to(url, REL_TYPE.HYPERLINK, - is_external=True) + return self.docx._part.relate_to(url, REL_TYPE.HYPERLINK, is_external=True) def save(self, filename: Union[IO[bytes], str, PathLike], *args, **kwargs) -> None: # case where save() is called without doing rendering @@ -754,7 +857,9 @@ def save(self, filename: Union[IO[bytes], str, PathLike], *args, **kwargs) -> No self.post_processing(filename) self.is_saved = True - def get_undeclared_template_variables(self, jinja_env: Optional[Environment] = None) -> Set[str]: + def get_undeclared_template_variables( + self, jinja_env: Optional[Environment] = None + ) -> Set[str]: self.init_docx(reload=False) xml = self.get_xml() xml = self.patch_xml(xml) diff --git a/poetry.lock b/poetry.lock index a6f6e73..7cb1d13 100644 --- a/poetry.lock +++ b/poetry.lock @@ -14,6 +14,75 @@ files = [ [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +[[package]] +name = "black" +version = "24.4.2" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, + {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, + {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, + {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, + {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, + {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, + {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, + {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, + {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, + {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, + {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, + {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, + {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, + {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, + {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, + {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, + {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, + {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, + {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, + {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, + {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, + {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + [[package]] name = "docxcompose" version = "1.4.0" @@ -306,6 +375,55 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "platformdirs" +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + [[package]] name = "pycodestyle" version = "2.12.0" @@ -384,4 +502,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "0a19499992b7770bc844b87288ec61c29b194487b3e99437a9004e66d7965ca8" +content-hash = "43818448bde523eafcedcdaeb6541d8205a5d52eef5cb4d0e1a0563a7134a579" diff --git a/pyproject.toml b/pyproject.toml index 692505d..cf402f4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ six = "^1.16.0" python-docx = "^1.1.2" docxcompose = "^1.4.0" jinja2 = "^3.1.4" +black = "^24.4.2" [tool.poetry.group.dev.dependencies] diff --git a/tests/cellbg.py b/tests/cellbg.py index 79938fb..e8f4487 100644 --- a/tests/cellbg.py +++ b/tests/cellbg.py @@ -1,42 +1,42 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2015-03-12 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate, RichText -tpl = DocxTemplate('templates/cellbg_tpl.docx') +tpl = DocxTemplate("templates/cellbg_tpl.docx") context = { - 'alerts': [ + "alerts": [ { - 'date': '2015-03-10', - 'desc': RichText('Very critical alert', color='FF0000', bold=True), - 'type': 'CRITICAL', - 'bg': 'FF0000', + "date": "2015-03-10", + "desc": RichText("Very critical alert", color="FF0000", bold=True), + "type": "CRITICAL", + "bg": "FF0000", }, { - 'date': '2015-03-11', - 'desc': RichText('Just a warning'), - 'type': 'WARNING', - 'bg': 'FFDD00', + "date": "2015-03-11", + "desc": RichText("Just a warning"), + "type": "WARNING", + "bg": "FFDD00", }, { - 'date': '2015-03-12', - 'desc': RichText('Information'), - 'type': 'INFO', - 'bg': '8888FF', + "date": "2015-03-12", + "desc": RichText("Information"), + "type": "INFO", + "bg": "8888FF", }, { - 'date': '2015-03-13', - 'desc': RichText('Debug trace'), - 'type': 'DEBUG', - 'bg': 'FF00FF', + "date": "2015-03-13", + "desc": RichText("Debug trace"), + "type": "DEBUG", + "bg": "FF00FF", }, ], } tpl.render(context) -tpl.save('output/cellbg.docx') +tpl.save("output/cellbg.docx") diff --git a/tests/comments.py b/tests/comments.py index 5a214ca..b0d31e4 100644 --- a/tests/comments.py +++ b/tests/comments.py @@ -1,6 +1,6 @@ from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/comments_tpl.docx') +tpl = DocxTemplate("templates/comments_tpl.docx") tpl.render({}) -tpl.save('output/comments.docx') +tpl.save("output/comments.docx") diff --git a/tests/custom_jinja_filters.py b/tests/custom_jinja_filters.py index 580986b..5d89570 100644 --- a/tests/custom_jinja_filters.py +++ b/tests/custom_jinja_filters.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2015-03-12 @author: sandeeprah, Eric Lapouyade -''' +""" from docxtpl import DocxTemplate import jinja2 @@ -14,7 +14,7 @@ # to create new filters, first create functions that accept the value to filter # as first argument, and filter parameters as next arguments def my_filterA(value, my_string_arg): - return_value = value + ' ' + my_string_arg + return_value = value + " " + my_string_arg return return_value @@ -24,12 +24,12 @@ def my_filterB(value, my_float_arg): # Then, declare them to jinja like this : -jinja_env.filters['my_filterA'] = my_filterA -jinja_env.filters['my_filterB'] = my_filterB +jinja_env.filters["my_filterA"] = my_filterA +jinja_env.filters["my_filterB"] = my_filterB -context = {'base_value_string': ' Hello', 'base_value_float': 1.5} +context = {"base_value_string": " Hello", "base_value_float": 1.5} -tpl = DocxTemplate('templates/custom_jinja_filters_tpl.docx') +tpl = DocxTemplate("templates/custom_jinja_filters_tpl.docx") tpl.render(context, jinja_env) -tpl.save('output/custom_jinja_filters.docx') +tpl.save("output/custom_jinja_filters.docx") diff --git a/tests/doc_properties.py b/tests/doc_properties.py index e60ac19..fe48bf8 100644 --- a/tests/doc_properties.py +++ b/tests/doc_properties.py @@ -1,12 +1,10 @@ from docxtpl import DocxTemplate -doctemplate = r'templates/doc_properties_tpl.docx' +doctemplate = r"templates/doc_properties_tpl.docx" tpl = DocxTemplate(doctemplate) -context = { - 'test': 'HelloWorld' -} +context = {"test": "HelloWorld"} tpl.render(context) tpl.save("output/doc_properties.docx") diff --git a/tests/dynamic_table.py b/tests/dynamic_table.py index f4446d3..2eb6b48 100644 --- a/tests/dynamic_table.py +++ b/tests/dynamic_table.py @@ -1,15 +1,15 @@ from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/dynamic_table_tpl.docx') +tpl = DocxTemplate("templates/dynamic_table_tpl.docx") context = { - 'col_labels': ['fruit', 'vegetable', 'stone', 'thing'], - 'tbl_contents': [ - {'label': 'yellow', 'cols': ['banana', 'capsicum', 'pyrite', 'taxi']}, - {'label': 'red', 'cols': ['apple', 'tomato', 'cinnabar', 'doubledecker']}, - {'label': 'green', 'cols': ['guava', 'cucumber', 'aventurine', 'card']}, + "col_labels": ["fruit", "vegetable", "stone", "thing"], + "tbl_contents": [ + {"label": "yellow", "cols": ["banana", "capsicum", "pyrite", "taxi"]}, + {"label": "red", "cols": ["apple", "tomato", "cinnabar", "doubledecker"]}, + {"label": "green", "cols": ["guava", "cucumber", "aventurine", "card"]}, ], } tpl.render(context) -tpl.save('output/dynamic_table.docx') +tpl.save("output/dynamic_table.docx") diff --git a/tests/embedded.py b/tests/embedded.py index 842798c..a9fff5f 100644 --- a/tests/embedded.py +++ b/tests/embedded.py @@ -1,45 +1,45 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2017-09-09 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate # rendering the "dynamic embedded docx": -embedded_docx_tpl = DocxTemplate('templates/embedded_embedded_docx_tpl.docx') +embedded_docx_tpl = DocxTemplate("templates/embedded_embedded_docx_tpl.docx") context = { - 'name': 'John Doe', + "name": "John Doe", } embedded_docx_tpl.render(context) -embedded_docx_tpl.save('output/embedded_embedded_docx.docx') +embedded_docx_tpl.save("output/embedded_embedded_docx.docx") # rendering the main document : -tpl = DocxTemplate('templates/embedded_main_tpl.docx') +tpl = DocxTemplate("templates/embedded_main_tpl.docx") context = { - 'name': 'John Doe', + "name": "John Doe", } tpl.replace_embedded( - 'templates/embedded_dummy.docx', 'templates/embedded_static_docx.docx' + "templates/embedded_dummy.docx", "templates/embedded_static_docx.docx" ) tpl.replace_embedded( - 'templates/embedded_dummy2.docx', 'output/embedded_embedded_docx.docx' + "templates/embedded_dummy2.docx", "output/embedded_embedded_docx.docx" ) # The zipname is the one you can find when you open docx with WinZip, 7zip (Windows) # or unzip -l (Linux). The zipname starts with "word/embeddings/". # Note that the file is renamed by MSWord, so you have to guess a little bit... tpl.replace_zipname( - 'word/embeddings/Feuille_Microsoft_Office_Excel3.xlsx', 'templates/real_Excel.xlsx' + "word/embeddings/Feuille_Microsoft_Office_Excel3.xlsx", "templates/real_Excel.xlsx" ) tpl.replace_zipname( - 'word/embeddings/Pr_sentation_Microsoft_Office_PowerPoint4.pptx', - 'templates/real_PowerPoint.pptx', + "word/embeddings/Pr_sentation_Microsoft_Office_PowerPoint4.pptx", + "templates/real_PowerPoint.pptx", ) tpl.render(context) -tpl.save('output/embedded.docx') +tpl.save("output/embedded.docx") diff --git a/tests/escape.py b/tests/escape.py index de14345..77375ab 100644 --- a/tests/escape.py +++ b/tests/escape.py @@ -1,19 +1,19 @@ from docxtpl import DocxTemplate, R, Listing -tpl = DocxTemplate('templates/escape_tpl.docx') +tpl = DocxTemplate("templates/escape_tpl.docx") context = { - 'myvar': R( + "myvar": R( '"less than" must be escaped : <, this can be done with RichText() or R()' ), - 'myescvar': 'It can be escaped with a "|e" jinja filter in the template too : < ', - 'nlnp': R('Here is a multiple\nlines\nstring\aand some\aother\aparagraphs', - color='#ff00ff'), - 'mylisting': Listing( - 'the listing\nwith\nsome\nlines\nand special chars : <>& ...' + "myescvar": 'It can be escaped with a "|e" jinja filter in the template too : < ', + "nlnp": R( + "Here is a multiple\nlines\nstring\aand some\aother\aparagraphs", + color="#ff00ff", ), - 'page_break': R('\f'), - 'new_listing': """ + "mylisting": Listing("the listing\nwith\nsome\nlines\nand special chars : <>& ..."), + "page_break": R("\f"), + "new_listing": """ This is a new listing Now, does not require Listing() Object Here is a \t tab\a @@ -21,34 +21,34 @@ Here is a page break : \f That's it """, - 'some_html': ( - 'HTTP/1.1 200 OK\n' - 'Server: Apache-Coyote/1.1\n' - 'Cache-Control: no-store\n' - 'Expires: Thu, 01 Jan 1970 00:00:00 GMT\n' - 'Pragma: no-cache\n' - 'Content-Type: text/html;charset=UTF-8\n' - 'Content-Language: zh-CN\n' - 'Date: Thu, 22 Oct 2020 10:59:40 GMT\n' - 'Content-Length: 9866\n' - '\n' - '\n' - '\n' - ' Struts Problem Report\n' - ' \n' - '\n' - '\n' - '...\n' - '\n' - '' + "some_html": ( + "HTTP/1.1 200 OK\n" + "Server: Apache-Coyote/1.1\n" + "Cache-Control: no-store\n" + "Expires: Thu, 01 Jan 1970 00:00:00 GMT\n" + "Pragma: no-cache\n" + "Content-Type: text/html;charset=UTF-8\n" + "Content-Language: zh-CN\n" + "Date: Thu, 22 Oct 2020 10:59:40 GMT\n" + "Content-Length: 9866\n" + "\n" + "\n" + "\n" + " Struts Problem Report\n" + " \n" + "\n" + "\n" + "...\n" + "\n" + "" ), } tpl.render(context) -tpl.save('output/escape.docx') +tpl.save("output/escape.docx") diff --git a/tests/escape_auto.py b/tests/escape_auto.py index e0def1d..bd4d676 100644 --- a/tests/escape_auto.py +++ b/tests/escape_auto.py @@ -12,18 +12,18 @@ XML_RESERVED = """<"&'>""" -tpl = DocxTemplate('templates/escape_tpl_auto.docx') +tpl = DocxTemplate("templates/escape_tpl_auto.docx") context = { - 'nested_dict': {name(text_type(c)): c for c in XML_RESERVED}, - 'autoescape': 'Escaped "str & ing"!', - 'autoescape_unicode': u'This is an escaped example \u4f60 & \u6211', - 'iteritems': iteritems, + "nested_dict": {name(text_type(c)): c for c in XML_RESERVED}, + "autoescape": 'Escaped "str & ing"!', + "autoescape_unicode": "This is an escaped example \u4f60 & \u6211", + "iteritems": iteritems, } tpl.render(context, autoescape=True) -OUTPUT = 'output' +OUTPUT = "output" if not os.path.exists(OUTPUT): os.makedirs(OUTPUT) -tpl.save(OUTPUT + '/escape_auto.docx') +tpl.save(OUTPUT + "/escape_auto.docx") diff --git a/tests/header_footer.py b/tests/header_footer.py index d60cc74..53362b6 100644 --- a/tests/header_footer.py +++ b/tests/header_footer.py @@ -1,25 +1,25 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2015-03-12 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/header_footer_tpl.docx') +tpl = DocxTemplate("templates/header_footer_tpl.docx") sd = tpl.new_subdoc() p = sd.add_paragraph( - 'This is a sub-document to check it does not break header and footer' + "This is a sub-document to check it does not break header and footer" ) context = { - 'title': 'Header and footer test', - 'company_name': 'The World Wide company', - 'date': '2016-03-17', - 'mysubdoc': sd, + "title": "Header and footer test", + "company_name": "The World Wide company", + "date": "2016-03-17", + "mysubdoc": sd, } tpl.render(context) -tpl.save('output/header_footer.docx') +tpl.save("output/header_footer.docx") diff --git a/tests/header_footer_entities.py b/tests/header_footer_entities.py index 320b5ef..ddaa3d2 100644 --- a/tests/header_footer_entities.py +++ b/tests/header_footer_entities.py @@ -1,17 +1,17 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2015-03-12 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/header_footer_entities_tpl.docx') +tpl = DocxTemplate("templates/header_footer_entities_tpl.docx") context = { - 'title': 'Header and footer test', + "title": "Header and footer test", } tpl.render(context) -tpl.save('output/header_footer_entities.docx') +tpl.save("output/header_footer_entities.docx") diff --git a/tests/header_footer_image.py b/tests/header_footer_image.py index 6ccaf55..24ca020 100644 --- a/tests/header_footer_image.py +++ b/tests/header_footer_image.py @@ -1,19 +1,19 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2017-09-03 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -DEST_FILE = 'output/header_footer_image.docx' +DEST_FILE = "output/header_footer_image.docx" -tpl = DocxTemplate('templates/header_footer_image_tpl.docx') +tpl = DocxTemplate("templates/header_footer_image_tpl.docx") context = { - 'mycompany': 'The World Wide company', + "mycompany": "The World Wide company", } -tpl.replace_media('templates/dummy_pic_for_header.png', 'templates/python.png') +tpl.replace_media("templates/dummy_pic_for_header.png", "templates/python.png") tpl.render(context) tpl.save(DEST_FILE) diff --git a/tests/header_footer_image_file_obj.py b/tests/header_footer_image_file_obj.py index a1bfcc9..0959748 100644 --- a/tests/header_footer_image_file_obj.py +++ b/tests/header_footer_image_file_obj.py @@ -1,29 +1,29 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2019-05-22 @author: Eric Dufresne -''' +""" from docxtpl import DocxTemplate import io -DEST_FILE = 'output/header_footer_image_file_obj.docx' -DEST_FILE2 = 'output/header_footer_image_file_obj2.docx' +DEST_FILE = "output/header_footer_image_file_obj.docx" +DEST_FILE2 = "output/header_footer_image_file_obj2.docx" -tpl = DocxTemplate('templates/header_footer_image_tpl.docx') +tpl = DocxTemplate("templates/header_footer_image_tpl.docx") context = { - 'mycompany': 'The World Wide company', + "mycompany": "The World Wide company", } -dummy_pic = io.BytesIO(open('templates/dummy_pic_for_header.png', 'rb').read()) -new_image = io.BytesIO(open('templates/python.png', 'rb').read()) +dummy_pic = io.BytesIO(open("templates/dummy_pic_for_header.png", "rb").read()) +new_image = io.BytesIO(open("templates/python.png", "rb").read()) tpl.replace_media(dummy_pic, new_image) tpl.render(context) tpl.save(DEST_FILE) -tpl = DocxTemplate('templates/header_footer_image_tpl.docx') +tpl = DocxTemplate("templates/header_footer_image_tpl.docx") dummy_pic.seek(0) new_image.seek(0) tpl.replace_media(dummy_pic, new_image) @@ -32,5 +32,5 @@ file_obj = io.BytesIO() tpl.save(file_obj) file_obj.seek(0) -with open(DEST_FILE2, 'wb') as f: +with open(DEST_FILE2, "wb") as f: f.write(file_obj.read()) diff --git a/tests/header_footer_inline_image.py b/tests/header_footer_inline_image.py index 81fa0eb..26a3122 100644 --- a/tests/header_footer_inline_image.py +++ b/tests/header_footer_inline_image.py @@ -1,24 +1,24 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2021-04-06 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate, InlineImage # for height and width you have to use millimeters (Mm), inches or points(Pt) class : from docx.shared import Mm -tpl = DocxTemplate('templates/header_footer_inline_image_tpl.docx') +tpl = DocxTemplate("templates/header_footer_inline_image_tpl.docx") context = { - 'inline_image': InlineImage(tpl, 'templates/django.png', height=Mm(10)), - 'images': [ - InlineImage(tpl, 'templates/python.png', height=Mm(10)), - InlineImage(tpl, 'templates/python.png', height=Mm(10)), - InlineImage(tpl, 'templates/python.png', height=Mm(10)) - ] + "inline_image": InlineImage(tpl, "templates/django.png", height=Mm(10)), + "images": [ + InlineImage(tpl, "templates/python.png", height=Mm(10)), + InlineImage(tpl, "templates/python.png", height=Mm(10)), + InlineImage(tpl, "templates/python.png", height=Mm(10)), + ], } tpl.render(context) -tpl.save('output/header_footer_inline_image.docx') +tpl.save("output/header_footer_inline_image.docx") diff --git a/tests/header_footer_utf8.py b/tests/header_footer_utf8.py index 9d2c16b..a167074 100644 --- a/tests/header_footer_utf8.py +++ b/tests/header_footer_utf8.py @@ -1,28 +1,28 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2016-07-19 @author: AhnSeongHyun Edited : 2016-07-19 by Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/header_footer_tpl_utf8.docx') +tpl = DocxTemplate("templates/header_footer_tpl_utf8.docx") sd = tpl.new_subdoc() p = sd.add_paragraph( - u'This is a sub-document to check it does not break header and footer with utf-8 ' - u'characters inside the template .docx' + "This is a sub-document to check it does not break header and footer with utf-8 " + "characters inside the template .docx" ) context = { - 'title': u'헤더와 푸터', - 'company_name': u'세계적 회사', - 'date': u'2016-03-17', - 'mysubdoc': sd, + "title": "헤더와 푸터", + "company_name": "세계적 회사", + "date": "2016-03-17", + "mysubdoc": sd, } tpl.render(context) -tpl.save('output/header_footer_utf8.docx') +tpl.save("output/header_footer_utf8.docx") diff --git a/tests/horizontal_merge.py b/tests/horizontal_merge.py index 7c8393c..889eb77 100644 --- a/tests/horizontal_merge.py +++ b/tests/horizontal_merge.py @@ -2,6 +2,6 @@ from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/horizontal_merge_tpl.docx') +tpl = DocxTemplate("templates/horizontal_merge_tpl.docx") tpl.render({}) -tpl.save('output/horizontal_merge.docx') +tpl.save("output/horizontal_merge.docx") diff --git a/tests/inline_image.py b/tests/inline_image.py index 5134d64..c07bf72 100644 --- a/tests/inline_image.py +++ b/tests/inline_image.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2017-01-14 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate, InlineImage @@ -11,37 +11,37 @@ from docx.shared import Mm import jinja2 -tpl = DocxTemplate('templates/inline_image_tpl.docx') +tpl = DocxTemplate("templates/inline_image_tpl.docx") context = { - 'myimage': InlineImage(tpl, 'templates/python_logo.png', width=Mm(20)), - 'myimageratio': InlineImage( - tpl, 'templates/python_jpeg.jpg', width=Mm(30), height=Mm(60) + "myimage": InlineImage(tpl, "templates/python_logo.png", width=Mm(20)), + "myimageratio": InlineImage( + tpl, "templates/python_jpeg.jpg", width=Mm(30), height=Mm(60) ), - 'frameworks': [ + "frameworks": [ { - 'image': InlineImage(tpl, 'templates/django.png', height=Mm(10)), - 'desc': 'The web framework for perfectionists with deadlines', + "image": InlineImage(tpl, "templates/django.png", height=Mm(10)), + "desc": "The web framework for perfectionists with deadlines", }, { - 'image': InlineImage(tpl, 'templates/zope.png', height=Mm(10)), - 'desc': 'Zope is a leading Open Source Application Server and Content Management Framework', + "image": InlineImage(tpl, "templates/zope.png", height=Mm(10)), + "desc": "Zope is a leading Open Source Application Server and Content Management Framework", }, { - 'image': InlineImage(tpl, 'templates/pyramid.png', height=Mm(10)), - 'desc': 'Pyramid is a lightweight Python web framework aimed at taking small web apps into big web apps.', + "image": InlineImage(tpl, "templates/pyramid.png", height=Mm(10)), + "desc": "Pyramid is a lightweight Python web framework aimed at taking small web apps into big web apps.", }, { - 'image': InlineImage(tpl, 'templates/bottle.png', height=Mm(10)), - 'desc': 'Bottle is a fast, simple and lightweight WSGI micro web-framework for Python', + "image": InlineImage(tpl, "templates/bottle.png", height=Mm(10)), + "desc": "Bottle is a fast, simple and lightweight WSGI micro web-framework for Python", }, { - 'image': InlineImage(tpl, 'templates/tornado.png', height=Mm(10)), - 'desc': 'Tornado is a Python web framework and asynchronous networking library.', + "image": InlineImage(tpl, "templates/tornado.png", height=Mm(10)), + "desc": "Tornado is a Python web framework and asynchronous networking library.", }, ], } # testing that it works also when autoescape has been forced to True jinja_env = jinja2.Environment(autoescape=True) tpl.render(context, jinja_env) -tpl.save('output/inline_image.docx') +tpl.save("output/inline_image.docx") diff --git a/tests/less_cells_after_loop.py b/tests/less_cells_after_loop.py index 4e0cd5a..ca725d4 100644 --- a/tests/less_cells_after_loop.py +++ b/tests/less_cells_after_loop.py @@ -1,5 +1,5 @@ from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/less_cells_after_loop_tpl.docx') +tpl = DocxTemplate("templates/less_cells_after_loop_tpl.docx") tpl.render({}) -tpl.save('output/less_cells_after_loop.docx') +tpl.save("output/less_cells_after_loop.docx") diff --git a/tests/merge_docx.py b/tests/merge_docx.py index 9c99d11..28bbfd5 100644 --- a/tests/merge_docx.py +++ b/tests/merge_docx.py @@ -1,19 +1,19 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2021-07-30 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/merge_docx_master_tpl.docx') -sd = tpl.new_subdoc('templates/merge_docx_subdoc.docx') +tpl = DocxTemplate("templates/merge_docx_master_tpl.docx") +sd = tpl.new_subdoc("templates/merge_docx_subdoc.docx") context = { - 'mysubdoc': sd, + "mysubdoc": sd, } tpl.render(context) -tpl.save('output/merge_docx.docx') +tpl.save("output/merge_docx.docx") diff --git a/tests/merge_paragraph.py b/tests/merge_paragraph.py index 6ff5cf0..39cdcef 100644 --- a/tests/merge_paragraph.py +++ b/tests/merge_paragraph.py @@ -1,17 +1,17 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2015-03-12 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/merge_paragraph_tpl.docx') +tpl = DocxTemplate("templates/merge_paragraph_tpl.docx") context = { - 'living_in_town': True, + "living_in_town": True, } tpl.render(context) -tpl.save('output/merge_paragraph.docx') +tpl.save("output/merge_paragraph.docx") diff --git a/tests/module_execute.py b/tests/module_execute.py index e2ef28f..86c4ab9 100644 --- a/tests/module_execute.py +++ b/tests/module_execute.py @@ -1,19 +1,25 @@ import os -TEMPLATE_PATH = 'templates/module_execute_tpl.docx' -JSON_PATH = 'templates/module_execute.json' -OUTPUT_FILENAME = 'output/module_execute.docx' -OVERWRITE = '-o' -QUIET = '-q' +TEMPLATE_PATH = "templates/module_execute_tpl.docx" +JSON_PATH = "templates/module_execute.json" +OUTPUT_FILENAME = "output/module_execute.docx" +OVERWRITE = "-o" +QUIET = "-q" if os.path.exists(OUTPUT_FILENAME): os.unlink(OUTPUT_FILENAME) os.chdir(os.path.dirname(__file__)) -cmd = 'python -m docxtpl %s %s %s %s %s' % (TEMPLATE_PATH, JSON_PATH, OUTPUT_FILENAME, OVERWRITE, QUIET) +cmd = "python -m docxtpl %s %s %s %s %s" % ( + TEMPLATE_PATH, + JSON_PATH, + OUTPUT_FILENAME, + OVERWRITE, + QUIET, +) print('Executing "%s" ...' % cmd) os.system(cmd) if os.path.exists(OUTPUT_FILENAME): - print(' --> File %s has been generated.' % OUTPUT_FILENAME) + print(" --> File %s has been generated." % OUTPUT_FILENAME) diff --git a/tests/multi_rendering.py b/tests/multi_rendering.py index 6822a6f..f9a934f 100644 --- a/tests/multi_rendering.py +++ b/tests/multi_rendering.py @@ -1,40 +1,40 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2021-12-20 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/multi_rendering_tpl.docx') +tpl = DocxTemplate("templates/multi_rendering_tpl.docx") documents_data = [ { - 'dest_file': 'multi_render1.docx', - 'context': { - 'title': 'Title ONE', - 'body': 'This is the body for first document' - } + "dest_file": "multi_render1.docx", + "context": { + "title": "Title ONE", + "body": "This is the body for first document", + }, }, { - 'dest_file': 'multi_render2.docx', - 'context': { - 'title': 'Title TWO', - 'body': 'This is the body for second document' - } + "dest_file": "multi_render2.docx", + "context": { + "title": "Title TWO", + "body": "This is the body for second document", + }, }, { - 'dest_file': 'multi_render3.docx', - 'context': { - 'title': 'Title THREE', - 'body': 'This is the body for third document' - } + "dest_file": "multi_render3.docx", + "context": { + "title": "Title THREE", + "body": "This is the body for third document", + }, }, ] for document_data in documents_data: - dest_file = document_data['dest_file'] - context = document_data['context'] + dest_file = document_data["dest_file"] + context = document_data["context"] tpl.render(context) - tpl.save('output/%s' % dest_file) + tpl.save("output/%s" % dest_file) diff --git a/tests/nested_for.py b/tests/nested_for.py index 839becc..fc67eea 100644 --- a/tests/nested_for.py +++ b/tests/nested_for.py @@ -1,45 +1,45 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2016-03-26 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/nested_for_tpl.docx') +tpl = DocxTemplate("templates/nested_for_tpl.docx") context = { - 'dishes': [ - {'name': 'Pizza', 'ingredients': ['bread', 'tomato', 'ham', 'cheese']}, + "dishes": [ + {"name": "Pizza", "ingredients": ["bread", "tomato", "ham", "cheese"]}, { - 'name': 'Hamburger', - 'ingredients': ['bread', 'chopped steak', 'cheese', 'sauce'], + "name": "Hamburger", + "ingredients": ["bread", "chopped steak", "cheese", "sauce"], }, { - 'name': 'Apple pie', - 'ingredients': ['flour', 'apples', 'suggar', 'quince jelly'], + "name": "Apple pie", + "ingredients": ["flour", "apples", "suggar", "quince jelly"], }, ], - 'authors': [ + "authors": [ { - 'name': 'Saint-Exupery', - 'books': [ - {'title': 'Le petit prince'}, - {'title': "L'aviateur"}, - {'title': 'Vol de nuit'}, + "name": "Saint-Exupery", + "books": [ + {"title": "Le petit prince"}, + {"title": "L'aviateur"}, + {"title": "Vol de nuit"}, ], }, { - 'name': 'Barjavel', - 'books': [ - {'title': 'Ravage'}, - {'title': "La nuit des temps"}, - {'title': 'Le grand secret'}, + "name": "Barjavel", + "books": [ + {"title": "Ravage"}, + {"title": "La nuit des temps"}, + {"title": "Le grand secret"}, ], }, ], } tpl.render(context) -tpl.save('output/nested_for.docx') +tpl.save("output/nested_for.docx") diff --git a/tests/order.py b/tests/order.py index a4f1f57..416da89 100644 --- a/tests/order.py +++ b/tests/order.py @@ -1,26 +1,26 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2015-03-12 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/order_tpl.docx') +tpl = DocxTemplate("templates/order_tpl.docx") context = { - 'customer_name': 'Eric', - 'items': [ - {'desc': 'Python interpreters', 'qty': 2, 'price': 'FREE'}, - {'desc': 'Django projects', 'qty': 5403, 'price': 'FREE'}, - {'desc': 'Guido', 'qty': 1, 'price': '100,000,000.00'}, + "customer_name": "Eric", + "items": [ + {"desc": "Python interpreters", "qty": 2, "price": "FREE"}, + {"desc": "Django projects", "qty": 5403, "price": "FREE"}, + {"desc": "Guido", "qty": 1, "price": "100,000,000.00"}, ], - 'in_europe': True, - 'is_paid': False, - 'company_name': 'The World Wide company', - 'total_price': '100,000,000.00', + "in_europe": True, + "is_paid": False, + "company_name": "The World Wide company", + "total_price": "100,000,000.00", } tpl.render(context) -tpl.save('output/order.docx') +tpl.save("output/order.docx") diff --git a/tests/preserve_spaces.py b/tests/preserve_spaces.py index 8ff9e82..03d9af0 100644 --- a/tests/preserve_spaces.py +++ b/tests/preserve_spaces.py @@ -3,12 +3,12 @@ # With old docxtpl version, "... for spicy ..." was replaced by "... forspicy..." # This test is for checking that is some cases the spaces are not lost anymore -tpl = DocxTemplate('templates/preserve_spaces_tpl.docx') +tpl = DocxTemplate("templates/preserve_spaces_tpl.docx") -tags = ['tag_1', 'tag_2'] -replacement = ['looking', 'too'] +tags = ["tag_1", "tag_2"] +replacement = ["looking", "too"] context = dict(zip(tags, replacement)) tpl.render(context) -tpl.save('output/preserve_spaces.docx') +tpl.save("output/preserve_spaces.docx") diff --git a/tests/replace_picture.py b/tests/replace_picture.py index 45ccd7d..c30f2ce 100644 --- a/tests/replace_picture.py +++ b/tests/replace_picture.py @@ -1,18 +1,18 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2017-09-03 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate -DEST_FILE = 'output/replace_picture.docx' +DEST_FILE = "output/replace_picture.docx" -tpl = DocxTemplate('templates/replace_picture_tpl.docx') +tpl = DocxTemplate("templates/replace_picture_tpl.docx") context = {} -tpl.replace_pic('python_logo.png', 'templates/python.png') +tpl.replace_pic("python_logo.png", "templates/python.png") tpl.render(context) tpl.save(DEST_FILE) diff --git a/tests/richtext.py b/tests/richtext.py index 7d40ae5..c836ecf 100644 --- a/tests/richtext.py +++ b/tests/richtext.py @@ -1,55 +1,64 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2015-03-26 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate, RichText -tpl = DocxTemplate('templates/richtext_tpl.docx') +tpl = DocxTemplate("templates/richtext_tpl.docx") rt = RichText() -rt.add('a rich text', style='myrichtextstyle') -rt.add(' with ') -rt.add('some italic', italic=True) -rt.add(' and ') -rt.add('some violet', color='#ff00ff') -rt.add(' and ') -rt.add('some striked', strike=True) -rt.add(' and ') -rt.add('some Highlighted', highlight='#ffff00') -rt.add(' and ') -rt.add('some small', size=14) -rt.add(' or ') -rt.add('big', size=60) -rt.add(' text.') -rt.add('\nYou can add an hyperlink, here to ') -rt.add('google', url_id=tpl.build_url_id('http://google.com')) -rt.add('\nEt voilà ! ') -rt.add('\n1st line') -rt.add('\n2nd line') -rt.add('\n3rd line') -rt.add('\aA new paragraph : \a') -rt.add('--- A page break here (see next page) ---\f') - -for ul in ['single', 'double', 'thick', 'dotted', 'dash', 'dotDash', 'dotDotDash', 'wave']: - rt.add('\nUnderline : ' + ul + ' \n', underline=ul) -rt.add('\nFonts :\n', underline=True) -rt.add('Arial\n', font='Arial') -rt.add('Courier New\n', font='Courier New') -rt.add('Times New Roman\n', font='Times New Roman') -rt.add('\n\nHere some') -rt.add('superscript', superscript=True) -rt.add(' and some') -rt.add('subscript', subscript=True) - -rt_embedded = RichText('an example of ') +rt.add("a rich text", style="myrichtextstyle") +rt.add(" with ") +rt.add("some italic", italic=True) +rt.add(" and ") +rt.add("some violet", color="#ff00ff") +rt.add(" and ") +rt.add("some striked", strike=True) +rt.add(" and ") +rt.add("some Highlighted", highlight="#ffff00") +rt.add(" and ") +rt.add("some small", size=14) +rt.add(" or ") +rt.add("big", size=60) +rt.add(" text.") +rt.add("\nYou can add an hyperlink, here to ") +rt.add("google", url_id=tpl.build_url_id("http://google.com")) +rt.add("\nEt voilà ! ") +rt.add("\n1st line") +rt.add("\n2nd line") +rt.add("\n3rd line") +rt.add("\aA new paragraph : \a") +rt.add("--- A page break here (see next page) ---\f") + +for ul in [ + "single", + "double", + "thick", + "dotted", + "dash", + "dotDash", + "dotDotDash", + "wave", +]: + rt.add("\nUnderline : " + ul + " \n", underline=ul) +rt.add("\nFonts :\n", underline=True) +rt.add("Arial\n", font="Arial") +rt.add("Courier New\n", font="Courier New") +rt.add("Times New Roman\n", font="Times New Roman") +rt.add("\n\nHere some") +rt.add("superscript", superscript=True) +rt.add(" and some") +rt.add("subscript", subscript=True) + +rt_embedded = RichText("an example of ") rt_embedded.add(rt) context = { - 'example': rt_embedded, + "example": rt_embedded, } tpl.render(context) -tpl.save('output/richtext.docx') +tpl.save("output/richtext.docx") diff --git a/tests/richtext_and_if.py b/tests/richtext_and_if.py index 34ed64d..031eb62 100644 --- a/tests/richtext_and_if.py +++ b/tests/richtext_and_if.py @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2015-03-26 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate, RichText -tpl = DocxTemplate('templates/richtext_and_if_tpl.docx') +tpl = DocxTemplate("templates/richtext_and_if_tpl.docx") -context = {'foobar': RichText('Foobar!', color='ff0000')} +context = {"foobar": RichText("Foobar!", color="ff0000")} tpl.render(context) -tpl.save('output/richtext_and_if.docx') +tpl.save("output/richtext_and_if.docx") diff --git a/tests/richtext_eastAsia.py b/tests/richtext_eastAsia.py index 1dd2a4f..23177bc 100644 --- a/tests/richtext_eastAsia.py +++ b/tests/richtext_eastAsia.py @@ -6,15 +6,16 @@ from docxtpl import DocxTemplate, RichText -tpl = DocxTemplate('templates/richtext_eastAsia_tpl.docx') -rt = RichText('测试TEST', font='eastAsia:Microsoft YaHei') -ch = RichText('测试TEST', font='eastAsia:微软雅黑') -sun = RichText('测试TEST', font='eastAsia:SimSun') + +tpl = DocxTemplate("templates/richtext_eastAsia_tpl.docx") +rt = RichText("测试TEST", font="eastAsia:Microsoft YaHei") +ch = RichText("测试TEST", font="eastAsia:微软雅黑") +sun = RichText("测试TEST", font="eastAsia:SimSun") context = { - 'example': rt, - 'Chinese': ch, - 'simsun': sun, + "example": rt, + "Chinese": ch, + "simsun": sun, } tpl.render(context) -tpl.save('output/richtext_eastAsia.docx') +tpl.save("output/richtext_eastAsia.docx") diff --git a/tests/runtests.py b/tests/runtests.py index c956864..083ae0c 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -3,16 +3,16 @@ import six import os -tests = sorted(glob.glob('[A-Za-z]*.py')) -excludes = ['runtests.py'] +tests = sorted(glob.glob("[A-Za-z]*.py")) +excludes = ["runtests.py"] -output_dir = os.path.join(os.path.dirname(__file__), 'output') +output_dir = os.path.join(os.path.dirname(__file__), "output") if not os.path.exists(output_dir): os.mkdir(output_dir) for test in tests: if test not in excludes: - six.print_('%s ...' % test) - subprocess.call(['python', './%s' % test]) + six.print_("%s ..." % test) + subprocess.call(["python", "./%s" % test]) -six.print_('Done.') +six.print_("Done.") diff --git a/tests/subdoc.py b/tests/subdoc.py index b118e4b..10f5abd 100644 --- a/tests/subdoc.py +++ b/tests/subdoc.py @@ -1,36 +1,36 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2015-03-12 @author: Eric Lapouyade -''' +""" from docxtpl import DocxTemplate from docx.shared import Inches -tpl = DocxTemplate('templates/subdoc_tpl.docx') +tpl = DocxTemplate("templates/subdoc_tpl.docx") sd = tpl.new_subdoc() -p = sd.add_paragraph('This is a sub-document inserted into a bigger one') -p = sd.add_paragraph('It has been ') -p.add_run('dynamically').style = 'dynamic' -p.add_run(' generated with python by using ') -p.add_run('python-docx').italic = True -p.add_run(' library') +p = sd.add_paragraph("This is a sub-document inserted into a bigger one") +p = sd.add_paragraph("It has been ") +p.add_run("dynamically").style = "dynamic" +p.add_run(" generated with python by using ") +p.add_run("python-docx").italic = True +p.add_run(" library") -sd.add_heading('Heading, level 1', level=1) -sd.add_paragraph('This is an Intense quote', style='IntenseQuote') +sd.add_heading("Heading, level 1", level=1) +sd.add_paragraph("This is an Intense quote", style="IntenseQuote") -sd.add_paragraph('A picture :') -sd.add_picture('templates/python_logo.png', width=Inches(1.25)) +sd.add_paragraph("A picture :") +sd.add_picture("templates/python_logo.png", width=Inches(1.25)) -sd.add_paragraph('A Table :') +sd.add_paragraph("A Table :") table = sd.add_table(rows=1, cols=3) hdr_cells = table.rows[0].cells -hdr_cells[0].text = 'Qty' -hdr_cells[1].text = 'Id' -hdr_cells[2].text = 'Desc' -recordset = ((1, 101, 'Spam'), (2, 42, 'Eggs'), (3, 631, 'Spam,spam, eggs, and ham')) +hdr_cells[0].text = "Qty" +hdr_cells[1].text = "Id" +hdr_cells[2].text = "Desc" +recordset = ((1, 101, "Spam"), (2, 42, "Eggs"), (3, 631, "Spam,spam, eggs, and ham")) for item in recordset: row_cells = table.add_row().cells row_cells[0].text = str(item[0]) @@ -38,8 +38,8 @@ row_cells[2].text = item[2] context = { - 'mysubdoc': sd, + "mysubdoc": sd, } tpl.render(context) -tpl.save('output/subdoc.docx') +tpl.save("output/subdoc.docx") diff --git a/tests/template_error.py b/tests/template_error.py index 2938fdc..4a7d909 100644 --- a/tests/template_error.py +++ b/tests/template_error.py @@ -2,19 +2,19 @@ from jinja2.exceptions import TemplateError import six -six.print_('=' * 80) +six.print_("=" * 80) six.print_("Generating template error for testing (so it is safe to ignore) :") -six.print_('.' * 80) +six.print_("." * 80) try: - tpl = DocxTemplate('templates/template_error_tpl.docx') - tpl.render({'test_variable': 'test variable value'}) + tpl = DocxTemplate("templates/template_error_tpl.docx") + tpl.render({"test_variable": "test variable value"}) except TemplateError as the_error: six.print_(six.text_type(the_error)) - if hasattr(the_error, 'docx_context'): + if hasattr(the_error, "docx_context"): six.print_("Context:") for line in the_error.docx_context: six.print_(line) -tpl.save('output/template_error.docx') -six.print_('.' * 80) +tpl.save("output/template_error.docx") +six.print_("." * 80) six.print_(" End of TemplateError Test ") -six.print_('=' * 80) +six.print_("=" * 80) diff --git a/tests/vertical_merge.py b/tests/vertical_merge.py index 60b6288..c0dc68f 100644 --- a/tests/vertical_merge.py +++ b/tests/vertical_merge.py @@ -1,23 +1,23 @@ # -*- coding: utf-8 -*- -''' +""" Created : 2017-10-15 @author: Arthaslixin -''' +""" from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/vertical_merge_tpl.docx') +tpl = DocxTemplate("templates/vertical_merge_tpl.docx") context = { - 'items': [ - {'desc': 'Python interpreters', 'qty': 2, 'price': 'FREE'}, - {'desc': 'Django projects', 'qty': 5403, 'price': 'FREE'}, - {'desc': 'Guido', 'qty': 1, 'price': '100,000,000.00'}, + "items": [ + {"desc": "Python interpreters", "qty": 2, "price": "FREE"}, + {"desc": "Django projects", "qty": 5403, "price": "FREE"}, + {"desc": "Guido", "qty": 1, "price": "100,000,000.00"}, ], - 'total_price': '100,000,000.00', - 'category': 'Book', + "total_price": "100,000,000.00", + "category": "Book", } tpl.render(context) -tpl.save('output/vertical_merge.docx') +tpl.save("output/vertical_merge.docx") diff --git a/tests/vertical_merge_nested.py b/tests/vertical_merge_nested.py index 3ae7bcf..bcd912a 100644 --- a/tests/vertical_merge_nested.py +++ b/tests/vertical_merge_nested.py @@ -1,5 +1,5 @@ from docxtpl import DocxTemplate -tpl = DocxTemplate('templates/vertical_merge_nested_tpl.docx') +tpl = DocxTemplate("templates/vertical_merge_nested_tpl.docx") tpl.render({}) -tpl.save('output/vertical_merge_nested.docx') +tpl.save("output/vertical_merge_nested.docx") diff --git a/tests/word2016.py b/tests/word2016.py index eb2f77d..81f2333 100644 --- a/tests/word2016.py +++ b/tests/word2016.py @@ -1,12 +1,12 @@ from docxtpl import DocxTemplate, RichText -tpl = DocxTemplate('templates/word2016_tpl.docx') +tpl = DocxTemplate("templates/word2016_tpl.docx") tpl.render( { - 'test_space': ' ', - 'test_tabs': 5 * '\t', - 'test_space_r': RichText(' '), - 'test_tabs_r': RichText(5 * '\t'), + "test_space": " ", + "test_tabs": 5 * "\t", + "test_space_r": RichText(" "), + "test_tabs_r": RichText(5 * "\t"), } ) -tpl.save('output/word2016.docx') +tpl.save("output/word2016.docx") From ac38610947d9da57019d1847e6569d758d378ca4 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Sun, 21 Jul 2024 16:17:47 +0200 Subject: [PATCH 11/64] Code styling --- docxtpl/template.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index 98d66ec..e6a895c 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -311,8 +311,9 @@ def render_xml_part(self, src_xml, part, context, jinja_env=None): line_number = max(exc.lineno - 4, 0) exc.docx_context = map( lambda x: re.sub(r"<[^>]+>", "", x), - src_xml.splitlines()[line_number : (line_number + 7)], + src_xml.splitlines()[line_number:(line_number + 7)], ) + raise exc dst_xml = re.sub(r"\n])", r" Date: Sun, 21 Jul 2024 16:42:41 +0200 Subject: [PATCH 12/64] Remove python 2.x support --- docxtpl/__init__.py | 2 +- docxtpl/listing.py | 6 ++---- docxtpl/richtext.py | 8 +++----- docxtpl/template.py | 5 ++--- poetry.lock | 2 +- pyproject.toml | 1 - setup.py | 12 +++++++----- tests/escape_auto.py | 6 ++---- tests/runtests.py | 5 ++--- tests/template_error.py | 19 +++++++++---------- 10 files changed, 29 insertions(+), 37 deletions(-) diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index b2d6d3a..c5d79cf 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,7 +4,7 @@ @author: Eric Lapouyade """ -__version__ = "0.17.0" +__version__ = "0.18.0" # flake8: noqa from .inline_image import InlineImage diff --git a/docxtpl/listing.py b/docxtpl/listing.py index afe637e..62cde54 100644 --- a/docxtpl/listing.py +++ b/docxtpl/listing.py @@ -4,8 +4,6 @@ @author: Eric Lapouyade """ -import six - try: from html import escape except ImportError: @@ -23,8 +21,8 @@ class Listing(object): def __init__(self, text): # If not a string : cast to string (ex: int, dict etc...) - if not isinstance(text, (six.text_type, six.binary_type)): - text = six.text_type(text) + if not isinstance(text, (str, bytes)): + text = str(text) self.xml = escape(text) def __unicode__(self): diff --git a/docxtpl/richtext.py b/docxtpl/richtext.py index 453ce2a..75c3b1c 100644 --- a/docxtpl/richtext.py +++ b/docxtpl/richtext.py @@ -4,8 +4,6 @@ @author: Eric Lapouyade """ -import six - try: from html import escape except ImportError: @@ -48,9 +46,9 @@ def add( return # If not a string : cast to string (ex: int, dict etc...) - if not isinstance(text, (six.text_type, six.binary_type)): - text = six.text_type(text) - if not isinstance(text, six.text_type): + if not isinstance(text, (str, bytes)): + text = str(text) + if not isinstance(text, str): text = text.decode("utf-8", errors="ignore") text = escape(text) diff --git a/docxtpl/template.py b/docxtpl/template.py index e6a895c..d6d28ec 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -25,7 +25,6 @@ # cgi.escape is deprecated in python 3.7 from cgi import escape # noqa: F401 import re -import six import binascii import os import zipfile @@ -771,7 +770,7 @@ def _replace_pics(self): self._replace_docx_part_pics(part, replaced_pics) # Header/Footer - for relid, rel in six.iteritems(part.rels): + for relid, rel in part.rels.items(): if rel.reltype in (REL_TYPE.HEADER, REL_TYPE.FOOTER): self._replace_docx_part_pics(rel.target_part, replaced_pics) @@ -832,7 +831,7 @@ def _replace_docx_part_pics(self, doc_part, replaced_pics): ) # replace data - for img_id, img_data in six.iteritems(self.pics_to_replace): + for img_id, img_data in self.pics_to_replace.items(): if img_id == filename or img_id == title or img_id == description: part_map[filename][1]._blob = img_data replaced_pics[img_id] = True diff --git a/poetry.lock b/poetry.lock index 7cb1d13..999d53b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -502,4 +502,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "43818448bde523eafcedcdaeb6541d8205a5d52eef5cb4d0e1a0563a7134a579" +content-hash = "77f21c2a463fb31b565180c907e29738afd2f0df60e6418ef73f05bec0a4f015" diff --git a/pyproject.toml b/pyproject.toml index cf402f4..e64cb65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,6 @@ readme = "README.rst" [tool.poetry.dependencies] python = "^3.11" -six = "^1.16.0" python-docx = "^1.1.2" docxcompose = "^1.4.0" jinja2 = "^3.1.4" diff --git a/setup.py b/setup.py index 2eae6c5..bd889ae 100644 --- a/setup.py +++ b/setup.py @@ -50,18 +50,20 @@ def get_version(pkg): classifiers=[ "Intended Audience :: Developers", "Development Status :: 4 - Beta", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.4", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", ], keywords='jinja2', url='https://github.com/elapouya/python-docx-template', author='Eric Lapouyade', license='LGPL 2.1', packages=['docxtpl'], - install_requires=['six', - 'python-docx>=1.1.1', + install_requires=['python-docx>=1.1.1', 'docxcompose', 'jinja2', 'lxml'], diff --git a/tests/escape_auto.py b/tests/escape_auto.py index bd4d676..70e8195 100644 --- a/tests/escape_auto.py +++ b/tests/escape_auto.py @@ -5,8 +5,6 @@ import os from unicodedata import name -from six import iteritems, text_type - from docxtpl import DocxTemplate @@ -15,10 +13,10 @@ tpl = DocxTemplate("templates/escape_tpl_auto.docx") context = { - "nested_dict": {name(text_type(c)): c for c in XML_RESERVED}, + "nested_dict": {name(str(c)): c for c in XML_RESERVED}, "autoescape": 'Escaped "str & ing"!', "autoescape_unicode": "This is an escaped example \u4f60 & \u6211", - "iteritems": iteritems, + "iteritems": lambda x: x.items(), } tpl.render(context, autoescape=True) diff --git a/tests/runtests.py b/tests/runtests.py index 083ae0c..b0a3bf3 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -1,6 +1,5 @@ import subprocess import glob -import six import os tests = sorted(glob.glob("[A-Za-z]*.py")) @@ -12,7 +11,7 @@ for test in tests: if test not in excludes: - six.print_("%s ..." % test) + print("%s ..." % test) subprocess.call(["python", "./%s" % test]) -six.print_("Done.") +print("Done.") diff --git a/tests/template_error.py b/tests/template_error.py index 4a7d909..66c6428 100644 --- a/tests/template_error.py +++ b/tests/template_error.py @@ -1,20 +1,19 @@ from docxtpl import DocxTemplate from jinja2.exceptions import TemplateError -import six -six.print_("=" * 80) -six.print_("Generating template error for testing (so it is safe to ignore) :") -six.print_("." * 80) +print("=" * 80) +print("Generating template error for testing (so it is safe to ignore) :") +print("." * 80) try: tpl = DocxTemplate("templates/template_error_tpl.docx") tpl.render({"test_variable": "test variable value"}) except TemplateError as the_error: - six.print_(six.text_type(the_error)) + print(str(the_error)) if hasattr(the_error, "docx_context"): - six.print_("Context:") + print("Context:") for line in the_error.docx_context: - six.print_(line) + print(line) tpl.save("output/template_error.docx") -six.print_("." * 80) -six.print_(" End of TemplateError Test ") -six.print_("=" * 80) +print("." * 80) +print(" End of TemplateError Test ") +print("=" * 80) From b9be3a5b503f1f30dbe1b83845163998f1e86afd Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Sun, 21 Jul 2024 16:48:36 +0200 Subject: [PATCH 13/64] Update CHANGES.rst --- CHANGES.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index e6b5686..5cc87de 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,11 @@ +0.18.0 (2024-07-21) +------------------- +- IMPORTANT : Remove Python 2.x support +- Add hyperlink option in InlineImage (thanks to Jean Marcos da Rosa) +- Update index.rst (Thanks to jkpet) +- Add poetry env +- Black all files + 0.17.0 (2024-05-01) ------------------- - Add support to python-docx 1.1.1 From d99607003c1d1f4d0a7c24059904645fff787762 Mon Sep 17 00:00:00 2001 From: Alexandre Detiste Date: Tue, 30 Jul 2024 23:12:40 +0200 Subject: [PATCH 14/64] remove leftover "six" reference --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1588ab2..f2bbd16 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ -six python-docx docxcompose jinja2 From 0061b556ec3b3a3346ef2edd4f3a84efa642c74f Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Tue, 17 Sep 2024 15:09:29 +0200 Subject: [PATCH 15/64] [WIP] Support rendering variables in footnotes --- docxtpl/template.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docxtpl/template.py b/docxtpl/template.py index d6d28ec..b421e64 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -350,6 +350,23 @@ def render_properties( template = jinja_env.from_string(initial) rendered = template.render(context) setattr(self.docx.core_properties, prop, rendered) + + def render_footnotes( + self, context: Dict[str, Any], jinja_env: Optional[Environment] = None + ) -> None: + if jinja_env is None: + jinja_env = Environment() + + for k, v in self.docx.sections[0].part.related_parts.items(): + if v.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': + import xml.etree.ElementTree as ET + tree = ET.fromstring(v.blob) + for footnote in tree.findall('.//w:t', docx.oxml.ns.nsmap): + if hasattr(footnote, 'text'): + footnote.text = jinja_env.from_string(footnote.text).render(context) + for part in self.docx.sections[0].part.related_parts[k].package.parts: + if part.partname == v.partname: + part._blob = ET.tostring(tree, encoding='unicode').encode('utf8') def resolve_listing(self, xml): @@ -483,6 +500,8 @@ def render( self.render_properties(context, jinja_env) + self.render_footnotes(context, jinja_env) + # set rendered flag self.is_rendered = True From 2886a851e03d319935477dc5f7bf4040a807d332 Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Tue, 17 Sep 2024 21:07:21 +0200 Subject: [PATCH 16/64] Change the XML library to lxml to avoid namespace renaming and other XML problems --- docxtpl/template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index b421e64..20bfb4d 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -359,7 +359,7 @@ def render_footnotes( for k, v in self.docx.sections[0].part.related_parts.items(): if v.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': - import xml.etree.ElementTree as ET + from lxml import etree as ET tree = ET.fromstring(v.blob) for footnote in tree.findall('.//w:t', docx.oxml.ns.nsmap): if hasattr(footnote, 'text'): From 2812487300baf7aa37cd5641420c04d4c5b94b05 Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Tue, 17 Sep 2024 21:19:19 +0200 Subject: [PATCH 17/64] Simplify the code --- docxtpl/template.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index 20bfb4d..29e1b08 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -357,16 +357,13 @@ def render_footnotes( if jinja_env is None: jinja_env = Environment() - for k, v in self.docx.sections[0].part.related_parts.items(): - if v.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': - from lxml import etree as ET - tree = ET.fromstring(v.blob) + for part in self.docx.sections[0].part.package.parts: + if part.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': + tree = etree.fromstring(part.blob) for footnote in tree.findall('.//w:t', docx.oxml.ns.nsmap): if hasattr(footnote, 'text'): footnote.text = jinja_env.from_string(footnote.text).render(context) - for part in self.docx.sections[0].part.related_parts[k].package.parts: - if part.partname == v.partname: - part._blob = ET.tostring(tree, encoding='unicode').encode('utf8') + part._blob = etree.tostring(tree) def resolve_listing(self, xml): From a449f01f3674e25e33ed7b34d160fb90102bcc3b Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Wed, 18 Sep 2024 07:35:12 +0000 Subject: [PATCH 18/64] Fix flake8 --- docxtpl/template.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index 29e1b08..6babb73 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -350,10 +350,10 @@ def render_properties( template = jinja_env.from_string(initial) rendered = template.render(context) setattr(self.docx.core_properties, prop, rendered) - + def render_footnotes( self, context: Dict[str, Any], jinja_env: Optional[Environment] = None - ) -> None: + ) -> None: if jinja_env is None: jinja_env = Environment() From 1cca257016c97fa1be4f6aa888d8ed44b2eca073 Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Mon, 23 Sep 2024 06:24:41 +0000 Subject: [PATCH 19/64] Add a test and use existing XML patching method --- docxtpl/template.py | 13 ++++++------- tests/footnotes.py | 19 +++++++++++++++++++ tests/templates/footnotes_tpl.docx | Bin 0 -> 15991 bytes 3 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 tests/footnotes.py create mode 100644 tests/templates/footnotes_tpl.docx diff --git a/docxtpl/template.py b/docxtpl/template.py index 6babb73..a37dd71 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -357,13 +357,12 @@ def render_footnotes( if jinja_env is None: jinja_env = Environment() - for part in self.docx.sections[0].part.package.parts: - if part.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': - tree = etree.fromstring(part.blob) - for footnote in tree.findall('.//w:t', docx.oxml.ns.nsmap): - if hasattr(footnote, 'text'): - footnote.text = jinja_env.from_string(footnote.text).render(context) - part._blob = etree.tostring(tree) + for section in self.docx.sections: + for part in section.part.package.parts: + if part.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': + xml = self.patch_xml(part.blob.decode('utf8')) + xml = self.render_xml_part(xml, part, context, jinja_env) + part._blob = xml def resolve_listing(self, xml): diff --git a/tests/footnotes.py b/tests/footnotes.py new file mode 100644 index 0000000..f80e1c6 --- /dev/null +++ b/tests/footnotes.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +""" +Created : 2024-09-23 + +@author: Bart Broere +""" + +from docxtpl import DocxTemplate + +DEST_FILE = "output/footnotes.docx" + +tpl = DocxTemplate("templates/footnotes_tpl.docx") + +context = { + "a_jinja_variable": "A Jinja variable!" +} + +tpl.render(context) +tpl.save(DEST_FILE) \ No newline at end of file diff --git a/tests/templates/footnotes_tpl.docx b/tests/templates/footnotes_tpl.docx new file mode 100644 index 0000000000000000000000000000000000000000..838c002f89cb40a43fc4bdee18638f5b88c4132e GIT binary patch literal 15991 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 literal 0 HcmV?d00001 From 9124386b4cc4cb9e88301dc6412945f32c4fc48e Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Mon, 23 Sep 2024 06:25:22 +0000 Subject: [PATCH 20/64] Fix flake8 --- tests/footnotes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/footnotes.py b/tests/footnotes.py index f80e1c6..c6ec59c 100644 --- a/tests/footnotes.py +++ b/tests/footnotes.py @@ -16,4 +16,4 @@ } tpl.render(context) -tpl.save(DEST_FILE) \ No newline at end of file +tpl.save(DEST_FILE) From 0d616add8454db28e178459a2904e03a98ef1dc0 Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Thu, 24 Oct 2024 07:27:59 +0200 Subject: [PATCH 21/64] Apply suggestion since part.blob changes type in the loop Co-authored-by: Chatnoir Miki --- docxtpl/template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index a37dd71..d37911f 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -360,7 +360,7 @@ def render_footnotes( for section in self.docx.sections: for part in section.part.package.parts: if part.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': - xml = self.patch_xml(part.blob.decode('utf8')) + xml = self.patch_xml(part.blob.decode('utf-8') if type(part.blob) is bytes else part.blob) xml = self.render_xml_part(xml, part, context, jinja_env) part._blob = xml From 0ef74a740ef9378c3bc0b8a0b5d19720262fb411 Mon Sep 17 00:00:00 2001 From: Bart Broere Date: Thu, 24 Oct 2024 07:28:49 +0200 Subject: [PATCH 22/64] Change to isinstance for type checking --- docxtpl/template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index d37911f..2a442fa 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -360,7 +360,7 @@ def render_footnotes( for section in self.docx.sections: for part in section.part.package.parts: if part.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': - xml = self.patch_xml(part.blob.decode('utf-8') if type(part.blob) is bytes else part.blob) + xml = self.patch_xml(part.blob.decode('utf-8') if isinstance(part.blob, bytes) else part.blob) xml = self.render_xml_part(xml, part, context, jinja_env) part._blob = xml From 0f42e5a4c8191185c05e07a908d682bf6566d11d Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 12 Nov 2024 14:27:06 +0100 Subject: [PATCH 23/64] v0.19.0 --- CHANGES.rst | 6 +++++- docxtpl/__init__.py | 2 +- docxtpl/template.py | 18 +++++++++++++----- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 5cc87de..823059f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,7 +1,11 @@ +0.19.0 (2024-11-12) +------------------- +- Support rendering variables in footnotes (Thanks to Bart Broere) + 0.18.0 (2024-07-21) ------------------- - IMPORTANT : Remove Python 2.x support -- Add hyperlink option in InlineImage (thanks to Jean Marcos da Rosa) +- Add hyperlink option in InlineImage (Thanks to Jean Marcos da Rosa) - Update index.rst (Thanks to jkpet) - Add poetry env - Black all files diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index c5d79cf..e0f7f50 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,7 +4,7 @@ @author: Eric Lapouyade """ -__version__ = "0.18.0" +__version__ = "0.19.0" # flake8: noqa from .inline_image import InlineImage diff --git a/docxtpl/template.py b/docxtpl/template.py index 2a442fa..d9ab3ff 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -210,7 +210,8 @@ def v_merge(m1): return re.sub( r"(].*?)(.*?)(?:{%\s*vm\s*%})(.*?)()", v_merge, - m.group(), # Everything between ```` and ```` with ``{% vm %}`` inside. + m.group(), + # Everything between ```` and ```` with ``{% vm %}`` inside. flags=re.DOTALL, ) @@ -310,7 +311,7 @@ def render_xml_part(self, src_xml, part, context, jinja_env=None): line_number = max(exc.lineno - 4, 0) exc.docx_context = map( lambda x: re.sub(r"<[^>]+>", "", x), - src_xml.splitlines()[line_number:(line_number + 7)], + src_xml.splitlines()[line_number : (line_number + 7)], ) raise exc @@ -352,15 +353,22 @@ def render_properties( setattr(self.docx.core_properties, prop, rendered) def render_footnotes( - self, context: Dict[str, Any], jinja_env: Optional[Environment] = None + self, context: Dict[str, Any], jinja_env: Optional[Environment] = None ) -> None: if jinja_env is None: jinja_env = Environment() for section in self.docx.sections: for part in section.part.package.parts: - if part.content_type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml': - xml = self.patch_xml(part.blob.decode('utf-8') if isinstance(part.blob, bytes) else part.blob) + if part.content_type == ( + "application/vnd.openxmlformats-officedocument" + ".wordprocessingml.footnotes+xml" + ): + xml = self.patch_xml( + part.blob.decode("utf-8") + if isinstance(part.blob, bytes) + else part.blob + ) xml = self.render_xml_part(xml, part, context, jinja_env) part._blob = xml From 65e00b189e4b5e93659366ed68039aa116162f38 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 12 Nov 2024 14:31:55 +0100 Subject: [PATCH 24/64] Flake8 : whitespace fix --- docxtpl/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index e0f7f50..1c0e1df 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,7 +4,7 @@ @author: Eric Lapouyade """ -__version__ = "0.19.0" +__version__ = "0.19.1" # flake8: noqa from .inline_image import InlineImage From 60caff83fa7087c658ff8f99976de22382da37a9 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 12 Nov 2024 14:37:12 +0100 Subject: [PATCH 25/64] Flake8 : whitespace fix --- docxtpl/template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index d9ab3ff..0b81868 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -311,7 +311,7 @@ def render_xml_part(self, src_xml, part, context, jinja_env=None): line_number = max(exc.lineno - 4, 0) exc.docx_context = map( lambda x: re.sub(r"<[^>]+>", "", x), - src_xml.splitlines()[line_number : (line_number + 7)], + src_xml.splitlines()[line_number: (line_number + 7)], # fmt: skip ) raise exc From eed645c0c500d0919ecdf9d1753615e8345ac39b Mon Sep 17 00:00:00 2001 From: Jonathan Pyle Date: Fri, 29 Nov 2024 15:23:46 -0500 Subject: [PATCH 26/64] encode XML as bytes in render_footnotes() `part._blob` should have the class `bytes`. --- docxtpl/template.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index 0b81868..b246ca7 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -370,7 +370,7 @@ def render_footnotes( else part.blob ) xml = self.render_xml_part(xml, part, context, jinja_env) - part._blob = xml + part._blob = xml.encode("utf-8") def resolve_listing(self, xml): From b97fa32f107db3e057e8a1647e5839bdcedfdb7d Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Sun, 29 Dec 2024 18:53:25 +0100 Subject: [PATCH 27/64] v0.19.1 --- CHANGES.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 823059f..81783d2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,7 @@ +0.19.1 (2024-12-29) +------------------- +- PR #575 : fix unicode in footnotes (Thanks to Jonathan Pyle) + 0.19.0 (2024-11-12) ------------------- - Support rendering variables in footnotes (Thanks to Bart Broere) From aa7b7a77e3791eaf2a22ed7597f2cee415b6ac5d Mon Sep 17 00:00:00 2001 From: ST-Imrie <117174577+ST-Imrie@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:53:26 +0000 Subject: [PATCH 28/64] Rich Text Paragraph Formatting Update --- docxtpl/__init__.py | 2 +- docxtpl/richtext.py | 45 ++++++++++++++++++++ docxtpl/template.py | 16 ++++++- tests/richtextparagraph.py | 32 ++++++++++++++ tests/templates/richtext_paragraph_tpl.docx | Bin 0 -> 18357 bytes tests/templates/richtext_tpl.docx | Bin 11440 -> 14126 bytes 6 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 tests/richtextparagraph.py create mode 100644 tests/templates/richtext_paragraph_tpl.docx diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 1c0e1df..0ec37f1 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -9,6 +9,6 @@ # flake8: noqa from .inline_image import InlineImage from .listing import Listing -from .richtext import RichText, R +from .richtext import RichText, R, RichTextParagraph, RP from .subdoc import Subdoc from .template import DocxTemplate diff --git a/docxtpl/richtext.py b/docxtpl/richtext.py index 75c3b1c..759eed0 100644 --- a/docxtpl/richtext.py +++ b/docxtpl/richtext.py @@ -119,5 +119,50 @@ def __str__(self): def __html__(self): return self.xml +class RichTextParagraph(object): + """class to generate Rich Text Paragraphs when using templates variables + + This is much faster than using Subdoc class, + but this only for texts OUTSIDE an existing paragraph. + """ + + def __init__(self, text=None, **text_prop): + self.xml = "" + if text: + self.add(text, **text_prop) + + def add( + self, + text, + parastyle=None, + ): + + # If a RichText is added + if not isinstance(text, RichText): + text = RichText(text) + + prop = "" + if parastyle: + prop += '' % parastyle + + xml = "" + if prop: + xml += "%s" % prop + xml += text.xml + xml += "" + self.xml += xml + + def __unicode__(self): + return self.xml + + def __str__(self): + return self.xml + + def __html__(self): + return self.xml + + + R = RichText +RP = RichTextParagraph diff --git a/docxtpl/template.py b/docxtpl/template.py index b246ca7..e9c9cc4 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -160,7 +160,7 @@ def cellbg(m): flags=re.DOTALL, ) src_xml = re.sub( - r"({{r\s.*?}}|{%r\s.*?%})", + r"({{r.\s.*?}}|{%r.\s.*?%})", r'\1', src_xml, flags=re.DOTALL, @@ -173,7 +173,7 @@ def cellbg(m): r"-%}(?:(?!]|{%|{{).)*?]*?>", "%}", src_xml, flags=re.DOTALL ) - for y in ["tr", "tc", "p", "r"]: + for y in ["tr", "tc", "p"]: # replace into xml code the row/paragraph/run containing # {%y xxx %} or {{y xxx}} template tag # by {% xxx %} or {{ xx }} without any surrounding tags : @@ -183,6 +183,18 @@ def cellbg(m): % {"y": y} ) src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) + + for y in ["p", "r"]: + # replace into xml paragraph or run containing + # {%rp xxx %} or {{rp xxx}} template tag + # by {% xxx %} or {{ xx }} without any surrounding tags + # This allow for inline {rr }} and paragraph {rp }) styling + # This is mandatory to have jinja2 generating correct xml code + pat = ( + r"](?:(?!]).)*({%%|{{)r%(y)s ([^}%%]*(?:%%}|}})).*?" + % {"y": y} + ) + src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) for y in ["tr", "tc", "p"]: # same thing, but for {#y xxx #} (but not where y == 'r', since that diff --git a/tests/richtextparagraph.py b/tests/richtextparagraph.py new file mode 100644 index 0000000..e06bf47 --- /dev/null +++ b/tests/richtextparagraph.py @@ -0,0 +1,32 @@ +""" +Created : 2025-02-28 + +@author: Hannah Imrie +""" + +from docxtpl import DocxTemplate, RichText, RichTextParagraph + +tpl = DocxTemplate("templates/richtext_paragraph_tpl.docx") + +rtp = RichTextParagraph() +rt = RichText() + +rtp.add("The rich text paragraph function allows paragraph styles to be added to text",parastyle="myrichparastyle") + +rtp.add("This allows for the use of") +rtp.add("bullet\apoints.", parastyle="SquareBullet") + +rt.add("This works with ") +rt.add("Rich ", bold=True) +rt.add("Text ", italic=True) +rt.add("Strings", underline="single") +rt.add(" too.") + +rtp.add(rt, parastyle="SquareBullet") + +context = { + "example": rtp, +} + +tpl.render(context) +tpl.save("output/richtext_paragraph.docx") \ No newline at end of file diff --git a/tests/templates/richtext_paragraph_tpl.docx b/tests/templates/richtext_paragraph_tpl.docx new file mode 100644 index 0000000000000000000000000000000000000000..738c5025ba172ecaa1d41abfc64a3c1a2174eb5c GIT binary patch literal 18357 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 literal 11440 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 B4uk*z From 994da90f66f5cda497fce7093ef3afec79397a9e Mon Sep 17 00:00:00 2001 From: rana saab Date: Thu, 3 Apr 2025 13:24:01 +0300 Subject: [PATCH 29/64] fixed rtl italic formatting --- docxtpl/richtext.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docxtpl/richtext.py b/docxtpl/richtext.py index 75c3b1c..4cf9962 100644 --- a/docxtpl/richtext.py +++ b/docxtpl/richtext.py @@ -38,6 +38,8 @@ def add( strike=False, font=None, url_id=None, + rtl=False, + lang=None, ): # If a RichText is added @@ -73,8 +75,12 @@ def add( prop += '' if bold: prop += "" + if rtl: + prop += '' if italic: prop += "" + if rtl: + prop += '' if underline: if underline not in [ "single", @@ -98,7 +104,10 @@ def add( prop += ''.format( font=font, regional_font=regional_font ) - + if rtl: + prop += '' + if lang: + prop += '' % lang xml = "" if prop: xml += "%s" % prop From 97df7862984c2e7e86018ed152d1d700a9fbe9c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20P=C3=A9rechnev?= Date: Fri, 4 Apr 2025 17:38:56 +0300 Subject: [PATCH 30/64] Added possibility to skip missing pictures instead of raising ValueError exception. --- docxtpl/template.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index b246ca7..b4e4378 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -46,6 +46,7 @@ def __init__(self, template_file: Union[IO[bytes], str, PathLike]) -> None: self.docx = None self.is_rendered = False self.is_saved = False + self.allow_missing_pics = False def init_docx(self, reload: bool = True): if not self.docx or (self.is_rendered and reload): @@ -797,10 +798,11 @@ def _replace_pics(self): if rel.reltype in (REL_TYPE.HEADER, REL_TYPE.FOOTER): self._replace_docx_part_pics(rel.target_part, replaced_pics) - # make sure all template images defined by user were replaced - for img_id, replaced in replaced_pics.items(): - if not replaced: - raise ValueError("Picture %s not found in the docx template" % img_id) + if not self.allow_missing_pics: + # make sure all template images defined by user were replaced + for img_id, replaced in replaced_pics.items(): + if not replaced: + raise ValueError("Picture %s not found in the docx template" % img_id) def get_pic_map(self): return self.pic_map From ebc770a2912edb30f57530b956c468510605dd95 Mon Sep 17 00:00:00 2001 From: ST-Imrie <117174577+ST-Imrie@users.noreply.github.com> Date: Thu, 1 May 2025 11:39:48 +0100 Subject: [PATCH 31/64] Updated RichText Jinja tags from rr/rp to r/q and updated test template --- docxtpl/template.py | 26 ++++++++++---------- tests/richtextparagraph.py | 13 +++++++++- tests/templates/richtext_paragraph_tpl.docx | Bin 18357 -> 20437 bytes 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index e9c9cc4..20dc43e 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -160,7 +160,7 @@ def cellbg(m): flags=re.DOTALL, ) src_xml = re.sub( - r"({{r.\s.*?}}|{%r.\s.*?%})", + r"({{[rq]\s.*?}}|{%[rq].\s.*?%})", r'\1', src_xml, flags=re.DOTALL, @@ -173,7 +173,7 @@ def cellbg(m): r"-%}(?:(?!]|{%|{{).)*?]*?>", "%}", src_xml, flags=re.DOTALL ) - for y in ["tr", "tc", "p"]: + for y in ["tr", "tc", "p", "r"]: # replace into xml code the row/paragraph/run containing # {%y xxx %} or {{y xxx}} template tag # by {% xxx %} or {{ xx }} without any surrounding tags : @@ -184,17 +184,17 @@ def cellbg(m): ) src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) - for y in ["p", "r"]: - # replace into xml paragraph or run containing - # {%rp xxx %} or {{rp xxx}} template tag - # by {% xxx %} or {{ xx }} without any surrounding tags - # This allow for inline {rr }} and paragraph {rp }) styling - # This is mandatory to have jinja2 generating correct xml code - pat = ( - r"](?:(?!]).)*({%%|{{)r%(y)s ([^}%%]*(?:%%}|}})).*?" - % {"y": y} - ) - src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) + # For paragraph level richtext + # replace into xml paragraph containing + # {%q xxx %} or {{q xxx}} template tag + # by {% xxx %} or {{ xx }} without any surrounding tags + # This allow for inline {r }} and paragraph {q }) styling + # This is mandatory to have jinja2 generating correct xml code + pat = ( + r"](?:(?!]).)*({%%|{{)q ([^}%%]*(?:%%}|}})).*?" + + ) + src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) for y in ["tr", "tc", "p"]: # same thing, but for {#y xxx #} (but not where y == 'r', since that diff --git a/tests/richtextparagraph.py b/tests/richtextparagraph.py index e06bf47..e63f91c 100644 --- a/tests/richtextparagraph.py +++ b/tests/richtextparagraph.py @@ -12,9 +12,20 @@ rt = RichText() rtp.add("The rich text paragraph function allows paragraph styles to be added to text",parastyle="myrichparastyle") +rtp.add("Any built in paragraph style can be used", parastyle="IntenseQuote") +rtp.add("or you can add your own, unlocking all style options", parastyle="createdStyle") +rtp.add("To use, just create a style in your template word doc with the formatting you want and call it in the code.", parastyle="normal") rtp.add("This allows for the use of") -rtp.add("bullet\apoints.", parastyle="SquareBullet") +rtp.add("custom bullet\apoints", parastyle="SquareBullet") +rtp.add("Numbered Bullet Points", parastyle="BasicNumbered") +rtp.add("and Alpha Bullet Points.", parastyle="alphaBracketNumbering") +rtp.add("You can", parastyle="normal") +rtp.add("set the", parastyle="centerAlign") +rtp.add("text alignment", parastyle="rightAlign") +rtp.add("as well as the spacing between lines of text. Like this for example, this text has very tight spacing between the lines.\aIt also has no space between paragraphs of the same style.", parastyle="TightLineSpacing") +rtp.add("Unlike this one, which has extra large spacing between lines for when you want to space things out a bit or just write a little less.", parastyle="WideLineSpacing") +rtp.add("You can also set the background colour of a line.", parastyle="LineShadingGreen") rt.add("This works with ") rt.add("Rich ", bold=True) diff --git a/tests/templates/richtext_paragraph_tpl.docx b/tests/templates/richtext_paragraph_tpl.docx index 738c5025ba172ecaa1d41abfc64a3c1a2174eb5c..993b466d3386e91070482e66ead1938b608b40b9 100644 GIT binary patch delta 13244 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 TQbOQGGD$!w7N~N$e@y-#KPw=u delta 11253 zcmbWdWmFwYuqeE-V8NZ>4k1X`xCSSr~{oDRb0+TbPs1SvJz4%^o(R#8%~jy9YP?r<7<-d z$?Tcg#3rgbA(;L}5K-=X(uL;;>(w_kTGFlGb$=VfhTB zYiLo&WncR<_BT#pL@{E=O*ODiK~2mdY5R;hoY&|1UJnAbXYv$#9%Rp^{WGfcSs+)^ zh<|F;6cYy9vx%#om~W8AxtnIeGzVJ2Mnq(- z$)xHb;v2@|u;&Q`TpUws2w=o4YNc+=&N=in{-k9rfT@!3HBEH?2PWs@;9U7fH$UMT z%ZOODo@KbIq)Xoc6}kM&beYuR7mK%f7yj@K)u-|y7ubkZLd2mP;4O$^TX4?vnr*H0 z3`|!mzR-{{&`mBI!8F>mOxlWxMAe6Hy0nXUim!1g{4Xg{{e(3D{5^5MNxSN(Iip_{z12be_mnj7Mg5b2@NP~N zw)=6t-g8r6aWkq=lX;qlEV1h@jaDwC*hDEO{%SNtzBdg=017*y_8r0Er`skWjHVo8 zdSugcd?7czXyUrtQyjdTZ^`tgFk`9}EccW~w99s=U_tlqVN;3;eidd!xf{ZE=s&T@ z-FHKTWh%+hdPhNIhCa|h^f{x{S^B_ZS19hz^kn;S=n=PsaQ`3ko0kwi-#M>}M1u_v z6}1r_{Jm_EZ^s4#IKKD5$&>Up-2+5+%u=^uTrsa(0D**tAqZfe=mUF&&R-+~fgd0VAm$ulBip5IkphT{K^}jh(4fiQHYSMW@Gyct z5jsXpVkZb2_!uQ$g5^jAYwOF;6wfGO+ZSW(S;hNPzV!pY&5dnLcB#I5(skR+HL9q9 zxL?MX?{J{|4n4>;rB@XzEHW|n*cqrSvduyg$EGcTHLgHq?(l+D%%58%w3T_j9T4D> z{CM<3O<&UF4jb6}^&Zq3bR2E!4*rdrXjNjvf#C_4@VxhM zPdJ8`hWF7kJUPr}V$FO2(KAot1Hz>G_~P4(Y?rjok@{eXsrr}gBCax`wz0h&WB17! zy%k*sWm`B+%@@V2IE~Y(p$W2m`g&FE>63aG`1PGK&Fg%r#;%}(U%3<+lr3R8cpHCuyrl;?kNmz;@)s9)ohVf zk=huHag*rzF7A0qK7e)?uaP0Aji1wa{J4a>vd(N0!lGVKo^qhx*w=rD5zI^(&C9FNxC|!P6vEi;vH6{LS$|5R@Ii0I$S(FVl z#X2OunH8`)Y39OXdj7>0LCf*RqROIWr>TR^BIa6V=c0Yvm;gs`h)j+&DiU4n}`>ej_YyHo414Y(AiPd=(jK9 z?){Cr5n3hVMj^sR5e?SmGV;qb__}nCG4W4=&4S5{%{z2r>az?KUD#+Lqs4|u(Lo`J46>22x--+b3uKIV5ZhuU`n%$5)P*q50RPQhiw zq}#YLF`S`jxnp1B`>3eW>7Qv~L1X4SZ0lLvS0?$Utl;@{Br(G$qw0K`bm{isj)-;D zBgjtj3pcVc9EY1Th3Dxo{RJyZV|^Xyr8bKA0C$l{_v9hP0+)F+l&N* z{YB`9RM{dY>;rh+(|KOWmNb9UB(}-t~Nn{dTO*(I1s^d`_m5?0N@b)KP3u|#!gP= zHl~h$6NLh`Rhv~&RBy&<5b7T-5sEueczgf7FA`|YA_;i{zf^Wd$)p^@D2?>{wFE{++4&z(!t*ozjhe7OxJ=X+H> z>**6ac;_PK5*jV8t#x+K`hGeR@DZDj&p+#x--y@JT+gKqp03CkTf4OL%6BO~~LgGFK~> zR7yC{3iyv2d}XShgq@`pF0TL8y__Gxi&fGt)793H(GlJ4DcG&({laie)S&ILNy9em3K3$%YQnYV{A#Qn7FOZPj_fIby6>%#a>}i+luWAI zYTx0+uX+EG^!_#0z7!pyJ@bX+&qYq*i?I|Zca^2JV$0$*3ZZG|sjqj|k#uDQM|oA+(qi+6;%0%}bKFJl#!1-)A4pI))9$zyLiTR7 ztYO|ou^e;qqx8InqSVvZ>j-n9!(8mD`;r;gxoZm+C)4Q?C3t=JIs0nq4`=*cOEg_=vKEG(x4@6SCUfP)W<5Mfge#>w3Vz=pFQ{5>%0jts7}xTp5k= zp&w<)&gBr#FI_MIPJ~7>ex}_vHZhbioQxShpjL{AoM8(snMTk()(&&43S-BLImT-a zQZ`n(P7o~{Hc}4`erXhq23>&)9W(4GJP(bMIl?O;3Vl(+fM9E?Mt(~?{6w7HWqN#O zSQ^)YHHwqcOxS!I2IRJ%vLgZ87=_08duE(jw4cQ)Bb-J6ttSI3jdP#dPk?;XOZ7YO zgH)TG1BamT^slU9IBK^h2zX8#=gl@!jWBx5+7OdyPh{$n;toxGUuc)~K<==w|EYL*I z(Wq$9_$xEzz5YmW`Wl7*;W_(bg=a6PHK9CloR|Xt_QhR+xnej83i~{ql z;)Kxs9x>3i9YMek(-pjH$Krxl)0*f(I+3o)G{3iT&%|r{f&%ubUBY7O2Z-#ofr!j| zXjwrV27-A96w#NzS0qAX?`;jqmRY)PB*wLP5PhMA_LHEX6(w5FHv+qs%@ey(*+0WZ z$t7y0moGctS!lU%H{G%gm&50EKD>&z%JQ~Vgm5d)x10|12QdQ3meq`)U=(ndf(BUpH z<_IOec$hwMWcE2~H8VjTGw@|A^MAkfbajdI!t>9>cA1R|d(@b}VY0TdT`PBw`*o_> z{0UX_J_$tYxe8j|a3kNpNnzJ}!AW$<>N&T!PjUyJ8W5)%?b7FiBeRUH;%n<8WxsBW z=Ge5gPOf4B`}n6rm+QzpcSjU*uQ?`X>alf$gxV7!@{M}bHyLSu z@4$=;8IY!a3Wf+l3#ELE#Ib+GnQsTjabwq8k;p)TSd@aeAE5z&==UYzd$9j!NoeD2 zZD8#19_#;x`tg+aH6a^n@CD)@!jBLgQciqJOGaB(3nJlXc>)T5(vl9<;AqP*jfa}O zQ~3mm%d4kJoofh|)l+4fCPiqjFU^5(X8OXipkO7_F} zY1|UX1!?0^PEp-FM!0kUy%j2}(_LVw`fL!JKc(NR#|i>1A5ecOkJ+kgDP(})_gKM( zkUmE0wNlqjT<=-mM}|+s$E>gwH0Jx2j-GmDgml);i61pLQLin}XiDipnP!?$a|xj? z1E?4-7t3mbr2ft93l7plt+(CVvw#dDlF;AX$s&EB7QuM7^_mVp{mkd>=#(j_*SQvm z)Sz_nXCWx|Or<`dC)+R~A@y`dTd3`xDJ6I$v zKtH8|;M>A&iq&#a`80SWsOQti>=Ca>LHT*tn))-eKC2>V%d{_nyn%x3#a}gr$I4-C zJZ?&;=D4Z|J`HSgNkt%g)}5(BZbS*IV3w9nYnV3T!ivaN&$8k|#UVpmHuKQ26ni_V z`!ml6wRw-fJG~0;ZKM-q^#lq_*YU^6D|#7B?AR=Av)=cG->j0D6ga5G7(Uu}F-Vhu zm5^aY;7_9QRC;n^uQ^^0w<$|6Z^|EHAE>(-2q&^1Z75yC2TplcJE$7!T00Ph=jIP=U~;}G!w;aG>V0j~WiA%CQ; zN^u1NucI+9p>YQu4Tg*|D|f-E1IvN=RXG9q(_UldDvjOq<4wnBMy>FSZrYVweoq-d z;qN)AuD5z&0@YTK4++UD5jv{2xAoXh$#s6cre_BgC*a1}Q_^@lGT3%^MPJ1zs&a(^ zB1D}7t-2<|-eIsNe;tF%LcAe{A8O{Cj#cvh2ygKhsi}o&hI6OQaJ445K>VsVY#@Y2Co$jx0=;aDBFvG}5TX7)pS0pqlq{Hp-CVQVg5iJu z^Fzkp7C2^@l!Y>AD;D5eL>jUE=eO78-q!xaGRZJvyeNe}EidtpX|K!K7|`1)itNSp zHf64RH-!1C4`CLHib$2FY+SAQ``Cv_+<|vP`Dc! zwf*m}Jor&XP*Edoa!U?)A%DVyR#~MHY5B*^dc)`^RDV-3n#*dN$a0o>dR=U-{*Y)dd_T&r%sX4-|=-b8cV$9p1(Qfo}B-usk>H*2uO`;8)|VShR2B< zTW5xHnM#DA)8sDowXAD|pPl~8)#efJNFRsK=FMJEm7&h-nMm3YluvLx=ts-2;ZHXQ zN5-wkRcc4;gVn;Wm%uE$?*8_) zzvC1vg(piFs=v@W)6JsUxyf5Py_-<4T9Qx_%$|A}H4KEbK^%09Oz~dwl%_sn-Io*w zVaT~(2;9*42P5IdRjs2rpl5n*pUqCeeD@yN3=|{v=gs8yCwddSsrZ8c*NZ(JeuUI>0h4W~a_eGio8gZC4D z_V{#xkh~2_s;O-f20w?R&$vVHcn4PSA=pz;IOI1@jGyVO?p4ddfTVTGb9NT#4tE<7 z;{7i1VKO^azL{1l$M$E#Fpc0$&6u;5FXdEMHMFFSuFT@W{zgYCCPd9luTv`?QJ#0 zcklX$$O7g%_!;~A8TH2W@c3<5((bA_q`PJUt<41TLa%usSv0IzB1E;kxbh{_W`G5J zgsa3#$#)2OB2A?O`CXy5)6vP)kV z`~xS|%^@w~M&ayYggfV!uF3Eiivk{thD7{Dfhd4SS9XsHU<);#`}nX4R;cokNyReA z#EO#zy8{}9@3A3#*HVj7dpEwBOQ!h+OC$dQp(^}<_6J>7F`(S-Md*~Am?{Edr84_r z+^d}iKR_j(3+60?LX$P;jM%#1@It>G&=OX^rilwQO$oe&;QZcIe3 z)Fu-xLeI6m-S31i_6{O#(JLPM5s8hi zI*u!okMP&V@bB>99iZT^Eqq^H4{>W=n~&bn-7!r{F{v-a^`5CtJ4ja5{bLFvKbT3^ zhf2TmS*q9TVR@G>XN-~<`su{rV*z6}OYAFGT0_nW(wO+|HoQA1b6RX$-%n}goTUj< zwys8Lz5fh?cA*3#CcrxA+IaWZQLpAa^q6S}Peo`vh5q>L%1TvVT>N0~)<}DR!Iebx zhH{InxVS2Pn3;(=SUYJd`QW%V^5uBU!b#)y8I`{(T(7fC61*gaKd=gNR+qnL8gTllt>)n*eScqbX+t3o<~gE)AIl(0T8oOej4vjn)K4`f zq%_W0pjh4B3OCaIM7Y&30V?Cn8hDUd{ZWE$L*FzJM>j%+!()A&r%?ipqfb+XEpXx# zf!FTUyjeSDm^Uob69~@y$ys$8+5~u#>Ke#19ios{*Kr2j_50XkaE6{IaDvvqHrnX6 zZ_d5sR&n#$eRsqMI#8`MYR%V0YR6>GMiI_%UM!(yV#E^8&|;_$$kUF<9A%`RhE7V1 zMhlpJULxPD!%7%3{!DWbUr91Rsd zcSUrmtLRmp^#thr$(^QC%kTa+mn~n8MqB7@zi+Lhq1s5Y1Ya(ZZ6sA9*_UiL5m>_s zA~hSE2%*xod?EhiPYv=DpM3gBO?U&WJZFRnWOD_=6}t$gYYJ*69^rlvRn1?9*RC|B zc4E!X^sOt#3Sh4w3~H(&+%vJjHBnP+hb_zWWo4z{NX6G%lSY!CEDEM!SM2K#eW&S3 zpJip7K~pP2MYflcjxNukzAG&y>PsWRt0@XWF3j&DL)pz$ApaNczdYW!DOhYdqxh+%b`qE;?T()nq;|8k|Vd_-ktU zFJevoYwtfa|C$>4M;-K6wftR`vi(2lzbmFm{r8UiiHqnb(t%*r1y{g5cQBqO?Uwuh z0da061M@j0J7;JvSLaYlRFJbRR(0W<*1pHSb#A_IbqKH%sfN#e(qol-y<{kBDn;+j zqw?E8l_E~UT1W<2?j6t{I9j}<&zO1fc5s1l*hBE$bI_G*AL*`eF@LPyeoty9`O(n@ z$LnWNxSbe=G!#^xFf?Ysph}@=>MEo4DjHJSk(gXRvRv4STHeh1^!;cbgHe|VL$_tm zjG^nyg-0{AIZ8h6`>vw82NaNSQmSL}sIR$zPW(h3XQmD0N$`+we8*vbr9q5wVEJiy zp2GFha9Cfx1ypO$<6EJHJWc#J^|6sZyZf0=q_lJx0}sB#z*=tlbM39A<*04EPd|?u zG*)9}h*)kD>)jNFqr?SYe1H+$CwBy@D90ns1Q$;!d&a}qZ_`;V5fV4;8p2JY0;KU4 zl9|Rot)qlMiOH476}M}lYtU^=r@*4wQs;& zNwnbSQ#T6Th+0>l+>J}K#Hn4mZUo$g&-tBAPhl(9-+tvANPFgWS;{s4&@Zbl;(oMK z{UZRzl_C3xvNYf`jP$&L*j^yVC~zON(Dm6%&Q(a6pQY+Ovb zMl!QpxgcPL^@OS!DQq3sv%e{HkC2os!ZFt$SZIf~A%eR;PPY(B)E)9TwAxp7{+O!U zXFb`c5>0<=XsX*|orLH@b$D8ZZTNV*_lD=a_<{Lpbb>;VHCe`s zjPR#Lu~wl?=AZi!Wo4TbxjZGq=TMOLAUwZk-&+*dErT{zhtJ5i9c7bNe28!F-IS+- zm-h1F&}{jM$2gEi6R5-5Rb*9L8R~<`sCuUcs>)?Q^aQ3w*)%wrMs;zw;VYLT4en1{ zP#?+!mpEU42~K%yrNoW-d7bnc z!suqJ>ai5KT*HO{n0{cz*?F^a3aPOGzIGI-k= zWH&XCMDaMGbnMj%>o!&M%hsh_@aZfA7*qiD{QYxpi4 zU%8FaqD;FBS!4o4LSw{mLW~&#bet>0%anU-2P#%Ebt<&Q!sbF9^+`XPpF0wKFqj>= z&pY)$GYpX2kS5k;MKPCzYKxxgbR4P%iK=ZcS_C#$@4j4z{FoW%^Q_b6di(9f)3)%q zz;G|7mX-8bvF+ies?#LOwSM_jnC}$2l5~CG?!IxO7YhG$HIo&;zpDSDAjbl}Q6WeR z4a@Z&0;a@L?Mg|peqvrlG9}6O_nPJYZzq@h;wK+$pYgpVyfL!0kq8cpR^=oODdO`n z%agO2a%{s)qw*jP>LUldMG21m*{9HrTa32}X)iU^u1Af#!7Ihroi2#~X*Ir9{9D-g zokIc*uI0uDWz5Rk_L86iHt#5(P>?RZJ6lK@TGr81d2ZZ7p;jfqX+gCd`@H0+sP06p zOLDGkBtu2dKb9z8AuUJ%Ia4DQ<9)Yi3YPbFPaIh^;``lApcTzXsHyFYw0Za|(<=PV zVBLscoh0NU$AD83d)}Gy$8Iobt;`F0y+i1gCVWz$vuF#GyAY3l`Ni?EN~NFKhd^nZ z0>e{sgrvgV%i!mno_n@z4Y_Z^J9O&p5eqzdtY#wCaRH9{yc(Ij69uhb!OMgNl+A}V ze|Bn8s`8Q$j=&934UbU!eZEJ8HJf$>CiL6^!Q-9e15Bp&&IN~@Z=Z``L;FY!9vw=_ zk(oO{rkq*Xi=@>_2I3@D)jSA_6rzONJX(1PgEaQ8y>KDj@*LNOfR?tlB|_u z1y!kXYvZw_r|kIb&4f6bE_RxnzLgrFx>Um5;aD;@KKmi9s76FVNk(9Gv@Q-XzSlec zdqu>zoN%BJ5&)1wd@m)V1Hid5n4q~tZQB(l%-{>^Gk)P##s?DU@b8}!vCP@qm$=SW zIFM_PV}{vu-+YE-a=!T?yJ{3tLUIq?Vm#fPfZIa|O?!fAqzhAmMo5sM$ZF_I)Fyhf zry|lNaLodQ{ZcTEu+PJgiO=~#ZL2bpw2{bqKc*FmqN3*)l$DFi~uBWTZP5Sy)9 znrW7XYe+~n1hYCWTyo@Xhf35Dg(_AQBo*Ry8?4}QVt$l0P~ADjV!DDV;1!4-nT%mJ z$3u%ebuil+8i^s$aN@W~mjc1cRdk>pT{59)E^QGeF-XZjY$1DMF4qp{ARHYhsD0%( zSRiHlV2Ix3l-e)bFoV`|;DW-L<)aN>Ivo!IuZ8DZ3klowR>R+9r(EY~|5;L#Hnq~% z;_hq&sY%g~!`J8ZLE$S-bzE#3#dO2BnnyQiS9DFWm>q&qc^+i)RWy*QxVZtI^iTtQ za;Rbxzi{HNI1q`IwS}vnU0l9BxJY6a3s`aU^@EIOkTiu~pcB4?r+08M+9?NkR{ZA? z)I}sdgohxHqKwmJlvTim&He#q?c~S~DNS4tV~~c64%%H&m+CJ3eg@wc?CS7w(yv*O zM4sVmorR&EQuvcM;m;udNV6{JM}KaQ@UB1RBd2#6jEuJe$mK70h25 z4eiuXohR`q*W!UVY6b|H+m!zJBO^BZc$(&j9~TB}C{(^6i!Ufb@@<;4y~aX) z6(a}~z)7f~&6B`lGrp(&-Km6jpiTL;xS!b|QCxTNr3t+`>pKrmK7xtYw@@+E?zEoo zaW9^d6bHy+M0buRkJOSBs%m+ahflx$$FbZ^tR7L1_>CF@q%GO^cl^S<35|HC`;4ng zuKE!R=|lB|Z)=NBHtB(bDKwiwwky`_!P~}e+1I-n;9YQKNe7Zy-zW7P8n`&vc(%wf zW512^(rmIRH8Q-?Pw+4+e&4`Xk95U!`BA~D>on6z0lzaO(jv%U9jK*LxAv^Q9D$R`769o zf)hx>BlE)>MswlCt>WuXGGWSfR_mx~{+w`cP_7n6d6bMEO{D+6pSZ8xek`mVfH3&F z@nzWvXad7=_Ibxe@>b5LHKm>`*CDZPqbHt_wAS+BHFHUrm?Y0nNe(eN$tngHJA=9- zM6?jCkkHtI_)`$(AR*|^*&4X!_Oj+H0Vq)lv9JMoL zC4BQB2fkEzzR-bU)QTAd^VX}$!$WX&ty*(W(-- zdm2Ikd!C`JhJWOQymo%HH+(<2u?`;kO(axP?!lUU)W{oFi$EYhM&v91p>uJ?eG&R@ z<(K7eBKZV$RTYRDRzkfrk^xB`clL-O#zIy_>PE1y8cTQ4Z@I3Y8m`g!vVSONFR-2= z{Zi}SvqP&4wm||xaZ=w?xx4(fRju^GNZ=lwD!+O0XzU~(%1C+c|1~Q_^CHc*cl3L5 z#BV+8<9YKp^RInF_W1kn)r+>YuS@+gi6({Aga1V;`XV)jB!!J z$Hoosy60KoiL^8L;d2-cOMBKUV|{AYvpUl~ZY_j!_n;BUOqd>{Ow@AK#1L%IL9 sMGo+m3^~F7`FH%w1^~>t!6dRgkkNc#9a(b%7 From 9392b06da49170383ac4e98a60e65e845e6ac03d Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Fri, 2 May 2025 16:29:22 +0200 Subject: [PATCH 32/64] add RichTextParagraph class --- docs/index.rst | 8 ++++++++ docxtpl/richtext.py | 13 ++++++++----- docxtpl/template.py | 18 ++++-------------- tests/templates/richtext_paragraph_tpl.docx | Bin 20437 -> 14177 bytes tests/templates/richtext_tpl.docx | Bin 14126 -> 11440 bytes 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 517c3e8..a742d49 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -263,6 +263,14 @@ You can add an hyperlink to a text by using a Richtext with this syntax:: Put ``rt`` in your context, then use ``{{r rt}}`` in your template +RichTextParagraph +----------------- + +If you want to change paragraph properties, you can use ``RichTextParagraph()`` or ``RP()`` object. +It must be added to the template by using ``{{p }}``. +Have a look to the example here ``tests/richtextparagraph.py``. + + Inline image ------------ diff --git a/docxtpl/richtext.py b/docxtpl/richtext.py index 5959d68..f0f4738 100644 --- a/docxtpl/richtext.py +++ b/docxtpl/richtext.py @@ -47,6 +47,10 @@ def add( self.xml += text.xml return + # # If nothing to add : just return + # if text is None or text == "": + # return + # If not a string : cast to string (ex: int, dict etc...) if not isinstance(text, (str, bytes)): text = str(text) @@ -76,11 +80,11 @@ def add( if bold: prop += "" if rtl: - prop += '' + prop += "" if italic: prop += "" if rtl: - prop += '' + prop += "" if underline: if underline not in [ "single", @@ -128,6 +132,7 @@ def __str__(self): def __html__(self): return self.xml + class RichTextParagraph(object): """class to generate Rich Text Paragraphs when using templates variables @@ -149,7 +154,7 @@ def add( # If a RichText is added if not isinstance(text, RichText): text = RichText(text) - + prop = "" if parastyle: prop += '' % parastyle @@ -170,8 +175,6 @@ def __str__(self): def __html__(self): return self.xml - - R = RichText RP = RichTextParagraph diff --git a/docxtpl/template.py b/docxtpl/template.py index e873958..d24d691 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -161,7 +161,7 @@ def cellbg(m): flags=re.DOTALL, ) src_xml = re.sub( - r"({{[rq]\s.*?}}|{%[rq].\s.*?%})", + r"({{r\s.*?}}|{%r\s.*?%})", r'\1', src_xml, flags=re.DOTALL, @@ -184,18 +184,6 @@ def cellbg(m): % {"y": y} ) src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) - - # For paragraph level richtext - # replace into xml paragraph containing - # {%q xxx %} or {{q xxx}} template tag - # by {% xxx %} or {{ xx }} without any surrounding tags - # This allow for inline {r }} and paragraph {q }) styling - # This is mandatory to have jinja2 generating correct xml code - pat = ( - r"](?:(?!]).)*({%%|{{)q ([^}%%]*(?:%%}|}})).*?" - - ) - src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) for y in ["tr", "tc", "p"]: # same thing, but for {#y xxx #} (but not where y == 'r', since that @@ -814,7 +802,9 @@ def _replace_pics(self): # make sure all template images defined by user were replaced for img_id, replaced in replaced_pics.items(): if not replaced: - raise ValueError("Picture %s not found in the docx template" % img_id) + raise ValueError( + "Picture %s not found in the docx template" % img_id + ) def get_pic_map(self): return self.pic_map diff --git a/tests/templates/richtext_paragraph_tpl.docx b/tests/templates/richtext_paragraph_tpl.docx index 993b466d3386e91070482e66ead1938b608b40b9..4ae45017b6496d6120111cb8a9d5ffc280fc427b 100644 GIT binary patch literal 14177 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

=FY&s&NbpNC&angX_Xp_$Ek-3w(BBr?skO7 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 LDU?b7miqqynbQmm03d+^0MG%j;5s5eJ7-fn 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 B4uk*z literal 14126 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 From 40861400b37826cea3554db67d504a831181cb4b Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Fri, 2 May 2025 16:42:32 +0200 Subject: [PATCH 33/64] black --- .github/workflows/codestyle.yml | 2 +- Pipfile.lock | 506 +++++++++++++++++++++----------- docs/conf.py | 56 ++-- docxtpl/__main__.py | 9 +- docxtpl/template.py | 6 +- setup.py | 65 ++-- tests/footnotes.py | 4 +- tests/inline_image.py | 12 +- tests/richtextparagraph.py | 38 ++- 9 files changed, 448 insertions(+), 250 deletions(-) diff --git a/.github/workflows/codestyle.yml b/.github/workflows/codestyle.yml index 8e17bd6..1819e22 100644 --- a/.github/workflows/codestyle.yml +++ b/.github/workflows/codestyle.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.7', '3.8', '3.9', '3.10'] + python-version: ['3.9', '3.10', '3.11','3.12','3.13'] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} diff --git a/Pipfile.lock b/Pipfile.lock index 90501d1..fe9b33b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -19,11 +19,47 @@ "develop": { "babel": { "hashes": [ - "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", - "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" + "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", + "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2" + ], + "markers": "python_version >= '3.8'", + "version": "==2.17.0" + }, + "black": { + "hashes": [ + "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f", + "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd", + "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea", + "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981", + "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b", + "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7", + "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8", + "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175", + "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d", + "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392", + "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad", + "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f", + "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f", + "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b", + "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875", + "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3", + "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800", + "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65", + "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2", + "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812", + "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50", + "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e" + ], + "markers": "python_version >= '3.9'", + "version": "==24.10.0" + }, + "click": { + "hashes": [ + "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", + "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" ], "markers": "python_version >= '3.7'", - "version": "==2.14.0" + "version": "==8.1.8" }, "docxcompose": { "hashes": [ @@ -37,168 +73,221 @@ }, "flake8": { "hashes": [ - "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", - "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + "sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343", + "sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426" ], "index": "pypi", - "version": "==7.0.0" + "version": "==7.2.0" }, "jinja2": { "hashes": [ - "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", - "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" + "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", + "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" ], "markers": "python_version >= '3.7'", - "version": "==3.1.3" + "version": "==3.1.6" }, "lxml": { "hashes": [ - "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7", - "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726", - "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03", - "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140", - "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a", - "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05", - "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03", - "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419", - "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4", - "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e", - "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67", - "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50", - "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894", - "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf", - "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947", - "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1", - "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd", - "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3", - "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92", - "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3", - "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457", - "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74", - "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf", - "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1", - "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4", - "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975", - "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5", - "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe", - "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7", - "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1", - "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2", - "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409", - "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f", - "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f", - "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5", - "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24", - "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e", - "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4", - "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a", - "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c", - "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de", - "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f", - "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b", - "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5", - "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7", - "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a", - "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c", - "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9", - "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e", - "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab", - "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941", - "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5", - "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45", - "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7", - "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892", - "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746", - "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c", - "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53", - "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe", - "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184", - "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38", - "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df", - "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9", - "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b", - "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2", - "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0", - "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda", - "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b", - "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5", - "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380", - "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33", - "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8", - "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1", - "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889", - "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9", - "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f", - "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c" + "sha256:00b8686694423ddae324cf614e1b9659c2edb754de617703c3d29ff568448df5", + "sha256:073eb6dcdf1f587d9b88c8c93528b57eccda40209cf9be549d469b942b41d70b", + "sha256:09846782b1ef650b321484ad429217f5154da4d6e786636c38e434fa32e94e49", + "sha256:0a01ce7d8479dce84fc03324e3b0c9c90b1ece9a9bb6a1b6c9025e7e4520e78c", + "sha256:0be91891bdb06ebe65122aa6bf3fc94489960cf7e03033c6f83a90863b23c58b", + "sha256:0cef4feae82709eed352cd7e97ae062ef6ae9c7b5dbe3663f104cd2c0e8d94ba", + "sha256:0e108352e203c7afd0eb91d782582f00a0b16a948d204d4dec8565024fafeea5", + "sha256:0ea0252b51d296a75f6118ed0d8696888e7403408ad42345d7dfd0d1e93309a7", + "sha256:0fce1294a0497edb034cb416ad3e77ecc89b313cff7adbee5334e4dc0d11f422", + "sha256:1320091caa89805df7dcb9e908add28166113dcd062590668514dbd510798c88", + "sha256:142accb3e4d1edae4b392bd165a9abdee8a3c432a2cca193df995bc3886249c8", + "sha256:14479c2ad1cb08b62bb941ba8e0e05938524ee3c3114644df905d2331c76cd57", + "sha256:151d6c40bc9db11e960619d2bf2ec5829f0aaffb10b41dcf6ad2ce0f3c0b2325", + "sha256:15a665ad90054a3d4f397bc40f73948d48e36e4c09f9bcffc7d90c87410e478a", + "sha256:1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982", + "sha256:1af80c6316ae68aded77e91cd9d80648f7dd40406cef73df841aa3c36f6907c8", + "sha256:1b717b00a71b901b4667226bba282dd462c42ccf618ade12f9ba3674e1fabc55", + "sha256:1dc4ca99e89c335a7ed47d38964abcb36c5910790f9bd106f2a8fa2ee0b909d2", + "sha256:20e16c08254b9b6466526bc1828d9370ee6c0d60a4b64836bc3ac2917d1e16df", + "sha256:226046e386556a45ebc787871d6d2467b32c37ce76c2680f5c608e25823ffc84", + "sha256:24974f774f3a78ac12b95e3a20ef0931795ff04dbb16db81a90c37f589819551", + "sha256:24f6df5f24fc3385f622c0c9d63fe34604893bc1a5bdbb2dbf5870f85f9a404a", + "sha256:27a9ded0f0b52098ff89dd4c418325b987feed2ea5cc86e8860b0f844285d740", + "sha256:29f451a4b614a7b5b6c2e043d7b64a15bd8304d7e767055e8ab68387a8cacf4e", + "sha256:2b31a3a77501d86d8ade128abb01082724c0dfd9524f542f2f07d693c9f1175f", + "sha256:2c62891b1ea3094bb12097822b3d44b93fc6c325f2043c4d2736a8ff09e65f60", + "sha256:2dc191e60425ad70e75a68c9fd90ab284df64d9cd410ba8d2b641c0c45bc006e", + "sha256:31e63621e073e04697c1b2d23fcb89991790eef370ec37ce4d5d469f40924ed6", + "sha256:32697d2ea994e0db19c1df9e40275ffe84973e4232b5c274f47e7c1ec9763cdd", + "sha256:3a3178b4873df8ef9457a4875703488eb1622632a9cee6d76464b60e90adbfcd", + "sha256:3b9c2754cef6963f3408ab381ea55f47dabc6f78f4b8ebb0f0b25cf1ac1f7609", + "sha256:3d3c30ba1c9b48c68489dc1829a6eede9873f52edca1dda900066542528d6b20", + "sha256:3e6d5557989cdc3ebb5302bbdc42b439733a841891762ded9514e74f60319ad6", + "sha256:4025bf2884ac4370a3243c5aa8d66d3cb9e15d3ddd0af2d796eccc5f0244390e", + "sha256:4291d3c409a17febf817259cb37bc62cb7eb398bcc95c1356947e2871911ae61", + "sha256:4329422de653cdb2b72afa39b0aa04252fca9071550044904b2e7036d9d97fe4", + "sha256:43d549b876ce64aa18b2328faff70f5877f8c6dede415f80a2f799d31644d776", + "sha256:460508a4b07364d6abf53acaa0a90b6d370fafde5693ef37602566613a9b0779", + "sha256:47fb24cc0f052f0576ea382872b3fc7e1f7e3028e53299ea751839418ade92a6", + "sha256:48b4afaf38bf79109bb060d9016fad014a9a48fb244e11b94f74ae366a64d252", + "sha256:497cab4d8254c2a90bf988f162ace2ddbfdd806fce3bda3f581b9d24c852e03c", + "sha256:4aa412a82e460571fad592d0f93ce9935a20090029ba08eca05c614f99b0cc92", + "sha256:4b7ce10634113651d6f383aa712a194179dcd496bd8c41e191cec2099fa09de5", + "sha256:4cd915c0fb1bed47b5e6d6edd424ac25856252f09120e3e8ba5154b6b921860e", + "sha256:4d885698f5019abe0de3d352caf9466d5de2baded00a06ef3f1216c1a58ae78f", + "sha256:4f5322cf38fe0e21c2d73901abf68e6329dc02a4994e483adbcf92b568a09a54", + "sha256:50441c9de951a153c698b9b99992e806b71c1f36d14b154592580ff4a9d0d877", + "sha256:529024ab3a505fed78fe3cc5ddc079464e709f6c892733e3f5842007cec8ac6e", + "sha256:53370c26500d22b45182f98847243efb518d268374a9570409d2e2276232fd37", + "sha256:53d9469ab5460402c19553b56c3648746774ecd0681b1b27ea74d5d8a3ef5590", + "sha256:56dbdbab0551532bb26c19c914848d7251d73edb507c3079d6805fa8bba5b706", + "sha256:5a99d86351f9c15e4a901fc56404b485b1462039db59288b203f8c629260a142", + "sha256:5cca36a194a4eb4e2ed6be36923d3cffd03dcdf477515dea687185506583d4c9", + "sha256:5f11a1526ebd0dee85e7b1e39e39a0cc0d9d03fb527f56d8457f6df48a10dc0c", + "sha256:61c7bbf432f09ee44b1ccaa24896d21075e533cd01477966a5ff5a71d88b2f56", + "sha256:639978bccb04c42677db43c79bdaa23785dc7f9b83bfd87570da8207872f1ce5", + "sha256:63e7968ff83da2eb6fdda967483a7a023aa497d85ad8f05c3ad9b1f2e8c84987", + "sha256:664cdc733bc87449fe781dbb1f309090966c11cc0c0cd7b84af956a02a8a4729", + "sha256:67ed8a40665b84d161bae3181aa2763beea3747f748bca5874b4af4d75998f87", + "sha256:67f779374c6b9753ae0a0195a892a1c234ce8416e4448fe1e9f34746482070a7", + "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7", + "sha256:696ea9e87442467819ac22394ca36cb3d01848dad1be6fac3fb612d3bd5a12cf", + "sha256:6ef80aeac414f33c24b3815ecd560cee272786c3adfa5f31316d8b349bfade28", + "sha256:72ac9762a9f8ce74c9eed4a4e74306f2f18613a6b71fa065495a67ac227b3056", + "sha256:75133890e40d229d6c5837b0312abbe5bac1c342452cf0e12523477cd3aa21e7", + "sha256:7605c1c32c3d6e8c990dd28a0970a3cbbf1429d5b92279e37fda05fb0c92190e", + "sha256:773e27b62920199c6197130632c18fb7ead3257fce1ffb7d286912e56ddb79e0", + "sha256:795f61bcaf8770e1b37eec24edf9771b307df3af74d1d6f27d812e15a9ff3872", + "sha256:79d5bfa9c1b455336f52343130b2067164040604e41f6dc4d8313867ed540079", + "sha256:7a62cc23d754bb449d63ff35334acc9f5c02e6dae830d78dab4dd12b78a524f4", + "sha256:7be701c24e7f843e6788353c055d806e8bd8466b52907bafe5d13ec6a6dbaecd", + "sha256:7ca56ebc2c474e8f3d5761debfd9283b8b18c76c4fc0967b74aeafba1f5647f9", + "sha256:7ce1a171ec325192c6a636b64c94418e71a1964f56d002cc28122fceff0b6121", + "sha256:8f82125bc7203c5ae8633a7d5d20bcfdff0ba33e436e4ab0abc026a53a8960b7", + "sha256:91505d3ddebf268bb1588eb0f63821f738d20e1e7f05d3c647a5ca900288760b", + "sha256:942a5d73f739ad7c452bf739a62a0f83e2578afd6b8e5406308731f4ce78b16d", + "sha256:9454b8d8200ec99a224df8854786262b1bd6461f4280064c807303c642c05e76", + "sha256:9459e6892f59ecea2e2584ee1058f5d8f629446eab52ba2305ae13a32a059530", + "sha256:9776af1aad5a4b4a1317242ee2bea51da54b2a7b7b48674be736d463c999f37d", + "sha256:97dac543661e84a284502e0cf8a67b5c711b0ad5fb661d1bd505c02f8cf716d7", + "sha256:98a3912194c079ef37e716ed228ae0dcb960992100461b704aea4e93af6b0bb9", + "sha256:9b4a3bd174cc9cdaa1afbc4620c049038b441d6ba07629d89a83b408e54c35cd", + "sha256:9c886b481aefdf818ad44846145f6eaf373a20d200b5ce1a5c8e1bc2d8745410", + "sha256:9ceaf423b50ecfc23ca00b7f50b64baba85fb3fb91c53e2c9d00bc86150c7e40", + "sha256:a11a96c3b3f7551c8a8109aa65e8594e551d5a84c76bf950da33d0fb6dfafab7", + "sha256:a3bcdde35d82ff385f4ede021df801b5c4a5bcdfb61ea87caabcebfc4945dc1b", + "sha256:a7fb111eef4d05909b82152721a59c1b14d0f365e2be4c742a473c5d7372f4f5", + "sha256:a81e1196f0a5b4167a8dafe3a66aa67c4addac1b22dc47947abd5d5c7a3f24b5", + "sha256:a8c9b7f16b63e65bbba889acb436a1034a82d34fa09752d754f88d708eca80e1", + "sha256:a8ef956fce64c8551221f395ba21d0724fed6b9b6242ca4f2f7beb4ce2f41997", + "sha256:ab339536aa798b1e17750733663d272038bf28069761d5be57cb4a9b0137b4f8", + "sha256:aea53d51859b6c64e7c51d522c03cc2c48b9b5d6172126854cc7f01aa11f52bc", + "sha256:aea7c06667b987787c7d1f5e1dfcd70419b711cdb47d6b4bb4ad4b76777a0563", + "sha256:aefe1a7cb852fa61150fcb21a8c8fcea7b58c4cb11fbe59c97a0a4b31cae3c8c", + "sha256:b0989737a3ba6cf2a16efb857fb0dfa20bc5c542737fddb6d893fde48be45433", + "sha256:b108134b9667bcd71236c5a02aad5ddd073e372fb5d48ea74853e009fe38acb6", + "sha256:b12cb6527599808ada9eb2cd6e0e7d3d8f13fe7bbb01c6311255a15ded4c7ab4", + "sha256:b5aff6f3e818e6bdbbb38e5967520f174b18f539c2b9de867b1e7fde6f8d95a4", + "sha256:b67319b4aef1a6c56576ff544b67a2a6fbd7eaee485b241cabf53115e8908b8f", + "sha256:b7c86884ad23d61b025989d99bfdd92a7351de956e01c61307cb87035960bcb1", + "sha256:b92b69441d1bd39f4940f9eadfa417a25862242ca2c396b406f9272ef09cdcaa", + "sha256:bcb7a1096b4b6b24ce1ac24d4942ad98f983cd3810f9711bcd0293f43a9d8b9f", + "sha256:bda3ea44c39eb74e2488297bb39d47186ed01342f0022c8ff407c250ac3f498e", + "sha256:be2ba4c3c5b7900246a8f866580700ef0d538f2ca32535e991027bdaba944063", + "sha256:c5681160758d3f6ac5b4fea370495c48aac0989d6a0f01bb9a72ad8ef5ab75c4", + "sha256:c5d32f5284012deaccd37da1e2cd42f081feaa76981f0eaa474351b68df813c5", + "sha256:c6364038c519dffdbe07e3cf42e6a7f8b90c275d4d1617a69bb59734c1a2d571", + "sha256:c70e93fba207106cb16bf852e421c37bbded92acd5964390aad07cb50d60f5cf", + "sha256:ca755eebf0d9e62d6cb013f1261e510317a41bf4650f22963474a663fdfe02aa", + "sha256:cccd007d5c95279e529c146d095f1d39ac05139de26c098166c4beb9374b0f4d", + "sha256:ce9c671845de9699904b1e9df95acfe8dfc183f2310f163cdaa91a3535af95de", + "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd", + "sha256:d2ed1b3cb9ff1c10e6e8b00941bb2e5bb568b307bfc6b17dffbbe8be5eecba86", + "sha256:d5663bc1b471c79f5c833cffbc9b87d7bf13f87e055a5c86c363ccd2348d7e82", + "sha256:d90b729fd2732df28130c064aac9bb8aff14ba20baa4aee7bd0795ff1187545f", + "sha256:dc0af80267edc68adf85f2a5d9be1cdf062f973db6790c1d065e45025fa26140", + "sha256:de5b4e1088523e2b6f730d0509a9a813355b7f5659d70eb4f319c76beea2e250", + "sha256:de6f6bb8a7840c7bf216fb83eec4e2f79f7325eca8858167b68708b929ab2172", + "sha256:df53330a3bff250f10472ce96a9af28628ff1f4efc51ccba351a8820bca2a8ba", + "sha256:e094ec83694b59d263802ed03a8384594fcce477ce484b0cbcd0008a211ca751", + "sha256:e794f698ae4c5084414efea0f5cc9f4ac562ec02d66e1484ff822ef97c2cadff", + "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c", + "sha256:eaf24066ad0b30917186420d51e2e3edf4b0e2ea68d8cd885b14dc8afdcf6556", + "sha256:ecf4c4b83f1ab3d5a7ace10bafcb6f11df6156857a3c418244cef41ca9fa3e44", + "sha256:ef5a7178fcc73b7d8c07229e89f8eb45b2908a9238eb90dcfc46571ccf0383b8", + "sha256:f5cb182f6396706dc6cc1896dd02b1c889d644c081b0cdec38747573db88a7d7", + "sha256:fa0e294046de09acd6146be0ed6727d1f42ded4ce3ea1e9a19c11b6774eea27c", + "sha256:fb54f7c6bafaa808f27166569b1511fc42701a7713858dddc08afdde9746849e", + "sha256:fd3be6481ef54b8cfd0e1e953323b7aa9d9789b94842d0e5b142ef4bb7999539" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.9.2" + "markers": "python_version >= '3.6'", + "version": "==5.4.0" }, "markupsafe": { "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", + "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", + "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", + "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", + "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", + "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", + "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", + "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", + "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", + "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", + "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", + "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", + "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", + "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", + "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", + "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", + "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", + "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", + "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", + "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", + "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", + "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", + "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", + "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", + "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", + "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", + "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", + "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", + "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", + "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", + "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", + "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", + "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", + "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", + "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", + "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", + "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", + "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", + "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", + "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", + "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", + "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", + "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", + "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", + "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", + "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", + "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", + "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", + "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", + "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", + "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", + "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", + "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", + "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", + "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", + "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", + "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", + "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", + "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", + "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", + "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" + "markers": "python_version >= '3.9'", + "version": "==3.0.2" }, "mccabe": { "hashes": [ @@ -208,54 +297,123 @@ "markers": "python_version >= '3.6'", "version": "==0.7.0" }, - "pycodestyle": { + "mypy-extensions": { "hashes": [ - "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", - "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", + "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" ], "markers": "python_version >= '3.8'", - "version": "==2.11.1" + "version": "==1.1.0" }, - "pyflakes": { + "packaging": { + "hashes": [ + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" + ], + "markers": "python_version >= '3.8'", + "version": "==25.0" + }, + "pathspec": { "hashes": [ - "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", - "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], "markers": "python_version >= '3.8'", - "version": "==3.2.0" + "version": "==0.12.1" + }, + "platformdirs": { + "hashes": [ + "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", + "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351" + ], + "markers": "python_version >= '3.9'", + "version": "==4.3.7" + }, + "pycodestyle": { + "hashes": [ + "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9", + "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae" + ], + "markers": "python_version >= '3.9'", + "version": "==2.13.0" + }, + "pyflakes": { + "hashes": [ + "sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a", + "sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b" + ], + "markers": "python_version >= '3.9'", + "version": "==3.3.2" }, "python-docx": { "hashes": [ - "sha256:15473bd40a7c16d9367b0a4b2cbbab0a787904fa2f7cadae1ed6f96201dcbb66", - "sha256:fc09412cef1a9ce7756d52376158f94f2a0edd0fc722da1d0a074f01d83e5021" + "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe", + "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd" ], "markers": "python_version >= '3.7'", - "version": "==1.1.1" + "version": "==1.1.2" }, "setuptools": { "hashes": [ - "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", - "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" + "sha256:2e308396e1d83de287ada2c2fd6e64286008fe6aca5008e0b6a8cb0e2c86eedd", + "sha256:ea0e7655c05b74819f82e76e11a85b31779fee7c4969e82f72bab0664e8317e4" ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==70.0.0" + "markers": "python_version >= '3.9'", + "version": "==80.1.0" }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.17.0" + }, + "tomli": { + "hashes": [ + "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", + "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", + "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", + "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", + "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", + "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", + "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", + "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", + "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", + "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", + "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", + "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", + "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", + "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", + "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", + "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", + "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", + "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", + "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", + "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", + "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", + "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", + "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", + "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", + "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", + "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", + "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", + "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", + "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", + "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", + "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", + "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7" + ], + "markers": "python_version < '3.11'", + "version": "==2.2.1" }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", + "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef" ], - "markers": "python_version >= '3.8'", - "version": "==4.11.0" + "markers": "python_version < '3.11'", + "version": "==4.13.2" } } } diff --git a/docs/conf.py b/docs/conf.py index b97390f..7966501 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -26,33 +26,33 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', + "sphinx.ext.autodoc", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix of source filenames. -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'python-docx-template' -copyright = u'2015, Eric Lapouyade' +project = "python-docx-template" +copyright = "2015, Eric Lapouyade" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = '0.9' +version = "0.9" # The full version, including alpha/beta/rc tags. -release = '0.9.x' +release = "0.9.x" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -66,7 +66,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build'] +exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -84,7 +84,7 @@ # show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] @@ -97,7 +97,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'default' +html_theme = "default" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -126,7 +126,7 @@ # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied @@ -175,7 +175,7 @@ # html_file_suffix = None # Output file base name for HTML help builder. -htmlhelp_basename = 'python-docx-templatedoc' +htmlhelp_basename = "python-docx-templatedoc" # -- Options for LaTeX output --------------------------------------------- @@ -193,8 +193,13 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'python-docx-template.tex', u'python-docx-template Documentation', - u'Eric Lapouyade', 'manual'), + ( + "index", + "python-docx-template.tex", + "python-docx-template Documentation", + "Eric Lapouyade", + "manual", + ), ] # The name of an image file (relative to this directory) to place at the top of @@ -223,8 +228,13 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'python-docx-template', u'python-docx-template Documentation', - [u'Eric Lapouyade'], 1) + ( + "index", + "python-docx-template", + "python-docx-template Documentation", + ["Eric Lapouyade"], + 1, + ) ] # If true, show URL addresses after external links. @@ -237,9 +247,15 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'python-docx-template', u'python-docx-template Documentation', - u'Eric Lapouyade', 'python-docx-template', 'One line description of project.', - 'Miscellaneous'), + ( + "index", + "python-docx-template", + "python-docx-template Documentation", + "Eric Lapouyade", + "python-docx-template", + "One line description of project.", + "Miscellaneous", + ), ] # Documents to append as an appendix to all manuals. diff --git a/docxtpl/__main__.py b/docxtpl/__main__.py index 6295641..59cf049 100644 --- a/docxtpl/__main__.py +++ b/docxtpl/__main__.py @@ -78,8 +78,8 @@ def check_exists_ask_overwrite(arg_value, overwrite): if os.path.exists(arg_value) and not overwrite: try: msg = ( - "File %s already exists, would you like to overwrite the existing file? (y/n)" - % arg_value + "File %s already exists, would you like to overwrite the existing file? " + "(y/n)" % arg_value ) if input(msg).lower() == "y": return True @@ -115,9 +115,8 @@ def get_json_data(json_path): return json_data except json.JSONDecodeError as e: print( - "There was an error on line {e.lineno}, column {e.colno} while trying to parse file {json_path}".format( - e=e, json_path=json_path - ) + "There was an error on line {e.lineno}, column {e.colno} while trying " + "to parse file {json_path}".format(e=e, json_path=json_path) ) raise RuntimeError("Failed to get json data.") diff --git a/docxtpl/template.py b/docxtpl/template.py index d24d691..95b4a2d 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -195,7 +195,8 @@ def cellbg(m): src_xml = re.sub(pat, r"\1 \2", src_xml, flags=re.DOTALL) # add vMerge - # use {% vm %} to make this table cell and its copies be vertically merged within a {% for %} + # use {% vm %} to make this table cell and its copies + # be vertically merged within a {% for %} def v_merge_tc(m): def v_merge(m1): return ( @@ -864,7 +865,8 @@ def _replace_docx_part_pics(self, doc_part, replaced_pics): replaced_pics[img_id] = True break - # FIXME: figure out what exceptions are thrown here and catch more specific exceptions + # FIXME: figure out what exceptions are thrown here + # and catch more specific exceptions except Exception: continue diff --git a/setup.py b/setup.py index bd889ae..495749d 100644 --- a/setup.py +++ b/setup.py @@ -10,13 +10,13 @@ def read(*names): values = dict() for name in names: - filename = name + '.rst' + filename = name + ".rst" if os.path.isfile(filename): fd = open(filename) value = fd.read() fd.close() else: - value = '' + value = "" values[name] = value return values @@ -27,13 +27,15 @@ def read(*names): News ==== %(CHANGES)s -""" % read('README', 'CHANGES') +""" % read( + "README", "CHANGES" +) def get_version(pkg): - path = os.path.join(os.path.dirname(__file__), pkg, '__init__.py') + path = os.path.join(os.path.dirname(__file__), pkg, "__init__.py") if sys.version_info >= (3, 0): - fh = open(path, encoding='utf-8') # required to read utf-8 file on windows + fh = open(path, encoding="utf-8") # required to read utf-8 file on windows else: fh = open(path) # encoding parameter does not exist in python 2 with fh: @@ -43,30 +45,29 @@ def get_version(pkg): raise RuntimeError("Unable to find __version__ string in %s." % path) -setup(name='docxtpl', - version=get_version('docxtpl'), - description='Python docx template engine', - long_description=long_description, - classifiers=[ - "Intended Audience :: Developers", - "Development Status :: 4 - Beta", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - ], - keywords='jinja2', - url='https://github.com/elapouya/python-docx-template', - author='Eric Lapouyade', - license='LGPL 2.1', - packages=['docxtpl'], - install_requires=['python-docx>=1.1.1', - 'docxcompose', - 'jinja2', - 'lxml'], - extras_require={'docs': ['Sphinx', 'sphinxcontrib-napoleon']}, - eager_resources=['docs'], - zip_safe=False) +setup( + name="docxtpl", + version=get_version("docxtpl"), + description="Python docx template engine", + long_description=long_description, + classifiers=[ + "Intended Audience :: Developers", + "Development Status :: 4 - Beta", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + ], + keywords="jinja2", + url="https://github.com/elapouya/python-docx-template", + author="Eric Lapouyade", + license="LGPL 2.1", + packages=["docxtpl"], + install_requires=["python-docx>=1.1.1", "docxcompose", "jinja2", "lxml"], + extras_require={"docs": ["Sphinx", "sphinxcontrib-napoleon"]}, + eager_resources=["docs"], + zip_safe=False, +) diff --git a/tests/footnotes.py b/tests/footnotes.py index c6ec59c..b15b93c 100644 --- a/tests/footnotes.py +++ b/tests/footnotes.py @@ -11,9 +11,7 @@ tpl = DocxTemplate("templates/footnotes_tpl.docx") -context = { - "a_jinja_variable": "A Jinja variable!" -} +context = {"a_jinja_variable": "A Jinja variable!"} tpl.render(context) tpl.save(DEST_FILE) diff --git a/tests/inline_image.py b/tests/inline_image.py index c07bf72..48ed670 100644 --- a/tests/inline_image.py +++ b/tests/inline_image.py @@ -25,19 +25,23 @@ }, { "image": InlineImage(tpl, "templates/zope.png", height=Mm(10)), - "desc": "Zope is a leading Open Source Application Server and Content Management Framework", + "desc": "Zope is a leading Open Source Application Server " + "and Content Management Framework", }, { "image": InlineImage(tpl, "templates/pyramid.png", height=Mm(10)), - "desc": "Pyramid is a lightweight Python web framework aimed at taking small web apps into big web apps.", + "desc": "Pyramid is a lightweight Python web framework aimed at taking " + "small web apps into big web apps.", }, { "image": InlineImage(tpl, "templates/bottle.png", height=Mm(10)), - "desc": "Bottle is a fast, simple and lightweight WSGI micro web-framework for Python", + "desc": "Bottle is a fast, simple and lightweight WSGI micro web-framework " + "for Python", }, { "image": InlineImage(tpl, "templates/tornado.png", height=Mm(10)), - "desc": "Tornado is a Python web framework and asynchronous networking library.", + "desc": "Tornado is a Python web framework and asynchronous networking " + "library.", }, ], } diff --git a/tests/richtextparagraph.py b/tests/richtextparagraph.py index e63f91c..5055837 100644 --- a/tests/richtextparagraph.py +++ b/tests/richtextparagraph.py @@ -11,21 +11,41 @@ rtp = RichTextParagraph() rt = RichText() -rtp.add("The rich text paragraph function allows paragraph styles to be added to text",parastyle="myrichparastyle") +rtp.add( + "The rich text paragraph function allows paragraph styles to be added to text", + parastyle="myrichparastyle", +) rtp.add("Any built in paragraph style can be used", parastyle="IntenseQuote") -rtp.add("or you can add your own, unlocking all style options", parastyle="createdStyle") -rtp.add("To use, just create a style in your template word doc with the formatting you want and call it in the code.", parastyle="normal") - -rtp.add("This allows for the use of") +rtp.add( + "or you can add your own, unlocking all style options", parastyle="createdStyle" +) +rtp.add( + "To use, just create a style in your template word doc with the formatting you want " + "and call it in the code.", + parastyle="normal", +) + +rtp.add("This allows for the use of") rtp.add("custom bullet\apoints", parastyle="SquareBullet") rtp.add("Numbered Bullet Points", parastyle="BasicNumbered") rtp.add("and Alpha Bullet Points.", parastyle="alphaBracketNumbering") rtp.add("You can", parastyle="normal") rtp.add("set the", parastyle="centerAlign") rtp.add("text alignment", parastyle="rightAlign") -rtp.add("as well as the spacing between lines of text. Like this for example, this text has very tight spacing between the lines.\aIt also has no space between paragraphs of the same style.", parastyle="TightLineSpacing") -rtp.add("Unlike this one, which has extra large spacing between lines for when you want to space things out a bit or just write a little less.", parastyle="WideLineSpacing") -rtp.add("You can also set the background colour of a line.", parastyle="LineShadingGreen") +rtp.add( + "as well as the spacing between lines of text. Like this for example, " + "this text has very tight spacing between the lines.\aIt also has no space between " + "paragraphs of the same style.", + parastyle="TightLineSpacing", +) +rtp.add( + "Unlike this one, which has extra large spacing between lines for when you want to " + "space things out a bit or just write a little less.", + parastyle="WideLineSpacing", +) +rtp.add( + "You can also set the background colour of a line.", parastyle="LineShadingGreen" +) rt.add("This works with ") rt.add("Rich ", bold=True) @@ -40,4 +60,4 @@ } tpl.render(context) -tpl.save("output/richtext_paragraph.docx") \ No newline at end of file +tpl.save("output/richtext_paragraph.docx") From fb0e3583da99123eb0c0a650e9557c911fe70418 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 6 May 2025 15:51:54 +0200 Subject: [PATCH 34/64] v0.20.0 --- CHANGES.rst | 6 ++++++ docs/index.rst | 2 +- docxtpl/__init__.py | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 81783d2..aa057ce 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,9 @@ +0.20.0 (2024-12-29) +------------------- +- Add RichTextParagraph (Thanks to ST-Imrie) +- Add RTL support for bold/italic (Thanks to bm-rana) +- Update documentation + 0.19.1 (2024-12-29) ------------------- - PR #575 : fix unicode in footnotes (Thanks to Jonathan Pyle) diff --git a/docs/index.rst b/docs/index.rst index a742d49..292218d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -304,7 +304,7 @@ calling method `new_subdoc()` :: tpl.save('output/merge_docx.docx') In the above example, the content of 'templates/merge_docx_subdoc.docx' will be inserted into the parent document in place of the declared -variable `{{ mysubdoc }}`. +variable `{{p mysubdoc }}`. See `tests/merge_docx.py` for full code. diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 0ec37f1..8adec23 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,7 +4,7 @@ @author: Eric Lapouyade """ -__version__ = "0.19.1" +__version__ = "0.20.0" # flake8: noqa from .inline_image import InlineImage From e766040c5bb2543868094b7acbe78872661bed86 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 6 May 2025 16:04:07 +0200 Subject: [PATCH 35/64] Add .readthedocs.yaml --- .readthedocs.yaml | 35 +++++++++++++++++++++++ requirements.txt => docs/requirements.txt | 0 2 files changed, 35 insertions(+) create mode 100644 .readthedocs.yaml rename requirements.txt => docs/requirements.txt (100%) diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..bff923c --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,35 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.12" + # You can also specify other tool versions: + # nodejs: "20" + # rust: "1.70" + # golang: "1.20" + +# Build documentation in the "docs/" directory with Sphinx +sphinx: + configuration: docs/conf.py + # You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs + # builder: "dirhtml" + # Fail on all warnings to avoid broken references + # fail_on_warning: true + +# Optionally build your docs in additional formats such as PDF and ePub +# formats: +# - pdf +# - epub + +# Optional but recommended, declare the Python requirements required +# to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: docs/requirements.txt diff --git a/requirements.txt b/docs/requirements.txt similarity index 100% rename from requirements.txt rename to docs/requirements.txt From b391b213ebe502c8c001e16456d7be75380b15f9 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 6 May 2025 16:17:56 +0200 Subject: [PATCH 36/64] update sphinx theme --- docs/conf.py | 6 +++--- docs/requirements.txt | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 7966501..5c412c9 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -50,9 +50,9 @@ # built documents. # # The short X.Y version. -version = "0.9" +version = "0.20" # The full version, including alpha/beta/rc tags. -release = "0.9.x" +release = "0.20.x" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -97,7 +97,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = "default" +html_theme = "sphinx_rtd_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the diff --git a/docs/requirements.txt b/docs/requirements.txt index f2bbd16..c29971d 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -2,3 +2,4 @@ python-docx docxcompose jinja2 lxml +sphinx-book-theme From 4477729a57dc54e00b89382f97d5563db134f2f4 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 6 May 2025 16:21:27 +0200 Subject: [PATCH 37/64] move requirements.txt --- .readthedocs.yaml | 2 +- docs/requirements.txt => requirements.txt | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/requirements.txt => requirements.txt (100%) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index bff923c..6861186 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -32,4 +32,4 @@ sphinx: # See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html python: install: - - requirements: docs/requirements.txt + - requirements: requirements.txt diff --git a/docs/requirements.txt b/requirements.txt similarity index 100% rename from docs/requirements.txt rename to requirements.txt From 399761f9c9c1fed8b1f1f30b37b5a1bf0063cb6a Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 6 May 2025 16:22:18 +0200 Subject: [PATCH 38/64] Update sphynx conf.py --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 5c412c9..9054a75 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -97,7 +97,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = "sphinx_rtd_theme" +html_theme = "sphinx_book_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the From 606d189787e3c073cb1e643a6e32e4ee8ff2fa08 Mon Sep 17 00:00:00 2001 From: Pablo Esteban Date: Fri, 11 Jul 2025 14:32:20 +0200 Subject: [PATCH 39/64] - The get_undeclared_template_variables method now analyzes the original template, regardless of whether it has been rendered. - Added optional context parameter to return only variables not present in the provided context. - Added test tests/get_undeclared_variables.py: - Verifies behavior before rendering (all variables) - Verifies after rendering with incomplete context (only missing variables) - Verifies after rendering with complete context (empty set) - Verifies compatibility with custom Jinja2 environment - All tests use asserts and are ready for CI integration. Closes #585 --- docs/index.rst | 4 +- docxtpl/template.py | 32 ++-- tests/get_undeclared_variables.py | 151 ++++++++++++++++++ tests/templates/get_undeclared_variables.docx | Bin 0 -> 18305 bytes 4 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 tests/get_undeclared_variables.py create mode 100644 tests/templates/get_undeclared_variables.docx diff --git a/docs/index.rst b/docs/index.rst index 292218d..c4bbec4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -406,9 +406,9 @@ In order to get the missing variables after rendering use :: tpl=DocxTemplate('your_template.docx') tpl.render(context_dict) - set_of_variables = tpl.get_undeclared_template_variables() + set_of_variables = tpl.get_undeclared_template_variables(context=context_dict) -**IMPORTANT** : You may use the method before rendering to get a set of keys you need, e.g. to be prompted to a user or written in a file for manual processing. +**IMPORTANT** : If `context` is not passed, you will get a set with all keys you need, e.g. to be prompted to a user or written in a file for manual processing. Multiple rendering ------------------ diff --git a/docxtpl/template.py b/docxtpl/template.py index 95b4a2d..2e12d53 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -887,20 +887,34 @@ def save(self, filename: Union[IO[bytes], str, PathLike], *args, **kwargs) -> No self.is_saved = True def get_undeclared_template_variables( - self, jinja_env: Optional[Environment] = None + self, jinja_env: Optional[Environment] = None, context: Optional[Dict[str, Any]] = None ) -> Set[str]: - self.init_docx(reload=False) - xml = self.get_xml() + # Create a temporary document to analyze the template without affecting the current state + temp_doc = Document(self.template_file) + + # Get XML from the temporary document + xml = self.xml_to_string(temp_doc._element.body) xml = self.patch_xml(xml) + + # Add headers and footers for uri in [self.HEADER_URI, self.FOOTER_URI]: - for relKey, part in self.get_headers_footers(uri): - _xml = self.get_part_xml(part) - xml += self.patch_xml(_xml) + for relKey, val in temp_doc._part.rels.items(): + if (val.reltype == uri) and (val.target_part.blob): + _xml = self.xml_to_string(parse_xml(val.target_part.blob)) + xml += self.patch_xml(_xml) + if jinja_env: env = jinja_env else: env = Environment() + parse_content = env.parse(xml) - return meta.find_undeclared_variables(parse_content) - - undeclared_template_variables = property(get_undeclared_template_variables) + all_variables = meta.find_undeclared_variables(parse_content) + + # If context is provided, return only variables that are not in the context + if context is not None: + provided_variables = set(context.keys()) + return all_variables - provided_variables + + # If no context provided, return all variables (original behavior) + return all_variables \ No newline at end of file diff --git a/tests/get_undeclared_variables.py b/tests/get_undeclared_variables.py new file mode 100644 index 0000000..9f165c2 --- /dev/null +++ b/tests/get_undeclared_variables.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Test for get_undeclared_template_variables method + +This test demonstrates the correct behavior of get_undeclared_template_variables: +1. Before rendering - finds all template variables +2. After rendering with incomplete context - finds missing variables +3. After rendering with complete context - returns empty set +""" + +from docxtpl import DocxTemplate + +def test_before_render(): + """Test that get_undeclared_template_variables finds all variables before rendering""" + print("=== Test 1: Before render ===") + tpl = DocxTemplate('templates/get_undeclared_variables.docx') + undeclared = tpl.get_undeclared_template_variables() + print(f"Variables found: {undeclared}") + + # Should find all variables + expected_vars = { + 'name', 'age', 'email', 'is_student', 'has_degree', 'degree_field', + 'skills', 'projects', 'company_name', 'page_number', 'generation_date', 'author' + } + + if undeclared == expected_vars: + print("PASS: Found all expected variables before render") + else: + print(f"FAIL: Expected {expected_vars}, got {undeclared}") + + return undeclared == expected_vars + +def test_after_incomplete_render(): + """Test that get_undeclared_template_variables finds missing variables after incomplete render""" + print("\n=== Test 2: After incomplete render ===") + tpl = DocxTemplate('templates/get_undeclared_variables.docx') + + # Provide only some variables (missing several) + context = { + 'name': 'John Doe', + 'age': 25, + 'email': 'john@example.com', + 'is_student': True, + 'skills': ['Python', 'Django'], + 'company_name': 'Test Corp', + 'author': 'Test Author' + } + + tpl.render(context) + undeclared = tpl.get_undeclared_template_variables(context=context) + print(f"Missing variables: {undeclared}") + + # Should find missing variables + expected_missing = { + 'has_degree', 'degree_field', 'projects', 'page_number', 'generation_date' + } + + if undeclared == expected_missing: + print("PASS: Found missing variables after incomplete render") + else: + print(f"FAIL: Expected missing {expected_missing}, got {undeclared}") + + return undeclared == expected_missing + +def test_after_complete_render(): + """Test that get_undeclared_template_variables returns empty set after complete render""" + print("\n=== Test 3: After complete render ===") + tpl = DocxTemplate('templates/get_undeclared_variables.docx') + + # Provide all variables + context = { + 'name': 'John Doe', + 'age': 25, + 'email': 'john@example.com', + 'is_student': True, + 'has_degree': True, + 'degree_field': 'Computer Science', + 'skills': ['Python', 'Django', 'JavaScript'], + 'projects': [ + {'name': 'Project A', 'year': 2023, 'description': 'A great project'}, + {'name': 'Project B', 'year': 2024, 'description': 'Another great project'} + ], + 'company_name': 'Test Corp', + 'page_number': 1, + 'generation_date': '2024-01-15', + 'author': 'Test Author' + } + + tpl.render(context) + undeclared = tpl.get_undeclared_template_variables(context=context) + print(f"Undeclared variables: {undeclared}") + + # Should return empty set + if undeclared == set(): + print("PASS: No undeclared variables after complete render") + else: + print(f"FAIL: Expected empty set, got {undeclared}") + + return undeclared == set() + +def test_with_custom_jinja_env(): + """Test that get_undeclared_template_variables works with custom Jinja environment""" + print("\n=== Test 4: With custom Jinja environment ===") + from jinja2 import Environment + + tpl = DocxTemplate('templates/get_undeclared_variables.docx') + custom_env = Environment() + + undeclared = tpl.get_undeclared_template_variables(jinja_env=custom_env) + print(f"Variables found with custom env: {undeclared}") + + # Should find all variables + expected_vars = { + 'name', 'age', 'email', 'is_student', 'has_degree', 'degree_field', + 'skills', 'projects', 'company_name', 'page_number', 'generation_date', 'author' + } + + if undeclared == expected_vars: + print("PASS: Custom Jinja environment works correctly") + else: + print(f"FAIL: Expected {expected_vars}, got {undeclared}") + + return undeclared == expected_vars + +if __name__ == "__main__": + print("Testing get_undeclared_template_variables method...") + print("=" * 50) + + # Run all tests + test1_passed = test_before_render() + test2_passed = test_after_incomplete_render() + test3_passed = test_after_complete_render() + test4_passed = test_with_custom_jinja_env() + + print("\n" + "=" * 50) + print("SUMMARY:") + print(f"Test 1 (Before render): {'PASS' if test1_passed else 'FAIL'}") + print(f"Test 2 (After incomplete render): {'PASS' if test2_passed else 'FAIL'}") + print(f"Test 3 (After complete render): {'PASS' if test3_passed else 'FAIL'}") + print(f"Test 4 (Custom Jinja env): {'PASS' if test4_passed else 'FAIL'}") + + all_passed = test1_passed and test2_passed and test3_passed and test4_passed + + if all_passed: + print("ALL TESTS PASSED!") + else: + print("SOME TESTS FAILED!") + + print("\nNote: This test demonstrates that get_undeclared_template_variables") + print("now correctly analyzes the original template, not the rendered document.") \ No newline at end of file diff --git a/tests/templates/get_undeclared_variables.docx b/tests/templates/get_undeclared_variables.docx new file mode 100644 index 0000000000000000000000000000000000000000..e112a90deba19eca57d2caeecea1c0dece36d0ad GIT binary patch literal 18305 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 Date: Tue, 15 Jul 2025 15:39:11 +0200 Subject: [PATCH 40/64] Fix and improve get_undeclared_template_variables() method --- CHANGES.rst | 4 + docxtpl/__init__.py | 2 +- poetry.lock | 788 +++++++++++++++++++++++++++++- pyproject.toml | 1 + tests/get_undeclared_variables.py | 135 +++-- 5 files changed, 871 insertions(+), 59 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index aa057ce..54fe0f3 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,7 @@ +0.20.1 (2025-07-15) +------------------- +- Fix and improve get_undeclared_template_variables() method (Thanks to Pablo Esteban) + 0.20.0 (2024-12-29) ------------------- - Add RichTextParagraph (Thanks to ST-Imrie) diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 8adec23..756cb47 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,7 +4,7 @@ @author: Eric Lapouyade """ -__version__ = "0.20.0" +__version__ = "0.20.1" # flake8: noqa from .inline_image import InlineImage diff --git a/poetry.lock b/poetry.lock index 999d53b..8769f56 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. [[package]] name = "babel" @@ -6,6 +6,7 @@ version = "2.15.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, @@ -14,12 +15,30 @@ files = [ [package.extras] dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] +[[package]] +name = "backports-tarfile" +version = "1.2.0" +description = "Backport of CPython tarfile module" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version == \"3.11\"" +files = [ + {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, + {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"] + [[package]] name = "black" version = "24.4.2" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, @@ -54,16 +73,212 @@ platformdirs = ">=2" [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] +d = ["aiohttp (>=3.7.4) ; sys_platform != \"win32\" or implementation_name != \"pypy\"", "aiohttp (>=3.7.4,!=3.9.0) ; sys_platform == \"win32\" and implementation_name == \"pypy\""] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "certifi" +version = "2025.7.14" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2"}, + {file = "certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.4.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, + {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, + {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, +] + [[package]] name = "click" version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, @@ -78,17 +293,93 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "platform_system == \"Windows\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "cryptography" +version = "45.0.5" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\"" +files = [ + {file = "cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9"}, + {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27"}, + {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e"}, + {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174"}, + {file = "cryptography-45.0.5-cp311-abi3-win32.whl", hash = "sha256:926c3ea71a6043921050eaa639137e13dbe7b4ab25800932a8498364fc1abec9"}, + {file = "cryptography-45.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:b85980d1e345fe769cfc57c57db2b59cff5464ee0c045d52c0df087e926fbe63"}, + {file = "cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42"}, + {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492"}, + {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0"}, + {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a"}, + {file = "cryptography-45.0.5-cp37-abi3-win32.whl", hash = "sha256:1e1da5accc0c750056c556a93c3e9cb828970206c68867712ca5805e46dc806f"}, + {file = "cryptography-45.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:90cb0a7bb35959f37e23303b7eed0a32280510030daba3f7fdfbb65defde6a97"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:206210d03c1193f4e1ff681d22885181d47efa1ab3018766a7b32a7b3d6e6afd"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c648025b6840fe62e57107e0a25f604db740e728bd67da4f6f060f03017d5097"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b8fa8b0a35a9982a3c60ec79905ba5bb090fc0b9addcfd3dc2dd04267e45f25e"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:14d96584701a887763384f3c47f0ca7c1cce322aa1c31172680eb596b890ec30"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57c816dfbd1659a367831baca4b775b2a5b43c003daf52e9d57e1d30bc2e1b0e"}, + {file = "cryptography-45.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b9e38e0a83cd51e07f5a48ff9691cae95a79bea28fe4ded168a8e5c6c77e819d"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8c4a6ff8a30e9e3d38ac0539e9a9e02540ab3f827a3394f8852432f6b0ea152e"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bd4c45986472694e5121084c6ebbd112aa919a25e783b87eb95953c9573906d6"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:982518cd64c54fcada9d7e5cf28eabd3ee76bd03ab18e08a48cad7e8b6f31b18"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:12e55281d993a793b0e883066f590c1ae1e802e3acb67f8b442e721e475e6463"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:5aa1e32983d4443e310f726ee4b071ab7569f58eedfdd65e9675484a4eb67bd1"}, + {file = "cryptography-45.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e357286c1b76403dd384d938f93c46b2b058ed4dfcdce64a770f0537ed3feb6f"}, + {file = "cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a"}, +] + +[package.dependencies] +cffi = {version = ">=1.14", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs ; python_full_version >= \"3.8.0\"", "sphinx-rtd-theme (>=3.0.0) ; python_full_version >= \"3.8.0\""] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_full_version >= \"3.8.0\""] +pep8test = ["check-sdist ; python_full_version >= \"3.8.0\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi (>=2024)", "cryptography-vectors (==45.0.5)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "docutils" +version = "0.21.2" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, +] + [[package]] name = "docxcompose" version = "1.4.0" description = "Compose .docx documents" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "docxcompose-1.4.0.tar.gz", hash = "sha256:bcf2799a0b63c29eb77a3d799a2f28443ae0f69f8691ff3d753f706be515c3e9"}, ] @@ -110,6 +401,7 @@ version = "7.1.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" +groups = ["dev"] files = [ {file = "flake8-7.1.0-py2.py3-none-any.whl", hash = "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a"}, {file = "flake8-7.1.0.tar.gz", hash = "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5"}, @@ -120,12 +412,154 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.12.0,<2.13.0" pyflakes = ">=3.2.0,<3.3.0" +[[package]] +name = "id" +version = "1.5.0" +description = "A tool for generating OIDC identities" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "id-1.5.0-py3-none-any.whl", hash = "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658"}, + {file = "id-1.5.0.tar.gz", hash = "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d"}, +] + +[package.dependencies] +requests = "*" + +[package.extras] +dev = ["build", "bump (>=1.3.2)", "id[lint,test]"] +lint = ["bandit", "interrogate", "mypy", "ruff (<0.8.2)", "types-requests"] +test = ["coverage[toml]", "pretend", "pytest", "pytest-cov"] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "importlib-metadata" +version = "8.7.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version == \"3.11\"" +files = [ + {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, + {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, +] + +[package.dependencies] +zipp = ">=3.20" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +description = "Utility functions for Python class constructs" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +files = [ + {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, + {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "jaraco-context" +version = "6.0.1" +description = "Useful decorators and context managers" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +files = [ + {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, + {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, +] + +[package.dependencies] +"backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] + +[[package]] +name = "jaraco-functools" +version = "4.2.1" +description = "Functools like those found in stdlib" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +files = [ + {file = "jaraco_functools-4.2.1-py3-none-any.whl", hash = "sha256:590486285803805f4b1f99c60ca9e94ed348d4added84b74c7a12885561e524e"}, + {file = "jaraco_functools-4.2.1.tar.gz", hash = "sha256:be634abfccabce56fa3053f8c7ebe37b682683a4ee7793670ced17bab0087353"}, +] + +[package.dependencies] +more_itertools = "*" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.classes", "pytest (>=6,!=8.1.*)"] +type = ["pytest-mypy"] + +[[package]] +name = "jeepney" +version = "0.9.0" +description = "Low-level, pure Python DBus protocol wrapper." +optional = false +python-versions = ">=3.7" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\"" +files = [ + {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, + {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, +] + +[package.extras] +test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["trio"] + [[package]] name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, @@ -137,12 +571,44 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "keyring" +version = "25.6.0" +description = "Store and access your passwords safely." +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +files = [ + {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, + {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, +] + +[package.dependencies] +importlib_metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} +"jaraco.classes" = "*" +"jaraco.context" = "*" +"jaraco.functools" = "*" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +completion = ["shtab (>=1.1.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["pyfakefs", "pytest (>=6,!=8.1.*)"] +type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"] + [[package]] name = "lxml" version = "5.2.2" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, @@ -295,12 +761,38 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=3.0.10)"] +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + [[package]] name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, @@ -370,28 +862,92 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "more-itertools" +version = "10.7.0" +description = "More routines for operating on iterables, beyond itertools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +files = [ + {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, + {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, +] + [[package]] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "nh3" +version = "0.2.22" +description = "Python binding to Ammonia HTML sanitizer Rust crate" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "nh3-0.2.22-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4743c9132e2ccf2109af88ce16074c5a7068df85be8f7b9840dbe683e50b9461"}, + {file = "nh3-0.2.22-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca015dbd477e20a29bee8660a966523c677da0c34dfeb474c6acb64462fbfc15"}, + {file = "nh3-0.2.22-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d10f4c195f3b84a8127417ec940e1393062a3e2f05d405270dde7846854e22c"}, + {file = "nh3-0.2.22-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9bbeb3d253c1026a46e7b23bc2698fe1f00641b5a7bdad8e4c8937daaa1f2b51"}, + {file = "nh3-0.2.22-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:b71ea8e987923e2976a99e4bb17e39cc186c93a330712075650e6143cb2fa89b"}, + {file = "nh3-0.2.22-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:56b328457370401aaf2039a5039d7f587e72b2c08bc95dfe807ad96ae98e83e4"}, + {file = "nh3-0.2.22-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e9762845ee47372df425b52ec4a133e994dbbedf95ad61eea4bfe6cb4d1401b4"}, + {file = "nh3-0.2.22-cp313-cp313t-win32.whl", hash = "sha256:c61fbfe4131ceff1c83ed0663c39aebb72bd26c6b22157b14da0b43287ea15ed"}, + {file = "nh3-0.2.22-cp313-cp313t-win_amd64.whl", hash = "sha256:4f47991a9819f644918aebc2a93d175562c7c0c2ec41cbc525fbdbf676793c03"}, + {file = "nh3-0.2.22-cp313-cp313t-win_arm64.whl", hash = "sha256:29baf3c22d6e9d26325128600355baeddb52eecd6206780621f84537ad4db966"}, + {file = "nh3-0.2.22-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2a6e33de39218eded7187aaf05aea71884b1b8002d50d080a95df734d3ad3a44"}, + {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb91663dcf139da2009d452aad23094e01579c45a6101b2a0b0c28181b8c496f"}, + {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f45f8a2347da8c9682f9b015cf9d492fdb8440cfb7bd523cceda1a705fd5a4bd"}, + {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f94ed44f433e2f8799f5285000f799e9f3ca66559328e40066c0f96c4fbad346"}, + {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74039dfd41107bbb298fe814c4be5c39d66124855ff549d216e4947a69d3d9a1"}, + {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:60e1d4429762745a5a346277dc3378aade0e24632f75077f0da3bfc29bf385fd"}, + {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e9e93c67d1ec8db6d96e323832bd267cdfe94bdb8cc6adc88cbc0908ff59329"}, + {file = "nh3-0.2.22-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f186eea285ebf941fbaaecd1cd445e9506552a15435140ca73ca029334715da"}, + {file = "nh3-0.2.22-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:87e532f885937c460ccbdc1b5ea03b0e420de8ef12dd5857621706298857b9aa"}, + {file = "nh3-0.2.22-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fee209eb0d93830908e4f6fc549c08766def701f5681de2779637a00d48f288f"}, + {file = "nh3-0.2.22-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:10e8d0a833431860620f7f1434792607ca12cdfda81450a2678b8d69642eda69"}, + {file = "nh3-0.2.22-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:adbb35826fad998f88f68b969e3936dff53b70052c9e6e951ef9e49db9590611"}, + {file = "nh3-0.2.22-cp38-abi3-win32.whl", hash = "sha256:bcac2a186791c422ce55522cae332c8fa2135795b7b510e2475cb95a44f7b0ce"}, + {file = "nh3-0.2.22-cp38-abi3-win_amd64.whl", hash = "sha256:a78a13f5bf5901f5de50580a74058a10734d3e836144cb090f0304ec5deb3df7"}, + {file = "nh3-0.2.22-cp38-abi3-win_arm64.whl", hash = "sha256:602ad5229c81a287c8632ea1bf2d6b3654b3e208b57b0bcab5beec93ff91866f"}, + {file = "nh3-0.2.22.tar.gz", hash = "sha256:dbfaa924ba226331c75896a64fe161a0cbd21172e4da687b2a69b5101db2c3e9"}, +] + [[package]] name = "packaging" version = "24.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, @@ -403,6 +959,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -414,6 +971,7 @@ version = "4.2.2" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, @@ -430,28 +988,59 @@ version = "2.12.0" description = "Python style guide checker" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pycodestyle-2.12.0-py2.py3-none-any.whl", hash = "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4"}, {file = "pycodestyle-2.12.0.tar.gz", hash = "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c"}, ] +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + [[package]] name = "pyflakes" version = "3.2.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, ] +[[package]] +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "python-docx" version = "1.1.2" description = "Create, read, and update Microsoft Word .docx files." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"}, {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"}, @@ -461,12 +1050,134 @@ files = [ lxml = ">=3.1.0" typing-extensions = ">=4.9.0" +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +optional = false +python-versions = ">=3.6" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"win32\"" +files = [ + {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, + {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, +] + +[[package]] +name = "readme-renderer" +version = "44.0" +description = "readme_renderer is a library for rendering readme descriptions for Warehouse" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, + {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, +] + +[package.dependencies] +docutils = ">=0.21.2" +nh3 = ">=0.2.14" +Pygments = ">=2.5.1" + +[package.extras] +md = ["cmarkgfm (>=0.8.0)"] + +[[package]] +name = "requests" +version = "2.32.4" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "rfc3986" +version = "2.0.0" +description = "Validating URI References per RFC 3986" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, + {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, +] + +[package.extras] +idna2008 = ["idna"] + +[[package]] +name = "rich" +version = "14.0.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, + {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +optional = false +python-versions = ">=3.6" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\"" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + [[package]] name = "setuptools" version = "71.0.4" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "setuptools-71.0.4-py3-none-any.whl", hash = "sha256:ed2feca703be3bdbd94e6bb17365d91c6935c6b2a8d0bb09b66a2c435ba0b1a5"}, {file = "setuptools-71.0.4.tar.gz", hash = "sha256:48297e5d393a62b7cb2a10b8f76c63a73af933bd809c9e0d0d6352a1a0135dd8"}, @@ -475,7 +1186,7 @@ files = [ [package.extras] core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-ruff (<0.4) ; platform_system == \"Windows\"", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "pytest-ruff (>=0.3.2) ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -483,23 +1194,90 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] +[[package]] +name = "twine" +version = "6.1.0" +description = "Collection of utilities for publishing packages on PyPI" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "twine-6.1.0-py3-none-any.whl", hash = "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384"}, + {file = "twine-6.1.0.tar.gz", hash = "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd"}, +] + +[package.dependencies] +id = "*" +keyring = {version = ">=15.1", markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\""} +packaging = ">=24.0" +readme-renderer = ">=35.0" +requests = ">=2.20" +requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" +rfc3986 = ">=1.4.0" +rich = ">=12.0.0" +urllib3 = ">=1.26.0" + +[package.extras] +keyring = ["keyring (>=15.1)"] + [[package]] name = "typing-extensions" version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "urllib3" +version = "2.5.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "zipp" +version = "3.23.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version == \"3.11\"" +files = [ + {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, + {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] + [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.11" -content-hash = "77f21c2a463fb31b565180c907e29738afd2f0df60e6418ef73f05bec0a4f015" +content-hash = "06a815c1c06815ec7296fb3ae1cb092a1d6343e85648e02c45a33a9a2ce17b18" diff --git a/pyproject.toml b/pyproject.toml index e64cb65..9354d95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ python-docx = "^1.1.2" docxcompose = "^1.4.0" jinja2 = "^3.1.4" black = "^24.4.2" +twine = "^6.1.0" [tool.poetry.group.dev.dependencies] diff --git a/tests/get_undeclared_variables.py b/tests/get_undeclared_variables.py index 9f165c2..1e6a929 100644 --- a/tests/get_undeclared_variables.py +++ b/tests/get_undeclared_variables.py @@ -11,141 +11,170 @@ from docxtpl import DocxTemplate + def test_before_render(): """Test that get_undeclared_template_variables finds all variables before rendering""" print("=== Test 1: Before render ===") - tpl = DocxTemplate('templates/get_undeclared_variables.docx') + tpl = DocxTemplate("templates/get_undeclared_variables.docx") undeclared = tpl.get_undeclared_template_variables() print(f"Variables found: {undeclared}") - + # Should find all variables expected_vars = { - 'name', 'age', 'email', 'is_student', 'has_degree', 'degree_field', - 'skills', 'projects', 'company_name', 'page_number', 'generation_date', 'author' + "name", + "age", + "email", + "is_student", + "has_degree", + "degree_field", + "skills", + "projects", + "company_name", + "page_number", + "generation_date", + "author", } - + if undeclared == expected_vars: print("PASS: Found all expected variables before render") else: print(f"FAIL: Expected {expected_vars}, got {undeclared}") - + return undeclared == expected_vars + def test_after_incomplete_render(): """Test that get_undeclared_template_variables finds missing variables after incomplete render""" print("\n=== Test 2: After incomplete render ===") - tpl = DocxTemplate('templates/get_undeclared_variables.docx') - + tpl = DocxTemplate("templates/get_undeclared_variables.docx") + # Provide only some variables (missing several) context = { - 'name': 'John Doe', - 'age': 25, - 'email': 'john@example.com', - 'is_student': True, - 'skills': ['Python', 'Django'], - 'company_name': 'Test Corp', - 'author': 'Test Author' + "name": "John Doe", + "age": 25, + "email": "john@example.com", + "is_student": True, + "skills": ["Python", "Django"], + "company_name": "Test Corp", + "author": "Test Author", } - + tpl.render(context) undeclared = tpl.get_undeclared_template_variables(context=context) print(f"Missing variables: {undeclared}") - + # Should find missing variables expected_missing = { - 'has_degree', 'degree_field', 'projects', 'page_number', 'generation_date' + "has_degree", + "degree_field", + "projects", + "page_number", + "generation_date", } - + if undeclared == expected_missing: print("PASS: Found missing variables after incomplete render") else: print(f"FAIL: Expected missing {expected_missing}, got {undeclared}") - + return undeclared == expected_missing + def test_after_complete_render(): """Test that get_undeclared_template_variables returns empty set after complete render""" print("\n=== Test 3: After complete render ===") - tpl = DocxTemplate('templates/get_undeclared_variables.docx') - + tpl = DocxTemplate("templates/get_undeclared_variables.docx") + # Provide all variables context = { - 'name': 'John Doe', - 'age': 25, - 'email': 'john@example.com', - 'is_student': True, - 'has_degree': True, - 'degree_field': 'Computer Science', - 'skills': ['Python', 'Django', 'JavaScript'], - 'projects': [ - {'name': 'Project A', 'year': 2023, 'description': 'A great project'}, - {'name': 'Project B', 'year': 2024, 'description': 'Another great project'} + "name": "John Doe", + "age": 25, + "email": "john@example.com", + "is_student": True, + "has_degree": True, + "degree_field": "Computer Science", + "skills": ["Python", "Django", "JavaScript"], + "projects": [ + {"name": "Project A", "year": 2023, "description": "A great project"}, + {"name": "Project B", "year": 2024, "description": "Another great project"}, ], - 'company_name': 'Test Corp', - 'page_number': 1, - 'generation_date': '2024-01-15', - 'author': 'Test Author' + "company_name": "Test Corp", + "page_number": 1, + "generation_date": "2024-01-15", + "author": "Test Author", } - + tpl.render(context) undeclared = tpl.get_undeclared_template_variables(context=context) print(f"Undeclared variables: {undeclared}") - + # Should return empty set if undeclared == set(): print("PASS: No undeclared variables after complete render") else: print(f"FAIL: Expected empty set, got {undeclared}") - + return undeclared == set() + def test_with_custom_jinja_env(): """Test that get_undeclared_template_variables works with custom Jinja environment""" print("\n=== Test 4: With custom Jinja environment ===") from jinja2 import Environment - - tpl = DocxTemplate('templates/get_undeclared_variables.docx') + + tpl = DocxTemplate("templates/get_undeclared_variables.docx") custom_env = Environment() - + undeclared = tpl.get_undeclared_template_variables(jinja_env=custom_env) print(f"Variables found with custom env: {undeclared}") - + # Should find all variables expected_vars = { - 'name', 'age', 'email', 'is_student', 'has_degree', 'degree_field', - 'skills', 'projects', 'company_name', 'page_number', 'generation_date', 'author' + "name", + "age", + "email", + "is_student", + "has_degree", + "degree_field", + "skills", + "projects", + "company_name", + "page_number", + "generation_date", + "author", } - + if undeclared == expected_vars: print("PASS: Custom Jinja environment works correctly") else: print(f"FAIL: Expected {expected_vars}, got {undeclared}") - + return undeclared == expected_vars + if __name__ == "__main__": print("Testing get_undeclared_template_variables method...") print("=" * 50) - + # Run all tests test1_passed = test_before_render() test2_passed = test_after_incomplete_render() test3_passed = test_after_complete_render() test4_passed = test_with_custom_jinja_env() - + print("\n" + "=" * 50) print("SUMMARY:") print(f"Test 1 (Before render): {'PASS' if test1_passed else 'FAIL'}") print(f"Test 2 (After incomplete render): {'PASS' if test2_passed else 'FAIL'}") print(f"Test 3 (After complete render): {'PASS' if test3_passed else 'FAIL'}") print(f"Test 4 (Custom Jinja env): {'PASS' if test4_passed else 'FAIL'}") - + all_passed = test1_passed and test2_passed and test3_passed and test4_passed - + if all_passed: print("ALL TESTS PASSED!") else: print("SOME TESTS FAILED!") - + print("\nNote: This test demonstrates that get_undeclared_template_variables") - print("now correctly analyzes the original template, not the rendered document.") \ No newline at end of file + print("now correctly analyzes the original template, not the rendered document.") From 416729dddc9a362d6747630e292001ecc26b4cec Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 15 Jul 2025 15:46:03 +0200 Subject: [PATCH 41/64] Run black on template.py --- docxtpl/template.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index 2e12d53..7613a2f 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -887,34 +887,36 @@ def save(self, filename: Union[IO[bytes], str, PathLike], *args, **kwargs) -> No self.is_saved = True def get_undeclared_template_variables( - self, jinja_env: Optional[Environment] = None, context: Optional[Dict[str, Any]] = None + self, + jinja_env: Optional[Environment] = None, + context: Optional[Dict[str, Any]] = None, ) -> Set[str]: # Create a temporary document to analyze the template without affecting the current state temp_doc = Document(self.template_file) - + # Get XML from the temporary document xml = self.xml_to_string(temp_doc._element.body) xml = self.patch_xml(xml) - + # Add headers and footers for uri in [self.HEADER_URI, self.FOOTER_URI]: for relKey, val in temp_doc._part.rels.items(): if (val.reltype == uri) and (val.target_part.blob): _xml = self.xml_to_string(parse_xml(val.target_part.blob)) xml += self.patch_xml(_xml) - + if jinja_env: env = jinja_env else: env = Environment() - + parse_content = env.parse(xml) all_variables = meta.find_undeclared_variables(parse_content) - + # If context is provided, return only variables that are not in the context if context is not None: provided_variables = set(context.keys()) return all_variables - provided_variables - + # If no context provided, return all variables (original behavior) - return all_variables \ No newline at end of file + return all_variables From d9bb19cdd48bc71f0f47c5d4a4736bcf53eb53a3 Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Tue, 15 Jul 2025 17:15:05 +0200 Subject: [PATCH 42/64] Update setup.py --- setup.cfg | 2 -- setup.py | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 setup.cfg diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 7c2b287..0000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[bdist_wheel] -universal = 1 \ No newline at end of file diff --git a/setup.py b/setup.py index 495749d..86da0d9 100644 --- a/setup.py +++ b/setup.py @@ -50,6 +50,7 @@ def get_version(pkg): version=get_version("docxtpl"), description="Python docx template engine", long_description=long_description, + long_description_content_type="text/x-rst", classifiers=[ "Intended Audience :: Developers", "Development Status :: 4 - Beta", @@ -64,7 +65,8 @@ def get_version(pkg): keywords="jinja2", url="https://github.com/elapouya/python-docx-template", author="Eric Lapouyade", - license="LGPL 2.1", + license="LGPL-2.1-only", + license_files=[], packages=["docxtpl"], install_requires=["python-docx>=1.1.1", "docxcompose", "jinja2", "lxml"], extras_require={"docs": ["Sphinx", "sphinxcontrib-napoleon"]}, From 9d31cea2eeda30eb043cde879bc52a024e2378b7 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Fri, 19 Sep 2025 09:46:55 +0800 Subject: [PATCH 43/64] docs: update readme (add dependency links) --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 6b1807f..85d3489 100644 --- a/README.rst +++ b/README.rst @@ -9,8 +9,8 @@ Introduction This package uses 2 major packages : -- python-docx for reading, writing and creating sub documents -- jinja2 for managing tags inserted into the template docx +- [python-docx](https://github.com/python-openxml/python-docx) for reading, writing and creating sub documents +- [jinja2](https://github.com/pallets/jinja) for managing tags inserted into the template docx python-docx-template has been created because python-docx is powerful for creating documents but not for modifying them. From 6e019611c398db769cb5ace12d3bf62e151f2716 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Fri, 19 Sep 2025 19:38:42 +0800 Subject: [PATCH 44/64] Update README.rst --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 85d3489..ad0ce47 100644 --- a/README.rst +++ b/README.rst @@ -9,8 +9,8 @@ Introduction This package uses 2 major packages : -- [python-docx](https://github.com/python-openxml/python-docx) for reading, writing and creating sub documents -- [jinja2](https://github.com/pallets/jinja) for managing tags inserted into the template docx +- `python-docx `_ for reading, writing and creating sub documents +- `jinja2 `_ for managing tags inserted into the template docx python-docx-template has been created because python-docx is powerful for creating documents but not for modifying them. From 7a6ddbcc5420ccb5418557e43cab2e497fde33d1 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Tue, 23 Sep 2025 18:25:51 +0800 Subject: [PATCH 45/64] Move docxcompose to optional dependency --- .github/workflows/codestyle.yml | 4 ++-- CHANGES.rst | 4 ++++ docs/index.rst | 2 ++ docxtpl/__init__.py | 6 +++++- docxtpl/template.py | 10 +++++++--- setup.py | 8 +++++--- 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/.github/workflows/codestyle.yml b/.github/workflows/codestyle.yml index 1819e22..36e81d3 100644 --- a/.github/workflows/codestyle.yml +++ b/.github/workflows/codestyle.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.9', '3.10', '3.11','3.12','3.13'] + python-version: ['3.9', '3.10', '3.11', '3.12', '3.13'] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} @@ -22,4 +22,4 @@ jobs: run: | pip install flake8 # stop the build if there are code styling problems. The GitHub editor is 127 chars wide. - flake8 . --count --max-line-length=127 --show-source --statistics \ No newline at end of file + flake8 . --count --max-line-length=127 --show-source --statistics diff --git a/CHANGES.rst b/CHANGES.rst index 54fe0f3..eee78f1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,7 @@ +0.20.2 *(Unreleased)* +------------------- +- Move docxcompose to optional dependency (Thanks to Waket Zheng) + 0.20.1 (2025-07-15) ------------------- - Fix and improve get_undeclared_template_variables() method (Thanks to Pablo Esteban) diff --git a/docs/index.rst b/docs/index.rst index c4bbec4..46cf69f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -286,6 +286,8 @@ Please see tests/inline_image.py for an example. Sub-documents ------------- +> Need to install with the subdoc extra: `pip install "docxtpl[subdoc]"` + A template variable can contain a complex subdoc object and be built from scratch using python-docx document methods. To do so, first, get the sub-document object from your template object, then use it by treating it as a python-docx document object. See example in `tests/subdoc.py`. diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 756cb47..b3acd11 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -4,11 +4,15 @@ @author: Eric Lapouyade """ + __version__ = "0.20.1" # flake8: noqa from .inline_image import InlineImage from .listing import Listing from .richtext import RichText, R, RichTextParagraph, RP -from .subdoc import Subdoc from .template import DocxTemplate +try: + from .subdoc import Subdoc +except ImportError: + pass diff --git a/docxtpl/template.py b/docxtpl/template.py index 7613a2f..2738845 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -6,8 +6,7 @@ """ from os import PathLike -from typing import Any, Optional, IO, Union, Dict, Set -from .subdoc import Subdoc +from typing import TYPE_CHECKING, Any, Optional, IO, Union, Dict, Set import functools import io from lxml import etree @@ -29,6 +28,9 @@ import os import zipfile +if TYPE_CHECKING: + from .subdoc import Subdoc + class DocxTemplate(object): """Class for managing docx files as they were jinja2 templates""" @@ -610,7 +612,9 @@ def fix_docpr_ids(self, tree): self.docx_ids_index += 1 elt.attrib["id"] = str(self.docx_ids_index) - def new_subdoc(self, docpath=None): + def new_subdoc(self, docpath=None) -> Subdoc: + from .subdoc import Subdoc + self.init_docx() return Subdoc(self, docpath) diff --git a/setup.py b/setup.py index 86da0d9..b0dfe57 100644 --- a/setup.py +++ b/setup.py @@ -1,8 +1,9 @@ -from setuptools import setup import os import re import sys +from setuptools import setup + # To register onto Pypi : # python setup.py sdist bdist_wheel upload @@ -61,6 +62,7 @@ def get_version(pkg): "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ], keywords="jinja2", url="https://github.com/elapouya/python-docx-template", @@ -68,8 +70,8 @@ def get_version(pkg): license="LGPL-2.1-only", license_files=[], packages=["docxtpl"], - install_requires=["python-docx>=1.1.1", "docxcompose", "jinja2", "lxml"], - extras_require={"docs": ["Sphinx", "sphinxcontrib-napoleon"]}, + install_requires=["python-docx>=1.1.1", "jinja2", "lxml"], + extras_require={"docs": ["Sphinx", "sphinxcontrib-napoleon"], "subdoc": ["docxcompose"]}, eager_resources=["docs"], zip_safe=False, ) From e77cbf8c7b24d9dffb62079cc77ed6ee062e4298 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Tue, 23 Sep 2025 18:58:34 +0800 Subject: [PATCH 46/64] Fix pip install error with `--editable` --- poetry.lock | 1513 ++++++++++++++++++++---------------------------- pyproject.toml | 72 ++- 2 files changed, 689 insertions(+), 896 deletions(-) diff --git a/poetry.lock b/poetry.lock index 8769f56..6ca6fc4 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,385 +1,174 @@ -# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] -name = "babel" -version = "2.15.0" -description = "Internationalization utilities" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "Babel-2.15.0-py3-none-any.whl", hash = "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb"}, - {file = "babel-2.15.0.tar.gz", hash = "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413"}, -] - -[package.extras] -dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] - -[[package]] -name = "backports-tarfile" -version = "1.2.0" -description = "Backport of CPython tarfile module" -optional = false -python-versions = ">=3.8" +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +optional = true +python-versions = ">=3.6" groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version == \"3.11\"" +markers = "extra == \"docs\"" files = [ - {file = "backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34"}, - {file = "backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991"}, + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, ] -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["jaraco.test", "pytest (!=8.0.*)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)"] - [[package]] -name = "black" -version = "24.4.2" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.8" +name = "babel" +version = "2.14.0" +description = "Internationalization utilities" +optional = true +python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"subdoc\" or extra == \"docs\"" files = [ - {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, - {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, - {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, - {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, - {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, - {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, - {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, - {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, - {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, - {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, - {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, - {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, - {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, - {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, - {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, - {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, - {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, - {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, - {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, - {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, - {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, - {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] [package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4) ; sys_platform != \"win32\" or implementation_name != \"pypy\"", "aiohttp (>=3.7.4,!=3.9.0) ; sys_platform == \"win32\" and implementation_name == \"pypy\""] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "certifi" -version = "2025.7.14" +version = "2025.8.3" description = "Python package for providing Mozilla's CA Bundle." -optional = false +optional = true python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2"}, - {file = "certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995"}, -] - -[[package]] -name = "cffi" -version = "1.17.1" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" -files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, + {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"}, + {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"}, ] -[package.dependencies] -pycparser = "*" - [[package]] name = "charset-normalizer" -version = "3.4.2" +version = "3.4.3" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, - {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, - {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, -] - -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false +optional = true python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f"}, + {file = "charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"}, + {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37"}, + {file = "charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce"}, + {file = "charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce"}, + {file = "charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557"}, + {file = "charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432"}, + {file = "charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca"}, + {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"}, + {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"}, ] -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -optional = false +optional = true python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" groups = ["main"] -markers = "platform_system == \"Windows\"" +markers = "extra == \"docs\" and sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "cryptography" -version = "45.0.5" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = "!=3.9.0,!=3.9.1,>=3.7" -groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\"" -files = [ - {file = "cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8"}, - {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d"}, - {file = "cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5"}, - {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57"}, - {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0"}, - {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d"}, - {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9"}, - {file = "cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27"}, - {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e"}, - {file = "cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174"}, - {file = "cryptography-45.0.5-cp311-abi3-win32.whl", hash = "sha256:926c3ea71a6043921050eaa639137e13dbe7b4ab25800932a8498364fc1abec9"}, - {file = "cryptography-45.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:b85980d1e345fe769cfc57c57db2b59cff5464ee0c045d52c0df087e926fbe63"}, - {file = "cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8"}, - {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd"}, - {file = "cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e"}, - {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0"}, - {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135"}, - {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7"}, - {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42"}, - {file = "cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492"}, - {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0"}, - {file = "cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a"}, - {file = "cryptography-45.0.5-cp37-abi3-win32.whl", hash = "sha256:1e1da5accc0c750056c556a93c3e9cb828970206c68867712ca5805e46dc806f"}, - {file = "cryptography-45.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:90cb0a7bb35959f37e23303b7eed0a32280510030daba3f7fdfbb65defde6a97"}, - {file = "cryptography-45.0.5-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:206210d03c1193f4e1ff681d22885181d47efa1ab3018766a7b32a7b3d6e6afd"}, - {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c648025b6840fe62e57107e0a25f604db740e728bd67da4f6f060f03017d5097"}, - {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b8fa8b0a35a9982a3c60ec79905ba5bb090fc0b9addcfd3dc2dd04267e45f25e"}, - {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:14d96584701a887763384f3c47f0ca7c1cce322aa1c31172680eb596b890ec30"}, - {file = "cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57c816dfbd1659a367831baca4b775b2a5b43c003daf52e9d57e1d30bc2e1b0e"}, - {file = "cryptography-45.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b9e38e0a83cd51e07f5a48ff9691cae95a79bea28fe4ded168a8e5c6c77e819d"}, - {file = "cryptography-45.0.5-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8c4a6ff8a30e9e3d38ac0539e9a9e02540ab3f827a3394f8852432f6b0ea152e"}, - {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bd4c45986472694e5121084c6ebbd112aa919a25e783b87eb95953c9573906d6"}, - {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:982518cd64c54fcada9d7e5cf28eabd3ee76bd03ab18e08a48cad7e8b6f31b18"}, - {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:12e55281d993a793b0e883066f590c1ae1e802e3acb67f8b442e721e475e6463"}, - {file = "cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:5aa1e32983d4443e310f726ee4b071ab7569f58eedfdd65e9675484a4eb67bd1"}, - {file = "cryptography-45.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e357286c1b76403dd384d938f93c46b2b058ed4dfcdce64a770f0537ed3feb6f"}, - {file = "cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a"}, -] - -[package.dependencies] -cffi = {version = ">=1.14", markers = "platform_python_implementation != \"PyPy\""} - -[package.extras] -docs = ["sphinx (>=5.3.0)", "sphinx-inline-tabs ; python_full_version >= \"3.8.0\"", "sphinx-rtd-theme (>=3.0.0) ; python_full_version >= \"3.8.0\""] -docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] -nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_full_version >= \"3.8.0\""] -pep8test = ["check-sdist ; python_full_version >= \"3.8.0\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] -sdist = ["build (>=1.0.0)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["certifi (>=2024)", "cryptography-vectors (==45.0.5)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] -test-randomorder = ["pytest-randomly"] - [[package]] name = "docutils" -version = "0.21.2" +version = "0.19" description = "Docutils -- Python Documentation Utilities" -optional = false -python-versions = ">=3.9" +optional = true +python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, - {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, ] [[package]] name = "docxcompose" version = "1.4.0" description = "Compose .docx documents" -optional = false +optional = true python-versions = "*" groups = ["main"] +markers = "extra == \"subdoc\"" files = [ {file = "docxcompose-1.4.0.tar.gz", hash = "sha256:bcf2799a0b63c29eb77a3d799a2f28443ae0f69f8691ff3d753f706be515c3e9"}, ] @@ -397,48 +186,30 @@ tests = ["pytest"] [[package]] name = "flake8" -version = "7.1.0" +version = "7.3.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false -python-versions = ">=3.8.1" +python-versions = ">=3.9" groups = ["dev"] +markers = "python_version >= \"3.9\"" files = [ - {file = "flake8-7.1.0-py2.py3-none-any.whl", hash = "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a"}, - {file = "flake8-7.1.0.tar.gz", hash = "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5"}, + {file = "flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e"}, + {file = "flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.12.0,<2.13.0" -pyflakes = ">=3.2.0,<3.3.0" - -[[package]] -name = "id" -version = "1.5.0" -description = "A tool for generating OIDC identities" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "id-1.5.0-py3-none-any.whl", hash = "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658"}, - {file = "id-1.5.0.tar.gz", hash = "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d"}, -] - -[package.dependencies] -requests = "*" - -[package.extras] -dev = ["build", "bump (>=1.3.2)", "id[lint,test]"] -lint = ["bandit", "interrogate", "mypy", "ruff (<0.8.2)", "types-requests"] -test = ["coverage[toml]", "pretend", "pytest", "pytest-cov"] +pycodestyle = ">=2.14.0,<2.15.0" +pyflakes = ">=3.4.0,<3.5.0" [[package]] name = "idna" version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" -optional = false +optional = true python-versions = ">=3.6" groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -448,121 +219,50 @@ files = [ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] [[package]] -name = "importlib-metadata" -version = "8.7.0" -description = "Read metadata from Python packages" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version == \"3.11\"" -files = [ - {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, - {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, -] - -[package.dependencies] -zipp = ">=3.20" - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -perf = ["ipython"] -test = ["flufl.flake8", "importlib_resources (>=1.3) ; python_version < \"3.9\"", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] -type = ["pytest-mypy"] - -[[package]] -name = "jaraco-classes" -version = "3.4.0" -description = "Utility functions for Python class constructs" -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" -files = [ - {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, - {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, -] - -[package.dependencies] -more-itertools = "*" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] - -[[package]] -name = "jaraco-context" -version = "6.0.1" -description = "Useful decorators and context managers" -optional = false -python-versions = ">=3.8" +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +markers = "extra == \"docs\"" files = [ - {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, - {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] -[package.dependencies] -"backports.tarfile" = {version = "*", markers = "python_version < \"3.12\""} - -[package.extras] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] - [[package]] -name = "jaraco-functools" -version = "4.2.1" -description = "Functools like those found in stdlib" -optional = false -python-versions = ">=3.9" +name = "importlib-metadata" +version = "6.7.0" +description = "Read metadata from Python packages" +optional = true +python-versions = ">=3.7" groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +markers = "extra == \"docs\" and python_version < \"3.10\"" files = [ - {file = "jaraco_functools-4.2.1-py3-none-any.whl", hash = "sha256:590486285803805f4b1f99c60ca9e94ed348d4added84b74c7a12885561e524e"}, - {file = "jaraco_functools-4.2.1.tar.gz", hash = "sha256:be634abfccabce56fa3053f8c7ebe37b682683a4ee7793670ced17bab0087353"}, + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, ] [package.dependencies] -more_itertools = "*" - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["jaraco.classes", "pytest (>=6,!=8.1.*)"] -type = ["pytest-mypy"] - -[[package]] -name = "jeepney" -version = "0.9.0" -description = "Low-level, pure Python DBus protocol wrapper." -optional = false -python-versions = ">=3.7" -groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\"" -files = [ - {file = "jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"}, - {file = "jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"}, -] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +zipp = ">=0.5" [package.extras] -test = ["async-timeout ; python_version < \"3.11\"", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] -trio = ["trio"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7) ; platform_python_implementation != \"PyPy\"", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\"", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "jinja2" -version = "3.1.4" +version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, - {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, ] [package.dependencies] @@ -571,220 +271,170 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] -[[package]] -name = "keyring" -version = "25.6.0" -description = "Store and access your passwords safely." -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" -files = [ - {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, - {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, -] - -[package.dependencies] -importlib_metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} -"jaraco.classes" = "*" -"jaraco.context" = "*" -"jaraco.functools" = "*" -jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} -SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} - -[package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -completion = ["shtab (>=1.1.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["pyfakefs", "pytest (>=6,!=8.1.*)"] -type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"] - [[package]] name = "lxml" -version = "5.2.2" +version = "5.4.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" groups = ["main"] files = [ - {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:364d03207f3e603922d0d3932ef363d55bbf48e3647395765f9bfcbdf6d23632"}, - {file = "lxml-5.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50127c186f191b8917ea2fb8b206fbebe87fd414a6084d15568c27d0a21d60db"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74e4f025ef3db1c6da4460dd27c118d8cd136d0391da4e387a15e48e5c975147"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:981a06a3076997adf7c743dcd0d7a0415582661e2517c7d961493572e909aa1d"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aef5474d913d3b05e613906ba4090433c515e13ea49c837aca18bde190853dff"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e275ea572389e41e8b039ac076a46cb87ee6b8542df3fff26f5baab43713bca"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5b65529bb2f21ac7861a0e94fdbf5dc0daab41497d18223b46ee8515e5ad297"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bcc98f911f10278d1daf14b87d65325851a1d29153caaf146877ec37031d5f36"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:b47633251727c8fe279f34025844b3b3a3e40cd1b198356d003aa146258d13a2"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:fbc9d316552f9ef7bba39f4edfad4a734d3d6f93341232a9dddadec4f15d425f"}, - {file = "lxml-5.2.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:13e69be35391ce72712184f69000cda04fc89689429179bc4c0ae5f0b7a8c21b"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b6a30a9ab040b3f545b697cb3adbf3696c05a3a68aad172e3fd7ca73ab3c835"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a233bb68625a85126ac9f1fc66d24337d6e8a0f9207b688eec2e7c880f012ec0"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:dfa7c241073d8f2b8e8dbc7803c434f57dbb83ae2a3d7892dd068d99e96efe2c"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a7aca7964ac4bb07680d5c9d63b9d7028cace3e2d43175cb50bba8c5ad33316"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae4073a60ab98529ab8a72ebf429f2a8cc612619a8c04e08bed27450d52103c0"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ffb2be176fed4457e445fe540617f0252a72a8bc56208fd65a690fdb1f57660b"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e290d79a4107d7d794634ce3e985b9ae4f920380a813717adf61804904dc4393"}, - {file = "lxml-5.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96e85aa09274955bb6bd483eaf5b12abadade01010478154b0ec70284c1b1526"}, - {file = "lxml-5.2.2-cp310-cp310-win32.whl", hash = "sha256:f956196ef61369f1685d14dad80611488d8dc1ef00be57c0c5a03064005b0f30"}, - {file = "lxml-5.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:875a3f90d7eb5c5d77e529080d95140eacb3c6d13ad5b616ee8095447b1d22e7"}, - {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45f9494613160d0405682f9eee781c7e6d1bf45f819654eb249f8f46a2c22545"}, - {file = "lxml-5.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b0b3f2df149efb242cee2ffdeb6674b7f30d23c9a7af26595099afaf46ef4e88"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d28cb356f119a437cc58a13f8135ab8a4c8ece18159eb9194b0d269ec4e28083"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:657a972f46bbefdbba2d4f14413c0d079f9ae243bd68193cb5061b9732fa54c1"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b9ea10063efb77a965a8d5f4182806fbf59ed068b3c3fd6f30d2ac7bee734"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07542787f86112d46d07d4f3c4e7c760282011b354d012dc4141cc12a68cef5f"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:303f540ad2dddd35b92415b74b900c749ec2010e703ab3bfd6660979d01fd4ed"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2eb2227ce1ff998faf0cd7fe85bbf086aa41dfc5af3b1d80867ecfe75fb68df3"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:1d8a701774dfc42a2f0b8ccdfe7dbc140500d1049e0632a611985d943fcf12df"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:56793b7a1a091a7c286b5f4aa1fe4ae5d1446fe742d00cdf2ffb1077865db10d"}, - {file = "lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eb00b549b13bd6d884c863554566095bf6fa9c3cecb2e7b399c4bc7904cb33b5"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a2569a1f15ae6c8c64108a2cd2b4a858fc1e13d25846be0666fc144715e32ab"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:8cf85a6e40ff1f37fe0f25719aadf443686b1ac7652593dc53c7ef9b8492b115"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:d237ba6664b8e60fd90b8549a149a74fcc675272e0e95539a00522e4ca688b04"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0b3f5016e00ae7630a4b83d0868fca1e3d494c78a75b1c7252606a3a1c5fc2ad"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23441e2b5339bc54dc949e9e675fa35efe858108404ef9aa92f0456929ef6fe8"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2fb0ba3e8566548d6c8e7dd82a8229ff47bd8fb8c2da237607ac8e5a1b8312e5"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:79d1fb9252e7e2cfe4de6e9a6610c7cbb99b9708e2c3e29057f487de5a9eaefa"}, - {file = "lxml-5.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6dcc3d17eac1df7859ae01202e9bb11ffa8c98949dcbeb1069c8b9a75917e01b"}, - {file = "lxml-5.2.2-cp311-cp311-win32.whl", hash = "sha256:4c30a2f83677876465f44c018830f608fa3c6a8a466eb223535035fbc16f3438"}, - {file = "lxml-5.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:49095a38eb333aaf44c06052fd2ec3b8f23e19747ca7ec6f6c954ffea6dbf7be"}, - {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7429e7faa1a60cad26ae4227f4dd0459efde239e494c7312624ce228e04f6391"}, - {file = "lxml-5.2.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:50ccb5d355961c0f12f6cf24b7187dbabd5433f29e15147a67995474f27d1776"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc911208b18842a3a57266d8e51fc3cfaccee90a5351b92079beed912a7914c2"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33ce9e786753743159799fdf8e92a5da351158c4bfb6f2db0bf31e7892a1feb5"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec87c44f619380878bd49ca109669c9f221d9ae6883a5bcb3616785fa8f94c97"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08ea0f606808354eb8f2dfaac095963cb25d9d28e27edcc375d7b30ab01abbf6"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75a9632f1d4f698b2e6e2e1ada40e71f369b15d69baddb8968dcc8e683839b18"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74da9f97daec6928567b48c90ea2c82a106b2d500f397eeb8941e47d30b1ca85"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:0969e92af09c5687d769731e3f39ed62427cc72176cebb54b7a9d52cc4fa3b73"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:9164361769b6ca7769079f4d426a41df6164879f7f3568be9086e15baca61466"}, - {file = "lxml-5.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d26a618ae1766279f2660aca0081b2220aca6bd1aa06b2cf73f07383faf48927"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab67ed772c584b7ef2379797bf14b82df9aa5f7438c5b9a09624dd834c1c1aaf"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3d1e35572a56941b32c239774d7e9ad724074d37f90c7a7d499ab98761bd80cf"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:8268cbcd48c5375f46e000adb1390572c98879eb4f77910c6053d25cc3ac2c67"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e282aedd63c639c07c3857097fc0e236f984ceb4089a8b284da1c526491e3f3d"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfdc2bfe69e9adf0df4915949c22a25b39d175d599bf98e7ddf620a13678585"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4aefd911793b5d2d7a921233a54c90329bf3d4a6817dc465f12ffdfe4fc7b8fe"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8b8df03a9e995b6211dafa63b32f9d405881518ff1ddd775db4e7b98fb545e1c"}, - {file = "lxml-5.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f11ae142f3a322d44513de1018b50f474f8f736bc3cd91d969f464b5bfef8836"}, - {file = "lxml-5.2.2-cp312-cp312-win32.whl", hash = "sha256:16a8326e51fcdffc886294c1e70b11ddccec836516a343f9ed0f82aac043c24a"}, - {file = "lxml-5.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:bbc4b80af581e18568ff07f6395c02114d05f4865c2812a1f02f2eaecf0bfd48"}, - {file = "lxml-5.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3d9d13603410b72787579769469af730c38f2f25505573a5888a94b62b920f8"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38b67afb0a06b8575948641c1d6d68e41b83a3abeae2ca9eed2ac59892b36706"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c689d0d5381f56de7bd6966a4541bff6e08bf8d3871bbd89a0c6ab18aa699573"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:cf2a978c795b54c539f47964ec05e35c05bd045db5ca1e8366988c7f2fe6b3ce"}, - {file = "lxml-5.2.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:739e36ef7412b2bd940f75b278749106e6d025e40027c0b94a17ef7968d55d56"}, - {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d8bbcd21769594dbba9c37d3c819e2d5847656ca99c747ddb31ac1701d0c0ed9"}, - {file = "lxml-5.2.2-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:2304d3c93f2258ccf2cf7a6ba8c761d76ef84948d87bf9664e14d203da2cd264"}, - {file = "lxml-5.2.2-cp36-cp36m-win32.whl", hash = "sha256:02437fb7308386867c8b7b0e5bc4cd4b04548b1c5d089ffb8e7b31009b961dc3"}, - {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, - {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, - {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, - {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, - {file = "lxml-5.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ed07b3062b055d7a7f9d6557a251cc655eed0b3152b76de619516621c56f5d3"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f60fdd125d85bf9c279ffb8e94c78c51b3b6a37711464e1f5f31078b45002421"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7e24cb69ee5f32e003f50e016d5fde438010c1022c96738b04fc2423e61706"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23cfafd56887eaed93d07bc4547abd5e09d837a002b791e9767765492a75883f"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:19b4e485cd07b7d83e3fe3b72132e7df70bfac22b14fe4bf7a23822c3a35bff5"}, - {file = "lxml-5.2.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7ce7ad8abebe737ad6143d9d3bf94b88b93365ea30a5b81f6877ec9c0dee0a48"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e49b052b768bb74f58c7dda4e0bdf7b79d43a9204ca584ffe1fb48a6f3c84c66"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d14a0d029a4e176795cef99c056d58067c06195e0c7e2dbb293bf95c08f772a3"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:be49ad33819d7dcc28a309b86d4ed98e1a65f3075c6acd3cd4fe32103235222b"}, - {file = "lxml-5.2.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a6d17e0370d2516d5bb9062c7b4cb731cff921fc875644c3d751ad857ba9c5b1"}, - {file = "lxml-5.2.2-cp38-cp38-win32.whl", hash = "sha256:5b8c041b6265e08eac8a724b74b655404070b636a8dd6d7a13c3adc07882ef30"}, - {file = "lxml-5.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:f61efaf4bed1cc0860e567d2ecb2363974d414f7f1f124b1df368bbf183453a6"}, - {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb91819461b1b56d06fa4bcf86617fac795f6a99d12239fb0c68dbeba41a0a30"}, - {file = "lxml-5.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d4ed0c7cbecde7194cd3228c044e86bf73e30a23505af852857c09c24e77ec5d"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54401c77a63cc7d6dc4b4e173bb484f28a5607f3df71484709fe037c92d4f0ed"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:625e3ef310e7fa3a761d48ca7ea1f9d8718a32b1542e727d584d82f4453d5eeb"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:519895c99c815a1a24a926d5b60627ce5ea48e9f639a5cd328bda0515ea0f10c"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7079d5eb1c1315a858bbf180000757db8ad904a89476653232db835c3114001"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:343ab62e9ca78094f2306aefed67dcfad61c4683f87eee48ff2fd74902447726"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:cd9e78285da6c9ba2d5c769628f43ef66d96ac3085e59b10ad4f3707980710d3"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:546cf886f6242dff9ec206331209db9c8e1643ae642dea5fdbecae2453cb50fd"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:02f6a8eb6512fdc2fd4ca10a49c341c4e109aa6e9448cc4859af5b949622715a"}, - {file = "lxml-5.2.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:339ee4a4704bc724757cd5dd9dc8cf4d00980f5d3e6e06d5847c1b594ace68ab"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0a028b61a2e357ace98b1615fc03f76eb517cc028993964fe08ad514b1e8892d"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f90e552ecbad426eab352e7b2933091f2be77115bb16f09f78404861c8322981"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d83e2d94b69bf31ead2fa45f0acdef0757fa0458a129734f59f67f3d2eb7ef32"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a02d3c48f9bb1e10c7788d92c0c7db6f2002d024ab6e74d6f45ae33e3d0288a3"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6d68ce8e7b2075390e8ac1e1d3a99e8b6372c694bbe612632606d1d546794207"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:453d037e09a5176d92ec0fd282e934ed26d806331a8b70ab431a81e2fbabf56d"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3b019d4ee84b683342af793b56bb35034bd749e4cbdd3d33f7d1107790f8c472"}, - {file = "lxml-5.2.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb3942960f0beb9f46e2a71a3aca220d1ca32feb5a398656be934320804c0df9"}, - {file = "lxml-5.2.2-cp39-cp39-win32.whl", hash = "sha256:ac6540c9fff6e3813d29d0403ee7a81897f1d8ecc09a8ff84d2eea70ede1cdbf"}, - {file = "lxml-5.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:610b5c77428a50269f38a534057444c249976433f40f53e3b47e68349cca1425"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b537bd04d7ccd7c6350cdaaaad911f6312cbd61e6e6045542f781c7f8b2e99d2"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4820c02195d6dfb7b8508ff276752f6b2ff8b64ae5d13ebe02e7667e035000b9"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a09f6184f17a80897172863a655467da2b11151ec98ba8d7af89f17bf63dae"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:76acba4c66c47d27c8365e7c10b3d8016a7da83d3191d053a58382311a8bf4e1"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b128092c927eaf485928cec0c28f6b8bead277e28acf56800e972aa2c2abd7a2"}, - {file = "lxml-5.2.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ae791f6bd43305aade8c0e22f816b34f3b72b6c820477aab4d18473a37e8090b"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a2f6a1bc2460e643785a2cde17293bd7a8f990884b822f7bca47bee0a82fc66b"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e8d351ff44c1638cb6e980623d517abd9f580d2e53bfcd18d8941c052a5a009"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec4bd9133420c5c52d562469c754f27c5c9e36ee06abc169612c959bd7dbb07"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:55ce6b6d803890bd3cc89975fca9de1dff39729b43b73cb15ddd933b8bc20484"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8ab6a358d1286498d80fe67bd3d69fcbc7d1359b45b41e74c4a26964ca99c3f8"}, - {file = "lxml-5.2.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:06668e39e1f3c065349c51ac27ae430719d7806c026fec462e5693b08b95696b"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9cd5323344d8ebb9fb5e96da5de5ad4ebab993bbf51674259dbe9d7a18049525"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89feb82ca055af0fe797a2323ec9043b26bc371365847dbe83c7fd2e2f181c34"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e481bba1e11ba585fb06db666bfc23dbe181dbafc7b25776156120bf12e0d5a6"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9d6c6ea6a11ca0ff9cd0390b885984ed31157c168565702959c25e2191674a14"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3d98de734abee23e61f6b8c2e08a88453ada7d6486dc7cdc82922a03968928db"}, - {file = "lxml-5.2.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:69ab77a1373f1e7563e0fb5a29a8440367dec051da6c7405333699d07444f511"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:34e17913c431f5ae01d8658dbf792fdc457073dcdfbb31dc0cc6ab256e664a8d"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f8757b03208c3f50097761be2dea0aba02e94f0dc7023ed73a7bb14ff11eb0"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a520b4f9974b0a0a6ed73c2154de57cdfd0c8800f4f15ab2b73238ffed0b36e"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5e097646944b66207023bc3c634827de858aebc226d5d4d6d16f0b77566ea182"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b5e4ef22ff25bfd4ede5f8fb30f7b24446345f3e79d9b7455aef2836437bc38a"}, - {file = "lxml-5.2.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff69a9a0b4b17d78170c73abe2ab12084bdf1691550c5629ad1fe7849433f324"}, - {file = "lxml-5.2.2.tar.gz", hash = "sha256:bb2dc4898180bea79863d5487e5f9c7c34297414bad54bcd0f0852aee9cfdb87"}, + {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c"}, + {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:696ea9e87442467819ac22394ca36cb3d01848dad1be6fac3fb612d3bd5a12cf"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ef80aeac414f33c24b3815ecd560cee272786c3adfa5f31316d8b349bfade28"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b9c2754cef6963f3408ab381ea55f47dabc6f78f4b8ebb0f0b25cf1ac1f7609"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a62cc23d754bb449d63ff35334acc9f5c02e6dae830d78dab4dd12b78a524f4"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f82125bc7203c5ae8633a7d5d20bcfdff0ba33e436e4ab0abc026a53a8960b7"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b67319b4aef1a6c56576ff544b67a2a6fbd7eaee485b241cabf53115e8908b8f"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:a8ef956fce64c8551221f395ba21d0724fed6b9b6242ca4f2f7beb4ce2f41997"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:0a01ce7d8479dce84fc03324e3b0c9c90b1ece9a9bb6a1b6c9025e7e4520e78c"}, + {file = "lxml-5.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:91505d3ddebf268bb1588eb0f63821f738d20e1e7f05d3c647a5ca900288760b"}, + {file = "lxml-5.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a3bcdde35d82ff385f4ede021df801b5c4a5bcdfb61ea87caabcebfc4945dc1b"}, + {file = "lxml-5.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aea7c06667b987787c7d1f5e1dfcd70419b711cdb47d6b4bb4ad4b76777a0563"}, + {file = "lxml-5.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7fb111eef4d05909b82152721a59c1b14d0f365e2be4c742a473c5d7372f4f5"}, + {file = "lxml-5.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:43d549b876ce64aa18b2328faff70f5877f8c6dede415f80a2f799d31644d776"}, + {file = "lxml-5.4.0-cp310-cp310-win32.whl", hash = "sha256:75133890e40d229d6c5837b0312abbe5bac1c342452cf0e12523477cd3aa21e7"}, + {file = "lxml-5.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:de5b4e1088523e2b6f730d0509a9a813355b7f5659d70eb4f319c76beea2e250"}, + {file = "lxml-5.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98a3912194c079ef37e716ed228ae0dcb960992100461b704aea4e93af6b0bb9"}, + {file = "lxml-5.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ea0252b51d296a75f6118ed0d8696888e7403408ad42345d7dfd0d1e93309a7"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92b69441d1bd39f4940f9eadfa417a25862242ca2c396b406f9272ef09cdcaa"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20e16c08254b9b6466526bc1828d9370ee6c0d60a4b64836bc3ac2917d1e16df"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7605c1c32c3d6e8c990dd28a0970a3cbbf1429d5b92279e37fda05fb0c92190e"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecf4c4b83f1ab3d5a7ace10bafcb6f11df6156857a3c418244cef41ca9fa3e44"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cef4feae82709eed352cd7e97ae062ef6ae9c7b5dbe3663f104cd2c0e8d94ba"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:df53330a3bff250f10472ce96a9af28628ff1f4efc51ccba351a8820bca2a8ba"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:aefe1a7cb852fa61150fcb21a8c8fcea7b58c4cb11fbe59c97a0a4b31cae3c8c"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ef5a7178fcc73b7d8c07229e89f8eb45b2908a9238eb90dcfc46571ccf0383b8"}, + {file = "lxml-5.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d2ed1b3cb9ff1c10e6e8b00941bb2e5bb568b307bfc6b17dffbbe8be5eecba86"}, + {file = "lxml-5.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:72ac9762a9f8ce74c9eed4a4e74306f2f18613a6b71fa065495a67ac227b3056"}, + {file = "lxml-5.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f5cb182f6396706dc6cc1896dd02b1c889d644c081b0cdec38747573db88a7d7"}, + {file = "lxml-5.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3a3178b4873df8ef9457a4875703488eb1622632a9cee6d76464b60e90adbfcd"}, + {file = "lxml-5.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e094ec83694b59d263802ed03a8384594fcce477ce484b0cbcd0008a211ca751"}, + {file = "lxml-5.4.0-cp311-cp311-win32.whl", hash = "sha256:4329422de653cdb2b72afa39b0aa04252fca9071550044904b2e7036d9d97fe4"}, + {file = "lxml-5.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd3be6481ef54b8cfd0e1e953323b7aa9d9789b94842d0e5b142ef4bb7999539"}, + {file = "lxml-5.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b5aff6f3e818e6bdbbb38e5967520f174b18f539c2b9de867b1e7fde6f8d95a4"}, + {file = "lxml-5.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942a5d73f739ad7c452bf739a62a0f83e2578afd6b8e5406308731f4ce78b16d"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:460508a4b07364d6abf53acaa0a90b6d370fafde5693ef37602566613a9b0779"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529024ab3a505fed78fe3cc5ddc079464e709f6c892733e3f5842007cec8ac6e"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ca56ebc2c474e8f3d5761debfd9283b8b18c76c4fc0967b74aeafba1f5647f9"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a81e1196f0a5b4167a8dafe3a66aa67c4addac1b22dc47947abd5d5c7a3f24b5"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b8686694423ddae324cf614e1b9659c2edb754de617703c3d29ff568448df5"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c5681160758d3f6ac5b4fea370495c48aac0989d6a0f01bb9a72ad8ef5ab75c4"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:2dc191e60425ad70e75a68c9fd90ab284df64d9cd410ba8d2b641c0c45bc006e"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:67f779374c6b9753ae0a0195a892a1c234ce8416e4448fe1e9f34746482070a7"}, + {file = "lxml-5.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:79d5bfa9c1b455336f52343130b2067164040604e41f6dc4d8313867ed540079"}, + {file = "lxml-5.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3d3c30ba1c9b48c68489dc1829a6eede9873f52edca1dda900066542528d6b20"}, + {file = "lxml-5.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1af80c6316ae68aded77e91cd9d80648f7dd40406cef73df841aa3c36f6907c8"}, + {file = "lxml-5.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4d885698f5019abe0de3d352caf9466d5de2baded00a06ef3f1216c1a58ae78f"}, + {file = "lxml-5.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea53d51859b6c64e7c51d522c03cc2c48b9b5d6172126854cc7f01aa11f52bc"}, + {file = "lxml-5.4.0-cp312-cp312-win32.whl", hash = "sha256:d90b729fd2732df28130c064aac9bb8aff14ba20baa4aee7bd0795ff1187545f"}, + {file = "lxml-5.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1dc4ca99e89c335a7ed47d38964abcb36c5910790f9bd106f2a8fa2ee0b909d2"}, + {file = "lxml-5.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:773e27b62920199c6197130632c18fb7ead3257fce1ffb7d286912e56ddb79e0"}, + {file = "lxml-5.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ce9c671845de9699904b1e9df95acfe8dfc183f2310f163cdaa91a3535af95de"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9454b8d8200ec99a224df8854786262b1bd6461f4280064c807303c642c05e76"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cccd007d5c95279e529c146d095f1d39ac05139de26c098166c4beb9374b0f4d"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fce1294a0497edb034cb416ad3e77ecc89b313cff7adbee5334e4dc0d11f422"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24974f774f3a78ac12b95e3a20ef0931795ff04dbb16db81a90c37f589819551"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:497cab4d8254c2a90bf988f162ace2ddbfdd806fce3bda3f581b9d24c852e03c"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e794f698ae4c5084414efea0f5cc9f4ac562ec02d66e1484ff822ef97c2cadff"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:2c62891b1ea3094bb12097822b3d44b93fc6c325f2043c4d2736a8ff09e65f60"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:142accb3e4d1edae4b392bd165a9abdee8a3c432a2cca193df995bc3886249c8"}, + {file = "lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982"}, + {file = "lxml-5.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4291d3c409a17febf817259cb37bc62cb7eb398bcc95c1356947e2871911ae61"}, + {file = "lxml-5.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4f5322cf38fe0e21c2d73901abf68e6329dc02a4994e483adbcf92b568a09a54"}, + {file = "lxml-5.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0be91891bdb06ebe65122aa6bf3fc94489960cf7e03033c6f83a90863b23c58b"}, + {file = "lxml-5.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:15a665ad90054a3d4f397bc40f73948d48e36e4c09f9bcffc7d90c87410e478a"}, + {file = "lxml-5.4.0-cp313-cp313-win32.whl", hash = "sha256:d5663bc1b471c79f5c833cffbc9b87d7bf13f87e055a5c86c363ccd2348d7e82"}, + {file = "lxml-5.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:bcb7a1096b4b6b24ce1ac24d4942ad98f983cd3810f9711bcd0293f43a9d8b9f"}, + {file = "lxml-5.4.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7be701c24e7f843e6788353c055d806e8bd8466b52907bafe5d13ec6a6dbaecd"}, + {file = "lxml-5.4.0-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb54f7c6bafaa808f27166569b1511fc42701a7713858dddc08afdde9746849e"}, + {file = "lxml-5.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97dac543661e84a284502e0cf8a67b5c711b0ad5fb661d1bd505c02f8cf716d7"}, + {file = "lxml-5.4.0-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:c70e93fba207106cb16bf852e421c37bbded92acd5964390aad07cb50d60f5cf"}, + {file = "lxml-5.4.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9c886b481aefdf818ad44846145f6eaf373a20d200b5ce1a5c8e1bc2d8745410"}, + {file = "lxml-5.4.0-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:fa0e294046de09acd6146be0ed6727d1f42ded4ce3ea1e9a19c11b6774eea27c"}, + {file = "lxml-5.4.0-cp36-cp36m-win32.whl", hash = "sha256:61c7bbf432f09ee44b1ccaa24896d21075e533cd01477966a5ff5a71d88b2f56"}, + {file = "lxml-5.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:7ce1a171ec325192c6a636b64c94418e71a1964f56d002cc28122fceff0b6121"}, + {file = "lxml-5.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:795f61bcaf8770e1b37eec24edf9771b307df3af74d1d6f27d812e15a9ff3872"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29f451a4b614a7b5b6c2e043d7b64a15bd8304d7e767055e8ab68387a8cacf4e"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f7f991a68d20c75cb13c5c9142b2a3f9eb161f1f12a9489c82172d1f133c0"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4aa412a82e460571fad592d0f93ce9935a20090029ba08eca05c614f99b0cc92"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:ac7ba71f9561cd7d7b55e1ea5511543c0282e2b6450f122672a2694621d63b7e"}, + {file = "lxml-5.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:c5d32f5284012deaccd37da1e2cd42f081feaa76981f0eaa474351b68df813c5"}, + {file = "lxml-5.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:ce31158630a6ac85bddd6b830cffd46085ff90498b397bd0a259f59d27a12188"}, + {file = "lxml-5.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:31e63621e073e04697c1b2d23fcb89991790eef370ec37ce4d5d469f40924ed6"}, + {file = "lxml-5.4.0-cp37-cp37m-win32.whl", hash = "sha256:be2ba4c3c5b7900246a8f866580700ef0d538f2ca32535e991027bdaba944063"}, + {file = "lxml-5.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:09846782b1ef650b321484ad429217f5154da4d6e786636c38e434fa32e94e49"}, + {file = "lxml-5.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eaf24066ad0b30917186420d51e2e3edf4b0e2ea68d8cd885b14dc8afdcf6556"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b31a3a77501d86d8ade128abb01082724c0dfd9524f542f2f07d693c9f1175f"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e108352e203c7afd0eb91d782582f00a0b16a948d204d4dec8565024fafeea5"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11a96c3b3f7551c8a8109aa65e8594e551d5a84c76bf950da33d0fb6dfafab7"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:ca755eebf0d9e62d6cb013f1261e510317a41bf4650f22963474a663fdfe02aa"}, + {file = "lxml-5.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:4cd915c0fb1bed47b5e6d6edd424ac25856252f09120e3e8ba5154b6b921860e"}, + {file = "lxml-5.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:226046e386556a45ebc787871d6d2467b32c37ce76c2680f5c608e25823ffc84"}, + {file = "lxml-5.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b108134b9667bcd71236c5a02aad5ddd073e372fb5d48ea74853e009fe38acb6"}, + {file = "lxml-5.4.0-cp38-cp38-win32.whl", hash = "sha256:1320091caa89805df7dcb9e908add28166113dcd062590668514dbd510798c88"}, + {file = "lxml-5.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:073eb6dcdf1f587d9b88c8c93528b57eccda40209cf9be549d469b942b41d70b"}, + {file = "lxml-5.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bda3ea44c39eb74e2488297bb39d47186ed01342f0022c8ff407c250ac3f498e"}, + {file = "lxml-5.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ceaf423b50ecfc23ca00b7f50b64baba85fb3fb91c53e2c9d00bc86150c7e40"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:664cdc733bc87449fe781dbb1f309090966c11cc0c0cd7b84af956a02a8a4729"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67ed8a40665b84d161bae3181aa2763beea3747f748bca5874b4af4d75998f87"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b4a3bd174cc9cdaa1afbc4620c049038b441d6ba07629d89a83b408e54c35cd"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:b0989737a3ba6cf2a16efb857fb0dfa20bc5c542737fddb6d893fde48be45433"}, + {file = "lxml-5.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:dc0af80267edc68adf85f2a5d9be1cdf062f973db6790c1d065e45025fa26140"}, + {file = "lxml-5.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:639978bccb04c42677db43c79bdaa23785dc7f9b83bfd87570da8207872f1ce5"}, + {file = "lxml-5.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a99d86351f9c15e4a901fc56404b485b1462039db59288b203f8c629260a142"}, + {file = "lxml-5.4.0-cp39-cp39-win32.whl", hash = "sha256:3e6d5557989cdc3ebb5302bbdc42b439733a841891762ded9514e74f60319ad6"}, + {file = "lxml-5.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:a8c9b7f16b63e65bbba889acb436a1034a82d34fa09752d754f88d708eca80e1"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1b717b00a71b901b4667226bba282dd462c42ccf618ade12f9ba3674e1fabc55"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27a9ded0f0b52098ff89dd4c418325b987feed2ea5cc86e8860b0f844285d740"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7ce10634113651d6f383aa712a194179dcd496bd8c41e191cec2099fa09de5"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53370c26500d22b45182f98847243efb518d268374a9570409d2e2276232fd37"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6364038c519dffdbe07e3cf42e6a7f8b90c275d4d1617a69bb59734c1a2d571"}, + {file = "lxml-5.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b12cb6527599808ada9eb2cd6e0e7d3d8f13fe7bbb01c6311255a15ded4c7ab4"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5f11a1526ebd0dee85e7b1e39e39a0cc0d9d03fb527f56d8457f6df48a10dc0c"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48b4afaf38bf79109bb060d9016fad014a9a48fb244e11b94f74ae366a64d252"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de6f6bb8a7840c7bf216fb83eec4e2f79f7325eca8858167b68708b929ab2172"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5cca36a194a4eb4e2ed6be36923d3cffd03dcdf477515dea687185506583d4c9"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b7c86884ad23d61b025989d99bfdd92a7351de956e01c61307cb87035960bcb1"}, + {file = "lxml-5.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:53d9469ab5460402c19553b56c3648746774ecd0681b1b27ea74d5d8a3ef5590"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:56dbdbab0551532bb26c19c914848d7251d73edb507c3079d6805fa8bba5b706"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14479c2ad1cb08b62bb941ba8e0e05938524ee3c3114644df905d2331c76cd57"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32697d2ea994e0db19c1df9e40275ffe84973e4232b5c274f47e7c1ec9763cdd"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:24f6df5f24fc3385f622c0c9d63fe34604893bc1a5bdbb2dbf5870f85f9a404a"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:151d6c40bc9db11e960619d2bf2ec5829f0aaffb10b41dcf6ad2ce0f3c0b2325"}, + {file = "lxml-5.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4025bf2884ac4370a3243c5aa8d66d3cb9e15d3ddd0af2d796eccc5f0244390e"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9459e6892f59ecea2e2584ee1058f5d8f629446eab52ba2305ae13a32a059530"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47fb24cc0f052f0576ea382872b3fc7e1f7e3028e53299ea751839418ade92a6"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50441c9de951a153c698b9b99992e806b71c1f36d14b154592580ff4a9d0d877"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ab339536aa798b1e17750733663d272038bf28069761d5be57cb4a9b0137b4f8"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9776af1aad5a4b4a1317242ee2bea51da54b2a7b7b48674be736d463c999f37d"}, + {file = "lxml-5.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:63e7968ff83da2eb6fdda967483a7a023aa497d85ad8f05c3ad9b1f2e8c84987"}, + {file = "lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] -html-clean = ["lxml-html-clean"] +html-clean = ["lxml_html_clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=3.0.10)"] +source = ["Cython (>=3.0.11,<3.1.0)"] [[package]] -name = "markdown-it-py" -version = "3.0.0" -description = "Python port of markdown-it. Markdown parsing, done right!" +name = "lxml-stubs" +version = "0.5.1" +description = "Type annotations for the lxml package" optional = false -python-versions = ">=3.8" -groups = ["main"] +python-versions = "*" +groups = ["dev"] +markers = "python_version >= \"3.9\"" files = [ - {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, - {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, + {file = "lxml-stubs-0.5.1.tar.gz", hash = "sha256:e0ec2aa1ce92d91278b719091ce4515c12adc1d564359dfaf81efa7d4feab79d"}, + {file = "lxml_stubs-0.5.1-py3-none-any.whl", hash = "sha256:1f689e5dbc4b9247cb09ae820c7d34daeb1fdbd1db06123814b856dae7787272"}, ] -[package.dependencies] -mdurl = ">=0.1,<1.0" - [package.extras] -benchmarking = ["psutil", "pytest", "pytest-benchmark"] -code-style = ["pre-commit (>=3.0,<4.0)"] -compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] -linkify = ["linkify-it-py (>=1,<3)"] -plugins = ["mdit-py-plugins"] -profiling = ["gprof2dot"] -rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] -testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] +test = ["coverage[toml] (>=7.2.5)", "mypy (>=1.2.0)", "pytest (>=7.3.0)", "pytest-mypy-plugins (>=1.10.1)"] [[package]] name = "markupsafe" @@ -863,94 +513,98 @@ description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" groups = ["dev"] +markers = "python_version >= \"3.9\"" files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] [[package]] -name = "mdurl" -version = "0.1.2" -description = "Markdown URL utilities" -optional = false -python-versions = ">=3.7" -groups = ["main"] -files = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] - -[[package]] -name = "more-itertools" -version = "10.7.0" -description = "More routines for operating on iterables, beyond itertools" +name = "mypy" +version = "1.18.2" +description = "Optional static typing for Python" optional = false python-versions = ">=3.9" -groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" +groups = ["dev"] +markers = "python_version >= \"3.9\"" files = [ - {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, - {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, + {file = "mypy-1.18.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eab0cf6294dafe397c261a75f96dc2c31bffe3b944faa24db5def4e2b0f77c"}, + {file = "mypy-1.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a780ca61fc239e4865968ebc5240bb3bf610ef59ac398de9a7421b54e4a207e"}, + {file = "mypy-1.18.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448acd386266989ef11662ce3c8011fd2a7b632e0ec7d61a98edd8e27472225b"}, + {file = "mypy-1.18.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9e171c465ad3901dc652643ee4bffa8e9fef4d7d0eece23b428908c77a76a66"}, + {file = "mypy-1.18.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:592ec214750bc00741af1f80cbf96b5013d81486b7bb24cb052382c19e40b428"}, + {file = "mypy-1.18.2-cp310-cp310-win_amd64.whl", hash = "sha256:7fb95f97199ea11769ebe3638c29b550b5221e997c63b14ef93d2e971606ebed"}, + {file = "mypy-1.18.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:807d9315ab9d464125aa9fcf6d84fde6e1dc67da0b6f80e7405506b8ac72bc7f"}, + {file = "mypy-1.18.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:776bb00de1778caf4db739c6e83919c1d85a448f71979b6a0edd774ea8399341"}, + {file = "mypy-1.18.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1379451880512ffce14505493bd9fe469e0697543717298242574882cf8cdb8d"}, + {file = "mypy-1.18.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1331eb7fd110d60c24999893320967594ff84c38ac6d19e0a76c5fd809a84c86"}, + {file = "mypy-1.18.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ca30b50a51e7ba93b00422e486cbb124f1c56a535e20eff7b2d6ab72b3b2e37"}, + {file = "mypy-1.18.2-cp311-cp311-win_amd64.whl", hash = "sha256:664dc726e67fa54e14536f6e1224bcfce1d9e5ac02426d2326e2bb4e081d1ce8"}, + {file = "mypy-1.18.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:33eca32dd124b29400c31d7cf784e795b050ace0e1f91b8dc035672725617e34"}, + {file = "mypy-1.18.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3c47adf30d65e89b2dcd2fa32f3aeb5e94ca970d2c15fcb25e297871c8e4764"}, + {file = "mypy-1.18.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d6c838e831a062f5f29d11c9057c6009f60cb294fea33a98422688181fe2893"}, + {file = "mypy-1.18.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01199871b6110a2ce984bde85acd481232d17413868c9807e95c1b0739a58914"}, + {file = "mypy-1.18.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a2afc0fa0b0e91b4599ddfe0f91e2c26c2b5a5ab263737e998d6817874c5f7c8"}, + {file = "mypy-1.18.2-cp312-cp312-win_amd64.whl", hash = "sha256:d8068d0afe682c7c4897c0f7ce84ea77f6de953262b12d07038f4d296d547074"}, + {file = "mypy-1.18.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:07b8b0f580ca6d289e69209ec9d3911b4a26e5abfde32228a288eb79df129fcc"}, + {file = "mypy-1.18.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ed4482847168439651d3feee5833ccedbf6657e964572706a2adb1f7fa4dfe2e"}, + {file = "mypy-1.18.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3ad2afadd1e9fea5cf99a45a822346971ede8685cc581ed9cd4d42eaf940986"}, + {file = "mypy-1.18.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a431a6f1ef14cf8c144c6b14793a23ec4eae3db28277c358136e79d7d062f62d"}, + {file = "mypy-1.18.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7ab28cc197f1dd77a67e1c6f35cd1f8e8b73ed2217e4fc005f9e6a504e46e7ba"}, + {file = "mypy-1.18.2-cp313-cp313-win_amd64.whl", hash = "sha256:0e2785a84b34a72ba55fb5daf079a1003a34c05b22238da94fcae2bbe46f3544"}, + {file = "mypy-1.18.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:62f0e1e988ad41c2a110edde6c398383a889d95b36b3e60bcf155f5164c4fdce"}, + {file = "mypy-1.18.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8795a039bab805ff0c1dfdb8cd3344642c2b99b8e439d057aba30850b8d3423d"}, + {file = "mypy-1.18.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ca1e64b24a700ab5ce10133f7ccd956a04715463d30498e64ea8715236f9c9c"}, + {file = "mypy-1.18.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d924eef3795cc89fecf6bedc6ed32b33ac13e8321344f6ddbf8ee89f706c05cb"}, + {file = "mypy-1.18.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20c02215a080e3a2be3aa50506c67242df1c151eaba0dcbc1e4e557922a26075"}, + {file = "mypy-1.18.2-cp314-cp314-win_amd64.whl", hash = "sha256:749b5f83198f1ca64345603118a6f01a4e99ad4bf9d103ddc5a3200cc4614adf"}, + {file = "mypy-1.18.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25a9c8fb67b00599f839cf472713f54249a62efd53a54b565eb61956a7e3296b"}, + {file = "mypy-1.18.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c2b9c7e284ee20e7598d6f42e13ca40b4928e6957ed6813d1ab6348aa3f47133"}, + {file = "mypy-1.18.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d6985ed057513e344e43a26cc1cd815c7a94602fb6a3130a34798625bc2f07b6"}, + {file = "mypy-1.18.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f27105f1525ec024b5c630c0b9f36d5c1cc4d447d61fe51ff4bd60633f47ac"}, + {file = "mypy-1.18.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:030c52d0ea8144e721e49b1f68391e39553d7451f0c3f8a7565b59e19fcb608b"}, + {file = "mypy-1.18.2-cp39-cp39-win_amd64.whl", hash = "sha256:aa5e07ac1a60a253445797e42b8b2963c9675563a94f11291ab40718b016a7a0"}, + {file = "mypy-1.18.2-py3-none-any.whl", hash = "sha256:22a1748707dd62b58d2ae53562ffc4d7f8bcc727e8ac7cbc69c053ddc874d47e"}, + {file = "mypy-1.18.2.tar.gz", hash = "sha256:06a398102a5f203d7477b2923dda3634c36727fa5c237d8f859ef90c42a9924b"}, ] +[package.dependencies] +mypy_extensions = ">=1.0.0" +pathspec = ">=0.9.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing_extensions = ">=4.6.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +faster-cache = ["orjson"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + [[package]] name = "mypy-extensions" -version = "1.0.0" +version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = ">=3.5" -groups = ["main"] -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "nh3" -version = "0.2.22" -description = "Python binding to Ammonia HTML sanitizer Rust crate" -optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["dev"] +markers = "python_version >= \"3.9\"" files = [ - {file = "nh3-0.2.22-cp313-cp313t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:4743c9132e2ccf2109af88ce16074c5a7068df85be8f7b9840dbe683e50b9461"}, - {file = "nh3-0.2.22-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca015dbd477e20a29bee8660a966523c677da0c34dfeb474c6acb64462fbfc15"}, - {file = "nh3-0.2.22-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9d10f4c195f3b84a8127417ec940e1393062a3e2f05d405270dde7846854e22c"}, - {file = "nh3-0.2.22-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9bbeb3d253c1026a46e7b23bc2698fe1f00641b5a7bdad8e4c8937daaa1f2b51"}, - {file = "nh3-0.2.22-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:b71ea8e987923e2976a99e4bb17e39cc186c93a330712075650e6143cb2fa89b"}, - {file = "nh3-0.2.22-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:56b328457370401aaf2039a5039d7f587e72b2c08bc95dfe807ad96ae98e83e4"}, - {file = "nh3-0.2.22-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e9762845ee47372df425b52ec4a133e994dbbedf95ad61eea4bfe6cb4d1401b4"}, - {file = "nh3-0.2.22-cp313-cp313t-win32.whl", hash = "sha256:c61fbfe4131ceff1c83ed0663c39aebb72bd26c6b22157b14da0b43287ea15ed"}, - {file = "nh3-0.2.22-cp313-cp313t-win_amd64.whl", hash = "sha256:4f47991a9819f644918aebc2a93d175562c7c0c2ec41cbc525fbdbf676793c03"}, - {file = "nh3-0.2.22-cp313-cp313t-win_arm64.whl", hash = "sha256:29baf3c22d6e9d26325128600355baeddb52eecd6206780621f84537ad4db966"}, - {file = "nh3-0.2.22-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:2a6e33de39218eded7187aaf05aea71884b1b8002d50d080a95df734d3ad3a44"}, - {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb91663dcf139da2009d452aad23094e01579c45a6101b2a0b0c28181b8c496f"}, - {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f45f8a2347da8c9682f9b015cf9d492fdb8440cfb7bd523cceda1a705fd5a4bd"}, - {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f94ed44f433e2f8799f5285000f799e9f3ca66559328e40066c0f96c4fbad346"}, - {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74039dfd41107bbb298fe814c4be5c39d66124855ff549d216e4947a69d3d9a1"}, - {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:60e1d4429762745a5a346277dc3378aade0e24632f75077f0da3bfc29bf385fd"}, - {file = "nh3-0.2.22-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e9e93c67d1ec8db6d96e323832bd267cdfe94bdb8cc6adc88cbc0908ff59329"}, - {file = "nh3-0.2.22-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f186eea285ebf941fbaaecd1cd445e9506552a15435140ca73ca029334715da"}, - {file = "nh3-0.2.22-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:87e532f885937c460ccbdc1b5ea03b0e420de8ef12dd5857621706298857b9aa"}, - {file = "nh3-0.2.22-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:fee209eb0d93830908e4f6fc549c08766def701f5681de2779637a00d48f288f"}, - {file = "nh3-0.2.22-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:10e8d0a833431860620f7f1434792607ca12cdfda81450a2678b8d69642eda69"}, - {file = "nh3-0.2.22-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:adbb35826fad998f88f68b969e3936dff53b70052c9e6e951ef9e49db9590611"}, - {file = "nh3-0.2.22-cp38-abi3-win32.whl", hash = "sha256:bcac2a186791c422ce55522cae332c8fa2135795b7b510e2475cb95a44f7b0ce"}, - {file = "nh3-0.2.22-cp38-abi3-win_amd64.whl", hash = "sha256:a78a13f5bf5901f5de50580a74058a10734d3e836144cb090f0304ec5deb3df7"}, - {file = "nh3-0.2.22-cp38-abi3-win_arm64.whl", hash = "sha256:602ad5229c81a287c8632ea1bf2d6b3654b3e208b57b0bcab5beec93ff91866f"}, - {file = "nh3-0.2.22.tar.gz", hash = "sha256:dbfaa924ba226331c75896a64fe161a0cbd21172e4da687b2a69b5101db2c3e9"}, + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] [[package]] name = "packaging" -version = "24.1" +version = "24.0" description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.8" +optional = true +python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -959,145 +613,117 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["dev"] +markers = "python_version >= \"3.9\"" files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] -name = "platformdirs" -version = "4.2.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" +name = "pockets" +version = "0.9.1" +description = "A collection of helpful Python tools!" +optional = true +python-versions = "*" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "pockets-0.9.1-py2.py3-none-any.whl", hash = "sha256:68597934193c08a08eb2bf6a1d85593f627c22f9b065cc727a4f03f669d96d86"}, + {file = "pockets-0.9.1.tar.gz", hash = "sha256:9320f1a3c6f7a9133fe3b571f283bcf3353cd70249025ae8d618e40e9f7e92b3"}, ] -[package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +[package.dependencies] +six = ">=1.5.2" [[package]] name = "pycodestyle" -version = "2.12.0" +version = "2.14.0" description = "Python style guide checker" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] +markers = "python_version >= \"3.9\"" files = [ - {file = "pycodestyle-2.12.0-py2.py3-none-any.whl", hash = "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4"}, - {file = "pycodestyle-2.12.0.tar.gz", hash = "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c"}, -] - -[[package]] -name = "pycparser" -version = "2.22" -description = "C parser in Python" -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\" and platform_python_implementation != \"PyPy\"" -files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, + {file = "pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"}, + {file = "pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783"}, ] [[package]] name = "pyflakes" -version = "3.2.0" +version = "3.4.0" description = "passive checker of Python programs" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] +markers = "python_version >= \"3.9\"" files = [ - {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, - {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, + {file = "pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"}, + {file = "pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58"}, ] [[package]] name = "pygments" -version = "2.19.2" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." -optional = false -python-versions = ">=3.8" +optional = true +python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, - {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] +plugins = ["importlib-metadata ; python_version < \"3.8\""] windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "python-docx" -version = "1.1.2" +version = "1.1.0" description = "Create, read, and update Microsoft Word .docx files." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe"}, - {file = "python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd"}, + {file = "python-docx-1.1.0.tar.gz", hash = "sha256:5829b722141cf1ab79aedf0c34d9fe9924b29764584c0f2164eb2b02dcdf17c9"}, + {file = "python_docx-1.1.0-py3-none-any.whl", hash = "sha256:bac9773278098a1ddc43a52d84e22f5909c4a3080a624530b3ecb3771b07c6cd"}, ] [package.dependencies] lxml = ">=3.1.0" -typing-extensions = ">=4.9.0" - -[[package]] -name = "pywin32-ctypes" -version = "0.2.3" -description = "A (partial) reimplementation of pywin32 using ctypes/cffi" -optional = false -python-versions = ">=3.6" -groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"win32\"" -files = [ - {file = "pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755"}, - {file = "pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8"}, -] +typing-extensions = "*" [[package]] -name = "readme-renderer" -version = "44.0" -description = "readme_renderer is a library for rendering readme descriptions for Warehouse" -optional = false -python-versions = ">=3.9" +name = "pytz" +version = "2025.2" +description = "World timezone definitions, modern and historical" +optional = true +python-versions = "*" groups = ["main"] +markers = "(extra == \"subdoc\" or extra == \"docs\") and python_version < \"3.9\"" files = [ - {file = "readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151"}, - {file = "readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1"}, + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, ] -[package.dependencies] -docutils = ">=0.21.2" -nh3 = ">=0.2.14" -Pygments = ">=2.5.1" - -[package.extras] -md = ["cmarkgfm (>=0.8.0)"] - [[package]] name = "requests" -version = "2.32.4" +version = "2.31.0" description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.8" +optional = true +python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, - {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset_normalizer = ">=2,<4" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -1106,178 +732,301 @@ socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] -name = "requests-toolbelt" -version = "1.0.0" -description = "A utility belt for advanced users of python-requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = true +python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"subdoc\"" files = [ - {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, - {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, ] -[package.dependencies] -requests = ">=2.0.1,<3.0.0" +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7) ; platform_python_implementation != \"PyPy\"", "pytest-checkdocs (>=2.4)", "pytest-cov ; platform_python_implementation != \"PyPy\"", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\"", "pytest-perf", "pytest-ruff ; sys_platform != \"cygwin\"", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] -name = "rfc3986" -version = "2.0.0" -description = "Validating URI References per RFC 3986" -optional = false -python-versions = ">=3.7" +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" groups = ["main"] +markers = "extra == \"subdoc\" or extra == \"docs\"" files = [ - {file = "rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"}, - {file = "rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] -[package.extras] -idna2008 = ["idna"] +[[package]] +name = "snowballstemmer" +version = "3.0.1" +description = "This package provides 32 stemmers for 30 languages generated from Snowball algorithms." +optional = true +python-versions = "!=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064"}, + {file = "snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"}, +] [[package]] -name = "rich" -version = "14.0.0" -description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" -optional = false -python-versions = ">=3.8.0" +name = "sphinx" +version = "5.3.0" +description = "Python documentation generator" +optional = true +python-versions = ">=3.6" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0"}, - {file = "rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725"}, + {file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"}, + {file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"}, ] [package.dependencies] -markdown-it-py = ">=2.2.0" -pygments = ">=2.13.0,<3.0.0" +alabaster = ">=0.7,<0.8" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.20" +imagesize = ">=1.3" +importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.12" +requests = ">=2.5.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" [package.extras] -jupyter = ["ipywidgets (>=7.5.1,<9)"] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-bugbear", "flake8-comprehensions", "flake8-simplify", "isort", "mypy (>=0.981)", "sphinx-lint", "types-requests", "types-typed-ast"] +test = ["cython", "html5lib", "pytest (>=4.6)", "typed_ast ; python_version < \"3.8\""] [[package]] -name = "secretstorage" -version = "3.3.3" -description = "Python bindings to FreeDesktop.org Secret Service API" -optional = false -python-versions = ">=3.6" +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +optional = true +python-versions = ">=3.5" groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and sys_platform == \"linux\"" +markers = "extra == \"docs\"" files = [ - {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, - {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, ] -[package.dependencies] -cryptography = ">=2.0" -jeepney = ">=0.6" +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] [[package]] -name = "setuptools" -version = "71.0.4" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +optional = true +python-versions = ">=3.5" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "setuptools-71.0.4-py3-none-any.whl", hash = "sha256:ed2feca703be3bdbd94e6bb17365d91c6935c6b2a8d0bb09b66a2c435ba0b1a5"}, - {file = "setuptools-71.0.4.tar.gz", hash = "sha256:48297e5d393a62b7cb2a10b8f76c63a73af933bd809c9e0d0d6352a1a0135dd8"}, + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, ] [package.extras] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.10.0)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-ruff (<0.4) ; platform_system == \"Windows\"", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "pytest-ruff (>=0.3.2) ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] [[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = true +python-versions = ">=3.6" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, ] +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + [[package]] -name = "twine" -version = "6.1.0" -description = "Collection of utilities for publishing packages on PyPI" -optional = false -python-versions = ">=3.8" +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = true +python-versions = ">=3.5" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "twine-6.1.0-py3-none-any.whl", hash = "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384"}, - {file = "twine-6.1.0.tar.gz", hash = "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd"}, + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-napoleon" +version = "0.7" +description = "Sphinx \"napoleon\" extension." +optional = true +python-versions = "*" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib-napoleon-0.7.tar.gz", hash = "sha256:407382beed396e9f2d7f3043fad6afda95719204a1e1a231ac865f40abcbfcf8"}, + {file = "sphinxcontrib_napoleon-0.7-py2.py3-none-any.whl", hash = "sha256:711e41a3974bdf110a484aec4c1a556799eb0b3f3b897521a018ad7e2db13fef"}, ] [package.dependencies] -id = "*" -keyring = {version = ">=15.1", markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\""} -packaging = ">=24.0" -readme-renderer = ">=35.0" -requests = ">=2.20" -requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" -rfc3986 = ">=1.4.0" -rich = ">=12.0.0" -urllib3 = ">=1.26.0" +pockets = ">=0.3" +six = ">=1.5.2" + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +optional = true +python-versions = ">=3.5" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] [package.extras] -keyring = ["keyring (>=15.1)"] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] [[package]] -name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +optional = true +python-versions = ">=3.5" +groups = ["main"] +markers = "extra == \"docs\"" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "tomli" +version = "2.2.1" +description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["dev"] +markers = "python_version >= \"3.9\" and python_version < \"3.11\"" +files = [ + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +groups = ["main", "dev"] files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, ] +markers = {dev = "python_version >= \"3.9\""} [[package]] name = "urllib3" -version = "2.5.0" +version = "2.0.7" description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=3.9" +optional = true +python-versions = ">=3.7" groups = ["main"] +markers = "extra == \"docs\"" files = [ - {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, - {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, ] [package.extras] brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] -h2 = ["h2 (>=4,<5)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "zipp" -version = "3.23.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -optional = false -python-versions = ">=3.9" +optional = true +python-versions = ">=3.7" groups = ["main"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version == \"3.11\"" +markers = "extra == \"docs\" and python_version < \"3.10\"" files = [ - {file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e"}, - {file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166"}, + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] -type = ["pytest-mypy"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7) ; platform_python_implementation != \"PyPy\"", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8 ; python_version < \"3.12\"", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\""] + +[extras] +docs = ["Sphinx", "sphinxcontrib-napoleon"] +subdoc = ["docxcompose"] [metadata] lock-version = "2.1" -python-versions = "^3.11" -content-hash = "06a815c1c06815ec7296fb3ae1cb092a1d6343e85648e02c45a33a9a2ce17b18" +python-versions = ">=3.7" +content-hash = "a6deaefbe026e97162df4940d1807ba479cbabac06ebb94c413d3d6964f76cfc" diff --git a/pyproject.toml b/pyproject.toml index 9354d95..eed6e81 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,22 +1,66 @@ -[tool.poetry] +[project] name = "docxtpl" -version = "0.17.0" +dynamic = ["version"] description = "Python docx template engine" -authors = ["Eric Lapouyade"] +authors = [{name="Eric Lapouyade", email="elapouya@proton.me"}] readme = "README.rst" +requires-python = ">=3.7" +license = {text="LGPL-2.1-only"} +classifiers=[ + "Intended Audience :: Developers", + "Development Status :: 4 - Beta", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +keywords = ["jinja2"] +dependencies = [ + "python-docx", + "jinja2", + "lxml", +] + +[project.optional-dependencies] +subdoc = ["docxcompose"] +docs = ["Sphinx", "sphinxcontrib-napoleon"] + +[dependency-groups] +dev = [ + "mypy >=1.18.2; python_version >= '3.9'", + "lxml-stubs >=0.5.1; python_version >= '3.9'", + "flake8 >=7.3.0; python_version >= '3.9'" +] + +[project.urls] +homepage = "https://github.com/elapouya/python-docx-template" +repository = "https://github.com/elapouya/python-docx-template.git" +document = "https://docxtpl.readthedocs.org" + +[tool.poetry] +version = "0.0.0" + +[tool.poetry-plugin-version] +source = "docxtpl/__init__.py" -[tool.poetry.dependencies] -python = "^3.11" -python-docx = "^1.1.2" -docxcompose = "^1.4.0" -jinja2 = "^3.1.4" -black = "^24.4.2" -twine = "^6.1.0" +[tool.mypy] +pretty = true +python_version = "3.9" +check_untyped_defs = true +warn_unused_ignores = true +exclude = ["docs", "build", "setup.py"] +[[tool.mypy.overrides]] +module = ["docxcompose.*"] +ignore_missing_imports = true -[tool.poetry.group.dev.dependencies] -flake8 = "^7.1.0" +[tool.pdm] +version = {source="file", path="docxtpl/__init__.py"} [build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" +requires = ["pdm-backend"] +build-backend = "pdm.backend" From 560b4b33118139cefb677c80be306818a00d3329 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Wed, 24 Sep 2025 12:25:32 +0800 Subject: [PATCH 47/64] Use poetry-dynamic-versioning instead of pdm --- pyproject.toml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index eed6e81..476fc0e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,8 +44,15 @@ document = "https://docxtpl.readthedocs.org" [tool.poetry] version = "0.0.0" -[tool.poetry-plugin-version] +[tool.poetry.requires-plugins] +poetry-dynamic-versioning = { version = ">=1.0.0,<2.0.0", extras = ["plugin"] } + +[tool.poetry-dynamic-versioning] +enable = true + +[tool.poetry-dynamic-versioning.from-file] source = "docxtpl/__init__.py" +pattern = '__version__ = "(.+)"' [tool.mypy] pretty = true @@ -58,9 +65,6 @@ exclude = ["docs", "build", "setup.py"] module = ["docxcompose.*"] ignore_missing_imports = true -[tool.pdm] -version = {source="file", path="docxtpl/__init__.py"} - [build-system] -requires = ["pdm-backend"] -build-backend = "pdm.backend" +requires = ["poetry-core", "poetry-dynamic-versioning >=1.0.0,<2.0.0"] +build-backend = "poetry_dynamic_versioning.backend" From fab696c5e9048f239fa383a6ad65475776d33229 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 2 Nov 2025 12:30:37 +0800 Subject: [PATCH 48/64] Fix NameError: name Subdoc is not defined --- docxtpl/template.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docxtpl/template.py b/docxtpl/template.py index 2738845..f20280a 100644 --- a/docxtpl/template.py +++ b/docxtpl/template.py @@ -4,6 +4,7 @@ @author: Eric Lapouyade """ +from __future__ import annotations from os import PathLike from typing import TYPE_CHECKING, Any, Optional, IO, Union, Dict, Set @@ -537,7 +538,7 @@ def fix_tables(self, xml): width = 0.0 new_average = None for c in columns: - if not c.get(ns + "w") is None: + if c.get(ns + "w") is not None: width += float(c.get(ns + "w")) # try to keep proportion of table if width > 0: From 082a1c6ad133809ed0039627cc8dbdd6d309feda Mon Sep 17 00:00:00 2001 From: Eric Lapouyade Date: Thu, 13 Nov 2025 13:46:04 +0100 Subject: [PATCH 49/64] v0.20.2 --- CHANGES.rst | 3 ++- docxtpl/__init__.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index eee78f1..b760abe 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,5 +1,6 @@ -0.20.2 *(Unreleased)* +0.20.2 (2025-11-13) ------------------- +- Fix fix_tables() - Move docxcompose to optional dependency (Thanks to Waket Zheng) 0.20.1 (2025-07-15) diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index b3acd11..5559d4f 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -5,13 +5,14 @@ @author: Eric Lapouyade """ -__version__ = "0.20.1" +__version__ = "0.20.2" # flake8: noqa from .inline_image import InlineImage from .listing import Listing from .richtext import RichText, R, RichTextParagraph, RP from .template import DocxTemplate + try: from .subdoc import Subdoc except ImportError: From 10796912f253422a6599fdc08f74db63a4b9d14f Mon Sep 17 00:00:00 2001 From: Stuart Marshall Date: Fri, 5 Dec 2025 13:51:47 +0000 Subject: [PATCH 50/64] fix: move font below style to create correct order for OOXML specs --- docxtpl/richtext.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docxtpl/richtext.py b/docxtpl/richtext.py index f0f4738..c79ac1e 100644 --- a/docxtpl/richtext.py +++ b/docxtpl/richtext.py @@ -62,6 +62,14 @@ def add( if style: prop += '' % style + if font: + regional_font = "" + if ":" in font: + region, font = font.split(":", 1) + regional_font = ' w:{region}="{font}"'.format(font=font, region=region) + prop += ''.format( + font=font, regional_font=regional_font + ) if color: if color[0] == "#": color = color[1:] @@ -100,14 +108,6 @@ def add( prop += '' % underline if strike: prop += "" - if font: - regional_font = "" - if ":" in font: - region, font = font.split(":", 1) - regional_font = ' w:{region}="{font}"'.format(font=font, region=region) - prop += ''.format( - font=font, regional_font=regional_font - ) if rtl: prop += '' if lang: From d5f36d8fd752161142d49ff32c53afd5be93b3aa Mon Sep 17 00:00:00 2001 From: Quinten Steenhuis Date: Thu, 30 Apr 2026 18:50:38 -0400 Subject: [PATCH 51/64] Fix #635 - support adding accessibility information with InlineImage class --- docxtpl/inline_image.py | 42 ++++++++++++++++++++++++++++++++--------- tests/inline_image.py | 34 ++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/docxtpl/inline_image.py b/docxtpl/inline_image.py index f860749..5b164b1 100644 --- a/docxtpl/inline_image.py +++ b/docxtpl/inline_image.py @@ -4,7 +4,7 @@ @author: Eric Lapouyade """ -from docx.oxml import OxmlElement, parse_xml +from docx.oxml import OxmlElement from docx.oxml.ns import qn @@ -19,11 +19,24 @@ class InlineImage(object): width = None height = None anchor = None - - def __init__(self, tpl, image_descriptor, width=None, height=None, anchor=None): + title = None + descr = None + + def __init__( + self, + tpl, + image_descriptor, + width=None, + height=None, + anchor=None, + title=None, + descr=None, + ): self.tpl, self.image_descriptor = tpl, image_descriptor self.width, self.height = width, height self.anchor = anchor + self.title = str(title) if title is not None else None + self.descr = str(descr) if descr is not None else None def _add_hyperlink(self, run, url, part): # Create a relationship for the hyperlink @@ -49,19 +62,30 @@ def _add_hyperlink(self, run, url, part): return run + def _set_doc_properties(self, run): + docPr = run.xpath(".//wp:docPr")[0] + cNvPr = run.xpath(".//pic:cNvPr")[0] + + for elt in (docPr, cNvPr): + if self.title is not None: + elt.set("title", self.title) + if self.descr is not None: + elt.set("descr", self.descr) + def _insert_image(self): pic = self.tpl.current_rendering_part.new_pic_inline( self.image_descriptor, self.width, self.height, - ).xml + ) + if self.title is not None or self.descr is not None: + self._set_doc_properties(pic) if self.anchor: - run = parse_xml(pic) - if run.xpath(".//a:blip"): - hyperlink = self._add_hyperlink( - run, self.anchor, self.tpl.current_rendering_part + if pic.xpath(".//a:blip"): + pic = self._add_hyperlink( + pic, self.anchor, self.tpl.current_rendering_part ) - pic = hyperlink.xml + pic = pic.xml return ( "%s" diff --git a/tests/inline_image.py b/tests/inline_image.py index 48ed670..aa2b046 100644 --- a/tests/inline_image.py +++ b/tests/inline_image.py @@ -5,6 +5,9 @@ @author: Eric Lapouyade """ +import zipfile +from xml.etree import ElementTree + from docxtpl import DocxTemplate, InlineImage # for height and width you have to use millimeters (Mm), inches or points(Pt) class : @@ -14,7 +17,13 @@ tpl = DocxTemplate("templates/inline_image_tpl.docx") context = { - "myimage": InlineImage(tpl, "templates/python_logo.png", width=Mm(20)), + "myimage": InlineImage( + tpl, + "templates/python_logo.png", + width=Mm(20), + title="python-logo-title", + descr="python-logo-description", + ), "myimageratio": InlineImage( tpl, "templates/python_jpeg.jpg", width=Mm(30), height=Mm(60) ), @@ -49,3 +58,26 @@ jinja_env = jinja2.Environment(autoescape=True) tpl.render(context, jinja_env) tpl.save("output/inline_image.docx") + + +with zipfile.ZipFile("output/inline_image.docx") as docx_file: + document = ElementTree.fromstring(docx_file.read("word/document.xml")) + +namespaces = { + "pic": "http://schemas.openxmlformats.org/drawingml/2006/picture", + "wp": "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing", +} + +picture = document.find(".//pic:cNvPr[@name='python_logo.png']", namespaces) +if picture is None: + raise ValueError("Missing python_logo.png image metadata") +if picture.get("title") != "python-logo-title": + raise ValueError("Missing picture title metadata") +if picture.get("descr") != "python-logo-description": + raise ValueError("Missing picture description metadata") + +doc_pr = document.find(".//wp:docPr[@title='python-logo-title']", namespaces) +if doc_pr is None: + raise ValueError("Missing wp:docPr title metadata") +if doc_pr.get("descr") != "python-logo-description": + raise ValueError("Missing wp:docPr description metadata") From 02410faeb5a81260f6bcc69f8a3217583d1dbf1e Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 10:45:06 +0800 Subject: [PATCH 52/64] ci: upgrade actions to v6 and add py3.14 to test list --- .github/workflows/codestyle.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codestyle.yml b/.github/workflows/codestyle.yml index 36e81d3..c6a855d 100644 --- a/.github/workflows/codestyle.yml +++ b/.github/workflows/codestyle.yml @@ -7,11 +7,11 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.9', '3.10', '3.11', '3.12', '3.13'] + python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - name: Install dependencies From f63b6b7b65a45043a520f5c9b90f19f2d70d2809 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 10:50:32 +0800 Subject: [PATCH 53/64] docs: declare py3.14 supported --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 476fc0e..00511f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,6 +17,7 @@ classifiers=[ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] keywords = ["jinja2"] dependencies = [ From 4f7f09237aa4227a20258ea5dd3dfb125b70da65 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 11:31:00 +0800 Subject: [PATCH 54/64] chore: add uv lock file --- uv.lock | 2101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2101 insertions(+) create mode 100644 uv.lock diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..5d48534 --- /dev/null +++ b/uv.lock @@ -0,0 +1,2101 @@ +version = 1 +revision = 3 +requires-python = ">=3.7" +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] + +[[package]] +name = "alabaster" +version = "0.7.13" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/71/a8ee96d1fd95ca04a0d2e2d9c4081dac4c2d2b12f7ddb899c8cb9bfd1532/alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2", size = 11454, upload-time = "2023-01-13T06:42:53.797Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", size = 13857, upload-time = "2023-01-13T06:42:52.336Z" }, +] + +[[package]] +name = "alabaster" +version = "0.7.16" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776, upload-time = "2024-01-10T00:56:10.189Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511, upload-time = "2024-01-10T00:56:08.388Z" }, +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, +] + +[[package]] +name = "ast-serialize" +version = "0.5.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", size = 61157, upload-time = "2026-05-17T17:48:29.429Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/9a/13dde51ba9e15f8b97957ab7cb0120d0e381524d651c6bd630b9c359227f/ast_serialize-0.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8f5c14f169eb0972c0c21bada5358b23d6047c76583b005234f865b11f1fa00a", size = 1183520, upload-time = "2026-05-17T17:47:30.831Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/de/5a7f0a9fe68944f536632a5af84676739c7d2582be42deb082634bf3a754/ast_serialize-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7d1a2de9de5be04652f0ed60738356ef94f66db37924a9499fffe98dc491aa0b", size = 1175779, upload-time = "2026-05-17T17:47:32.551Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/81/0bb853e76e4f6e9a1855d569003c59e19ffac45f7079d91505d1bb212f92/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5173fb66f9b49026d9d5a2ff0fc7c7009077107c0eb285b2d60fdf1fe10bd1", size = 1233750, upload-time = "2026-05-17T17:47:34.731Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/d3/4cf705beeccc08754d0bbda99aefff26110e209b9a07ac8a6b60eec48531/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8015cd071ac1339924ee2b8098c93e00e155f30a16f40ec9816fcf84f4753f6", size = 1235942, upload-time = "2026-05-17T17:47:36.287Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/c8/ee097e437ea27dd2b8b227865c875492b585650a5802a22d82b304c8201b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5499e8797edff2a9186aa313ed382c6b422e798e9332d9953badcee6e69a88f2", size = 1442517, upload-time = "2026-05-17T17:47:38.17Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/bd/68063442838f1ba68ec72b5436430bc75b3bb17a1a3c3063f09b0c05ae2b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6848f2a093fb5548751a9a09bff8fcd229e2bbeb0e3331f391b6ae6d26cd9903", size = 1254081, upload-time = "2026-05-17T17:47:39.826Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/e2/1e520793bc6a4e4524a6ab022391e827825eaa0c3811828bfdc6852eca26/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4c998e0b091fd60a6d6bceee535483c4d490de9ba85003af835225719261", size = 1259910, upload-time = "2026-05-17T17:47:41.369Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/e1/49b60f467979979cfe6913b43948ff25bca971ad0591d181812f163a988e/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:16db7c62ec0b8efe1d7afd283a388d8f74f2605d56032e5a37747d2de8dba027", size = 1250678, upload-time = "2026-05-17T17:47:43.702Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/74/ba/66ab9555de6275677566f6574e5ef6c29cb185ea866f643bc06f8280a8ee/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf5eb061eb5bccade4128ad42da33787d72f6013809cd1b590376ece8b3c937", size = 1301603, upload-time = "2026-05-17T17:47:46.256Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/42/6aca9b9abc710014b2be9059689e5dd1679339e78f567ffb4d255a9e2050/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:104e4a35bd7c124173c41760ef9aaea17ddb3f86c65cb643671d59afbe3ee94c", size = 1410332, upload-time = "2026-05-17T17:47:47.899Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/68/2f76594432a22581ecf878b5e75a9b8601c24b2241cf0bbeb1e21fcf370c/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:36be371028fc1675acb38a331bde160dbab7ff907fdf00b67eb6911aa106951b", size = 1509979, upload-time = "2026-05-17T17:47:50.942Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/ac/a93c9b58292653f6c595752f677a08e608f903b710594909e9231a389b3b/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:061ee58bdb52341c8201a6df41182a977736bae3b7ded87ca7176ca25a8a47ab", size = 1505002, upload-time = "2026-05-17T17:47:54.093Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/2e/b278f68c497ee2f1d1576cbbef8db5281cd4a5f2db040537592ac9c8862e/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b15219e9cdc9f53f6f4cb51c009203507228226148c05c5e8fe451c28b435eb3", size = 1456231, upload-time = "2026-05-17T17:47:56.311Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/43/419be1c566a4c504cd8fd60ce2f84e790f295495c0f327cfaeadf3d51012/ast_serialize-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:842d1c004bb466c7df036f95fabef789570541922b10976b12f5592a69cf0b38", size = 1058668, upload-time = "2026-05-17T17:47:58.305Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/6f/c9d4d549295ed05111aeb8853232d1afd9d0a179fddb01eeffbb3a4a6842/ast_serialize-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b0c06d760909b095cc466356dfccd05a1c7233a6ca191c020dca2c6a6f16c24c", size = 1101075, upload-time = "2026-05-17T17:48:00.35Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/8e/d00c5ab30c58222e07d62956fca86c59d91b9ad32997e633c38b526623a3/ast_serialize-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:787baedb0262cc49e8ce37cc15c00ae818e46a165a3b36f5e21ed174998104cb", size = 1075347, upload-time = "2026-05-17T17:48:01.753Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", size = 1068311, upload-time = "2026-05-17T17:48:25.027Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", size = 1108931, upload-time = "2026-05-17T17:48:26.591Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/19/cc8bd127d28a43da249aa955cfd164cf8fd534e79e42cea96c4854d72fd0/ast_serialize-0.5.0-cp39-abi3-win_arm64.whl", hash = "sha256:92a31c9c20d25a076edaeec76b128a3535d74a24f340b9a8a7e96c9b86dc9642", size = 1081181, upload-time = "2026-05-17T17:48:28.122Z" }, +] + +[[package]] +name = "babel" +version = "2.14.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "pytz", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/80/cfbe44a9085d112e983282ee7ca4c00429bc4d1ce86ee5f4e60259ddff7f/Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", size = 10795622, upload-time = "2023-12-12T13:33:16.473Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/35/4196b21041e29a42dc4f05866d0c94fa26c9da88ce12c38c2265e42c82fb/Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287", size = 11034798, upload-time = "2023-12-12T13:33:13.288Z" }, +] + +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "pytz", marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "certifi" +version = "2026.6.17" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/08/0f303cb0b529e456bb116f2d50565a482694fbb94340bf56d44677e7ed03/charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d", size = 315182, upload-time = "2026-04-02T09:25:40.673Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/47/b192933e94b546f1b1fe4df9cc1f84fcdbf2359f8d1081d46dd029b50207/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8", size = 209329, upload-time = "2026-04-02T09:25:42.354Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/b4/01fa81c5ca6141024d89a8fc15968002b71da7f825dd14113207113fabbd/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790", size = 231230, upload-time = "2026-04-02T09:25:44.281Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/f7/7b991776844dfa058017e600e6e55ff01984a063290ca5622c0b63162f68/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc", size = 225890, upload-time = "2026-04-02T09:25:45.475Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/e7/bed0024a0f4ab0c8a9c64d4445f39b30c99bd1acd228291959e3de664247/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393", size = 216930, upload-time = "2026-04-02T09:25:46.58Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e2/ab/b18f0ab31cdd7b3ddb8bb76c4a414aeb8160c9810fdf1bc62f269a539d87/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153", size = 202109, upload-time = "2026-04-02T09:25:48.031Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/e5/7e9440768a06dfb3075936490cb82dbf0ee20a133bf0dd8551fa096914ec/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af", size = 214684, upload-time = "2026-04-02T09:25:49.245Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/94/8c61d8da9f062fdf457c80acfa25060ec22bf1d34bbeaca4350f13bcfd07/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34", size = 212785, upload-time = "2026-04-02T09:25:50.671Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/cd/6e9889c648e72c0ab2e5967528bb83508f354d706637bc7097190c874e13/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1", size = 203055, upload-time = "2026-04-02T09:25:51.802Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/2e/7a951d6a08aefb7eb8e1b54cdfb580b1365afdd9dd484dc4bee9e5d8f258/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752", size = 232502, upload-time = "2026-04-02T09:25:53.388Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/d5/abcf2d83bf8e0a1286df55cd0dc1d49af0da4282aa77e986df343e7de124/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53", size = 214295, upload-time = "2026-04-02T09:25:54.765Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/3a/7d4cd7ed54be99973a0dc176032cba5cb1f258082c31fa6df35cff46acfc/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616", size = 227145, upload-time = "2026-04-02T09:25:55.904Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/98/3a45bf8247889cf28262ebd3d0872edff11565b2a1e3064ccb132db3fbb0/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a", size = 218884, upload-time = "2026-04-02T09:25:57.074Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/80/2e8b7f8915ed5c9ef13aa828d82738e33888c485b65ebf744d615040c7ea/charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374", size = 148343, upload-time = "2026-04-02T09:25:58.199Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/1b/3b8c8c77184af465ee9ad88b5aea46ea6b2e1f7b9dc9502891e37af21e30/charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943", size = 159174, upload-time = "2026-04-02T09:25:59.322Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/c1/feb40dca40dbb21e0a908801782d9288c64fc8d8e562c2098e9994c8c21b/charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008", size = 147805, upload-time = "2026-04-02T09:26:00.756Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/46/fce169ad09419b8e8a5a81db61e08cd7b9fd31332221b84bd176fe0a3136/charset_normalizer-3.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e5f4d355f0a2b1a31bc3edec6795b46324349c9cb25eed068049e4f472fb4259", size = 283148, upload-time = "2026-04-02T09:27:52.419Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/76/14ab25789e14f83124c4318f0edbbf15a6ed535bd3d88720c42001a954df/charset_normalizer-3.4.7-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16d971e29578a5e97d7117866d15889a4a07befe0e87e703ed63cd90cb348c01", size = 192457, upload-time = "2026-04-02T09:27:53.681Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/0e/0f722c41d983dd204b3142606fbfcdbb0a33c34b9b031ef3c1fe9e8187ad/charset_normalizer-3.4.7-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dca4bbc466a95ba9c0234ef56d7dd9509f63da22274589ebd4ed7f1f4d4c54e3", size = 209614, upload-time = "2026-04-02T09:27:55.01Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ef/ec/e7961eea9977a4d5ac920627e78938784272cb9b752cf1209da91e93d006/charset_normalizer-3.4.7-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e80c8378d8f3d83cd3164da1ad2df9e37a666cdde7b1cb2298ed0b558064be30", size = 205833, upload-time = "2026-04-02T09:27:56.648Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/85/cacf6d45cff52be431468ee4cfa6f625eb622ab8f23a892218af8c77094d/charset_normalizer-3.4.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36836d6ff945a00b88ba1e4572d721e60b5b8c98c155d465f56ad19d68f23734", size = 199240, upload-time = "2026-04-02T09:27:57.95Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/f1/40a59aae52edc5275e85813cbc49621c10758f481deeb27f71c97406cda0/charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_armv7l.whl", hash = "sha256:bd9b23791fe793e4968dba0c447e12f78e425c59fc0e3b97f6450f4781f3ee60", size = 188301, upload-time = "2026-04-02T09:27:59.351Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/53/6ea2906da0fd3773d57398e7cee5628d004d844b0c4903ea3038ae8488cd/charset_normalizer-3.4.7-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aef65cd602a6d0e0ff6f9930fcb1c8fec60dd2cfcb6facaf4bdb0e5873042db0", size = 197431, upload-time = "2026-04-02T09:28:00.634Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/52/f9/47a52cbcce0140f612ef7a37797b2929244bcaaf2f83ade3775429457252/charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:82b271f5137d07749f7bf32f70b17ab6eaabedd297e75dce75081a24f76eb545", size = 195156, upload-time = "2026-04-02T09:28:02.312Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/79/0e09d2169b7ba38a04e9660669d124ea688605f66189030e4c2be44d8e27/charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:1efde3cae86c8c273f1eb3b287be7d8499420cf2fe7585c41d370d3e790054a5", size = 188708, upload-time = "2026-04-02T09:28:03.949Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/20/8b3cefb78df39d40272d7831dda07b51875d89af1f390f97a801eaedec78/charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:c593052c465475e64bbfe5dbd81680f64a67fdc752c56d7a0ae205dc8aeefe0f", size = 211495, upload-time = "2026-04-02T09:28:05.301Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/47/3f/9bb0864a92b4abf0ec0d1f40546297f45afd73851795e3216c899b360aa0/charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:af21eb4409a119e365397b2adbaca4c9ccab56543a65d5dbd9f920d6ac29f686", size = 197309, upload-time = "2026-04-02T09:28:07.03Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/5e/0739d2975ae6fd42505fdb80881ab5e99b4edfbff1d581f4cd5aa94f2d94/charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:84c018e49c3bf790f9c2771c45e9313a08c2c2a6342b162cd650258b57817706", size = 207388, upload-time = "2026-04-02T09:28:08.381Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/5e/8161a7bbf4a7f88d0409091ab5a5762c014913c9ef80a48b50f806140918/charset_normalizer-3.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dd915403e231e6b1809fe9b6d9fc55cf8fb5e02765ac625d9cd623342a7905d7", size = 201139, upload-time = "2026-04-02T09:28:09.73Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/2a/c1f1f791467d865b48b749842c895668229e553dd79b71ad80498a0b646f/charset_normalizer-3.4.7-cp38-cp38-win32.whl", hash = "sha256:320ade88cfb846b8cd6b4ddf5ee9e80ee0c1f52401f2456b84ae1ae6a1a5f207", size = 142063, upload-time = "2026-04-02T09:28:11.394Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/5e/9e74560659e3f8a7650e09dac978749d408917c8e9764af13f5f81ceec53/charset_normalizer-3.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:1dc8b0ea451d6e69735094606991f32867807881400f808a106ee1d963c46a83", size = 151922, upload-time = "2026-04-02T09:28:12.77Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/01/1b/ef725f8eb19b5a261b30f78efa9252ef9d017985cb499102f6f49834cd12/charset_normalizer-3.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:177a0ba5f0211d488e295aaf82707237e331c24788d8d76c96c5a41594723217", size = 299121, upload-time = "2026-04-02T09:28:14.372Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/22/2f12878fbc680fbbb52386cd39a379801f62eaca74fc8b323381325f0f04/charset_normalizer-3.4.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e0d51f618228538a3e8f46bd246f87a6cd030565e015803691603f55e12afb5", size = 200612, upload-time = "2026-04-02T09:28:16.162Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/b6/10c84e789126ca97d4a7228863a30481e786980a8b8cfcbf4f30658ca63c/charset_normalizer-3.4.7-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:14265bfe1f09498b9d8ec91e9ec9fa52775edf90fcbde092b25f4a33d444fea9", size = 221041, upload-time = "2026-04-02T09:28:17.554Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/7b/c414866a138400b2e81973d006da7f694cfeaf895ef07d2cba9a8743841a/charset_normalizer-3.4.7-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87fad7d9ba98c86bcb41b2dc8dbb326619be2562af1f8ff50776a39e55721c5a", size = 216323, upload-time = "2026-04-02T09:28:18.863Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/92/bdcf94997e06b223d826df3abed45a5ad6e17f609b7df9d25cd23b5bde30/charset_normalizer-3.4.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f22dec1690b584cea26fade98b2435c132c1b5f68e39f5a0b7627cd7ae31f1dc", size = 208419, upload-time = "2026-04-02T09:28:20.332Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/64/3f9142293c88b1b10e199649ed1330f070c2a68e305335a5819fa7f25fa7/charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:d61f00a0869d77422d9b2aba989e2d24afa6ffd552af442e0e58de4f35ea6d00", size = 195016, upload-time = "2026-04-02T09:28:21.657Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/d1/d8a6b7dd5c5636b76ce0d080bc57d8e56c7bbd6bc2ac941529a35e41d84a/charset_normalizer-3.4.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6370e8686f662e6a3941ee48ed4742317cafbe5707e36406e9df792cdb535776", size = 206115, upload-time = "2026-04-02T09:28:23.259Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dd/8c/60ebe912379627d023eb96995b40bc50308729f210f43d66109ca0a7bbd2/charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a6c5863edfbe888d9eff9c8b8087354e27618d9da76425c119293f11712a6319", size = 204022, upload-time = "2026-04-02T09:28:24.779Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/2a/41816ceda78a551cbfdfbeab6f3891152b0e3f758ce6580c2c18c829f774/charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:ed065083d0898c9d5b4bbec7b026fd755ff7454e6e8b73a67f8c744b13986e24", size = 195914, upload-time = "2026-04-02T09:28:26.181Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/9b/7c7f4b7f11525fcbdfba752455314ac60646bae91cdd671d531c1f7a97c6/charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2cd4a60d0e2fb04537162c62bbbb4182f53541fe0ede35cdf270a1c1e723cc42", size = 222159, upload-time = "2026-04-02T09:28:27.504Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/57/301682e7469bdbfa2ce219a804f0668b2266ab8520570d85d3b3ef483ea3/charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:813c0e0132266c08eb87469a642cb30aaff57c5f426255419572aaeceeaa7bf4", size = 206154, upload-time = "2026-04-02T09:28:28.848Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/ec/90339ff5cdc598b265748c1f231c7d7fbd9123a92cee10f757e0b1448de4/charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:07d9e39b01743c3717745f4c530a6349eadbfa043c7577eef86c502c15df2c67", size = 217423, upload-time = "2026-04-02T09:28:30.248Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2e/e7/a7a6147f8e3375676309cf584b25c72a3bab784ea4085b0011fa07b23aeb/charset_normalizer-3.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c0f081d69a6e58272819b70288d3221a6ee64b98df852631c80f293514d3b274", size = 210604, upload-time = "2026-04-02T09:28:31.736Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/62/d9340c7a79c393e57807d7fb6c57e82060687891f81b74d3201958b919c1/charset_normalizer-3.4.7-cp39-cp39-win32.whl", hash = "sha256:8751d2787c9131302398b11e6c8068053dcb55d5a8964e114b6e196cf16cb366", size = 144631, upload-time = "2026-04-02T09:28:33.158Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/e7/92901117e2ddc8facfe8235a3ecd4eb482185b2ad5d5b6606b37c1afea06/charset_normalizer-3.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:12a6fff75f6bc66711b73a2f0addfc4c8c15a20e805146a02d147a318962c444", size = 154710, upload-time = "2026-04-02T09:28:34.557Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/4f/e1fb138201ad9a32499dd9a98aa4a5a5441fbf7f56b52b619a54b7ee8777/charset_normalizer-3.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:bb8cc7534f51d9a017b93e3e85b260924f909601c3df002bcdb58ddb4dc41a5c", size = 143716, upload-time = "2026-04-02T09:28:35.908Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "docutils" +version = "0.19" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/5c/330ea8d383eb2ce973df34d1239b3b21e91cd8c865d21ff82902d952f91f/docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6", size = 2056383, upload-time = "2022-07-05T20:17:31.045Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/69/e391bd51bc08ed9141ecd899a0ddb61ab6465309f1eb470905c0c8868081/docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc", size = 570472, upload-time = "2022-07-05T20:17:26.388Z" }, +] + +[[package]] +name = "docutils" +version = "0.20.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/53/a5da4f2c5739cf66290fac1431ee52aff6851c7c8ffd8264f13affd7bcdd/docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b", size = 2058365, upload-time = "2023-05-16T23:39:19.748Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", size = 572666, upload-time = "2023-05-16T23:39:15.976Z" }, +] + +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, +] + +[[package]] +name = "docutils" +version = "0.22.4" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, +] + +[[package]] +name = "docxcompose" +version = "1.4.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] +dependencies = [ + { name = "babel", version = "2.14.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "babel", version = "2.18.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.8' and python_full_version < '3.10'" }, + { name = "lxml", version = "5.4.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "lxml", version = "6.1.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.8' and python_full_version < '3.10'" }, + { name = "python-docx", version = "1.1.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "python-docx", version = "1.1.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "python-docx", version = "1.2.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "six", marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/9d/699dfad94b9454ec911ba0183ac58213ce5295f19d6ed7393aefeadda40e/docxcompose-1.4.1.tar.gz", hash = "sha256:e816c3e73adce1f816054fcd0a7f7e0632e99b2155e6c6f56582d1c55c685135", size = 23128, upload-time = "2026-03-14T17:42:52.144Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/03/053f291ee7ad6a3fd5a20eef3ff73925fe815803335180808582719f2c06/docxcompose-1.4.1-py3-none-any.whl", hash = "sha256:8a0a5c6f5bc8f4c0b2691d9714aac7195c05229c24d2dffc2222b5bdec547258", size = 24120, upload-time = "2026-03-14T17:42:50.667Z" }, +] + +[[package]] +name = "docxcompose" +version = "2.2.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "babel", version = "2.18.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.10'" }, + { name = "lxml", version = "6.1.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.10'" }, + { name = "python-docx", version = "1.2.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/10/d0941047b177c0b6eb95138b15949ca59a8ddb1d7266d10dc384d0dba681/docxcompose-2.2.0.tar.gz", hash = "sha256:e2c69703a2fefad4471aad82861a1c5d7b3f4a669510de504bb36f41f66f6d3e", size = 22036, upload-time = "2026-06-02T12:18:11.083Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/70/121090145cb543e48da7421e64036e6484bfbbc40fc619d73599dc22eb2e/docxcompose-2.2.0-py3-none-any.whl", hash = "sha256:fcfec8b0ba7d341bd3280cb92b571ed2f9e868bbd0d6750ea9539e0ab0bb49a1", size = 25738, upload-time = "2026-06-02T12:18:09.963Z" }, +] + +[[package]] +name = "docxtpl" +source = { editable = "." } +dependencies = [ + { name = "jinja2" }, + { name = "lxml", version = "5.4.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "lxml", version = "6.1.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.8'" }, + { name = "python-docx", version = "1.1.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "python-docx", version = "1.1.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "python-docx", version = "1.2.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.9'" }, +] + +[package.optional-dependencies] +docs = [ + { name = "sphinx", version = "5.3.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "sphinx", version = "7.1.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "sphinx", version = "7.4.7", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-napoleon" }, +] +subdoc = [ + { name = "docxcompose", version = "1.4.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.10'" }, + { name = "docxcompose", version = "2.2.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.10'" }, +] + +[package.dev-dependencies] +dev = [ + { name = "flake8", marker = "python_full_version >= '3.9'" }, + { name = "lxml-stubs", marker = "python_full_version >= '3.9'" }, + { name = "mypy", version = "1.19.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "mypy", version = "2.1.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.10'" }, +] + +[package.metadata] +requires-dist = [ + { name = "docxcompose", marker = "extra == 'subdoc'" }, + { name = "jinja2" }, + { name = "lxml" }, + { name = "python-docx" }, + { name = "sphinx", marker = "extra == 'docs'" }, + { name = "sphinxcontrib-napoleon", marker = "extra == 'docs'" }, +] +provides-extras = ["docs", "subdoc"] + +[package.metadata.requires-dev] +dev = [ + { name = "flake8", marker = "python_full_version >= '3.9'", specifier = ">=7.3.0" }, + { name = "lxml-stubs", marker = "python_full_version >= '3.9'", specifier = ">=0.5.1" }, + { name = "mypy", marker = "python_full_version >= '3.9'", specifier = ">=1.18.2" }, +] + +[[package]] +name = "flake8" +version = "7.3.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +dependencies = [ + { name = "mccabe", marker = "python_full_version >= '3.9'" }, + { name = "pycodestyle", marker = "python_full_version >= '3.9'" }, + { name = "pyflakes", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9b/af/fbfe3c4b5a657d79e5c47a2827a362f9e1b763336a52f926126aa6dc7123/flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872", size = 48326, upload-time = "2025-06-20T19:31:35.838Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "idna" +version = "3.15" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "imagesize" +version = "1.5.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/59/4b0dd64676aa6fb4986a755790cb6fc558559cf0084effad516820208ec3/imagesize-1.5.0.tar.gz", hash = "sha256:8bfc5363a7f2133a89f0098451e0bcb1cd71aba4dc02bbcecb39d99d40e1b94f", size = 1281127, upload-time = "2026-03-03T01:59:54.651Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/b1/a0662b03103c66cf77101a187f396ea91167cd9b7d5d3a2e465ad2c7ee9b/imagesize-1.5.0-py2.py3-none-any.whl", hash = "sha256:32677681b3f434c2cb496f00e89c5a291247b35b1f527589909e008057da5899", size = 5763, upload-time = "2026-03-03T01:59:52.343Z" }, +] + +[[package]] +name = "imagesize" +version = "2.0.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "6.7.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "zipp", version = "3.15.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569, upload-time = "2023-06-18T21:44:35.024Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5", size = 22934, upload-time = "2023-06-18T21:44:33.441Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.5.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "zipp", version = "3.20.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", size = 55304, upload-time = "2024-09-11T14:56:08.937Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", size = 26514, upload-time = "2024-09-11T14:56:07.019Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "zipp", version = "3.23.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +dependencies = [ + { name = "markupsafe", version = "2.1.5", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.9'" }, + { name = "markupsafe", version = "3.0.3", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "librt" +version = "0.11.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/08/9e7f6b5d2b5bed6ad055cdd5925f192bb403a51280f86b56554d9d0699a2/librt-0.11.0.tar.gz", hash = "sha256:075dc3ef4458a278e0195cbf6ac9d38808d9b906c5a6c7f7f79c3888276a3fb1", size = 200139, upload-time = "2026-05-10T18:17:25.138Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/10/37fd9e9ba96cb0bd742dfb20fc3d082e54bdbec759d7300df927f360ef07/librt-0.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e94ebfcfa2d5e9926d6c3b9aa4617ffc42a845b4321fb84021b872358c82a0f", size = 141706, upload-time = "2026-05-10T18:15:16.129Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/72/1b1466f358e4a0b728051f69bc27e67b432c6eaa2e05b88db49d3785ae0d/librt-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ae627397a2f351560440d872d6f7c8dbb4072e57868e7b2fc5b8b430fe489d45", size = 142605, upload-time = "2026-05-10T18:15:18.148Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/85/ed26dd2f6bc9a0baf48306433e579e8d354d70b2bcb78134ed950a5d0e1e/librt-0.11.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc329359321b67d24efdf4bc69012b0597001649544db662c001db5a0184794c", size = 476555, upload-time = "2026-05-10T18:15:19.569Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/fe/11891191c0e0a3fd617724e891f6e67a71a7658974a892b9a9a97fdb2977/librt-0.11.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:7e82e642ab0f7608ce2fe53d76ca2280a9ee33a1b06556142c7c6fe80a86fc33", size = 468434, upload-time = "2026-05-10T18:15:20.87Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/50/5ec949d7f9ce1a07af903aa3e13abb98b717923bdead6e719b2f824ccc07/librt-0.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88145c15c67731d54283d135b03244028c750cc9edc334a96a4f5950ebdb2884", size = 496918, upload-time = "2026-05-10T18:15:22.616Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ea/c4/177336c7524e34875a38bf668e88b193a6723a4eb4045d07f74df6e1506c/librt-0.11.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d36a51b3d93320b686588e27123f4995804dbf1bce81df78c02fc3c6eea9280", size = 490334, upload-time = "2026-05-10T18:15:24.2Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/1f/da3112f7569eda3b49f9a2629bae1fe059812b6085df16c885f6454dff49/librt-0.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3ac06a2a8b246327f11e186a53a100a4d5c7ed52346367e5ec751d51586c", size = 511287, upload-time = "2026-05-10T18:15:26.226Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/94/03fec301522e172d105581431223be56b27594ff46440ebfbb658a3735d5/librt-0.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:461bbceede621f1ffb8839755f8663e886087ee7af16294cab7fb4d782c62eeb", size = 517202, upload-time = "2026-05-10T18:15:27.965Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/6e/339f6e5a7b413ce014f1917a756dae630fe59cc99f34153205b1cb540901/librt-0.11.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0cad8a4d6a8ff03c9b76f9414caccd78e7cfbc8a2e12fa334d8e1d9932753783", size = 497517, upload-time = "2026-05-10T18:15:29.614Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/43/acdd5ce317cb46e8253ca9bfbdb8b12e68a24d745949336a7f3d5fb79ba0/librt-0.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f37aa505b3cf60701562eddb32df74b12a9e380c207fd8b06dd157a943ac7ea0", size = 538878, upload-time = "2026-05-10T18:15:30.928Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/b5/7a25bb12e3172839f647f196b3e988318b7bb1ca7501732a225c4dce2ec0/librt-0.11.0-cp310-cp310-win32.whl", hash = "sha256:94663a21534637f0e787ec2a2a756022df6e5b7b2335a5cdd7d8e33d68a2af89", size = 100070, upload-time = "2026-05-10T18:15:32.551Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/0d/ebbcf4d77999c02c937b05d2b90ff4cd4dcc7e9a365ba132329ac1fe7a0f/librt-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:dec7db73758c2b54953fd8b7fe348c45188fe26b39ee18446196edd08453a5d4", size = 117918, upload-time = "2026-05-10T18:15:33.678Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/87/2bf31fe17587b29e3f93ec31421e2b1e1c3e349b8bf6c7c313dbad1d5340/librt-0.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93d95bd45b7d58343d8b90d904450a545144eec19a002511163426f8ab1fae29", size = 141092, upload-time = "2026-05-10T18:15:34.795Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/08/5c5bf772920b7ebac6e32bc91a643e0ab3870199c0b542356d3baa83970a/librt-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ee278c769a713638cdacd4c0436d72156e75df3ebc0166ab2b9dc43acc386c9", size = 142035, upload-time = "2026-05-10T18:15:36.242Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/20/662a03d254e5b000d838e8b345d83303ddb768c080fd488e40634c0fa66b/librt-0.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f230cb1cbc9faaa616f9a678f530ebcf186e414b6bcbd88b960e4ba1b92428d5", size = 475022, upload-time = "2026-05-10T18:15:37.56Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/f3/aa81523e45184c6ec23dc7f63263362ec55f80a09d424c012359ecbe7e35/librt-0.11.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5d63c855d86938d9de93e265c9bd8c705b51ec494de5738340ee93767a686e4b", size = 467273, upload-time = "2026-05-10T18:15:39.182Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/6f/59c74b560ca8853834d5501d589c8a2519f4184f273a085ffd0f37a1cc47/librt-0.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f028be9e96a08d31df3479ac80d99be374d17f3b78e4796b3fd3c913d4e89", size = 497083, upload-time = "2026-05-10T18:15:40.634Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fe/7b/5aa4d2c9600a719401160bf7055417df0b2a47439b9d88286ce45e56b65f/librt-0.11.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:258d73a0aa66a055e65b2e4d1b8cdb23b9d132c5bb915d9547d804fcaed116cc", size = 489139, upload-time = "2026-05-10T18:15:41.934Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/31/9143803d7da6856a69153785768c4936864430eec0fd9461c3ea527d9922/librt-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0827efe7854718f04aaddf6496e96960a956e676fe1d0f04eb41511fd8ad06d5", size = 508442, upload-time = "2026-05-10T18:15:43.206Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/5a/bce08184488426bda4ccc2c4964ac048c8f68ae89bd7120082eef4233cfd/librt-0.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7753e57d6e12d019c0d8786f1c09c709f4c3fcc57c3887b24e36e6c06ec938b7", size = 514230, upload-time = "2026-05-10T18:15:44.761Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/8c/bb5e213d254b7505a0e658da199d8ab719086632ce09eef311ab27976523/librt-0.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:11bd19822431cc21af9f27374e7ae2e58103c7d98bda823536a6c47f6bb2bb3d", size = 494231, upload-time = "2026-05-10T18:15:46.308Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/fb/541cdad5b1ab1300398c74c4c9a497b88e5074c21b1244c8f49731d3a284/librt-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:22bdf239b219d3993761a148ffa134b19e52e9989c84f845d5d7b71d70a17412", size = 537585, upload-time = "2026-05-10T18:15:47.629Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/f2/464bb69295c320cb06bddb4f14a4ec67934ee14b2bffb12b19fb7ab287ba/librt-0.11.0-cp311-cp311-win32.whl", hash = "sha256:46c60b61e308eb535fbd6fa622b1ee1bb2815691c1ad9c98bf7b84952ec3bc8d", size = 100509, upload-time = "2026-05-10T18:15:49.157Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/e7/a17ee1788f9e4fbf548c19f4afa07c92089b9e24fef6cb2410863781ef4c/librt-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:902e546ff044f579ff1c953ff5fce97b636fe9e3943996b2177710c6ef076f73", size = 118628, upload-time = "2026-05-10T18:15:50.345Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/c7/6c766214f9f9903bcfcfbef97d807af8d8f5aa3502d247858ab17582d212/librt-0.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:65ac3bc20f78aa0ee5ae84baa68917f89fef4af63e941084dd019a0d0e749f0c", size = 103122, upload-time = "2026-05-10T18:15:52.068Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/d0/07c77e067f0838949b43bd89232c29d72efebb9d2801a9750184eb706b71/librt-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b87504f1690a23b9a2cca841191a04f83895d4fc2dd04df91d82b1a04ca2ad46", size = 144147, upload-time = "2026-05-10T18:15:53.227Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/24/8493538fa4f62f982686398a5b8f68008138a75086abdea19ade64bf4255/librt-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40071fc5fe0ce8daa6de616702314a01e1250711682b0523d6ab8d4525910cb3", size = 143614, upload-time = "2026-05-10T18:15:54.657Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/1e/f8bad050810d9171f34a1648ed910e56814c2ba61639f2bd53c6377ae24b/librt-0.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:137e79445c896a0ea7b265f52d23954e05b64222ee1af69e2cb34219067cbb67", size = 485538, upload-time = "2026-05-10T18:15:56.117Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/fe/3594ebfbaf03084ba4b120c9ba5c3183fd938a48725e9bbe6ff0a5159ad8/librt-0.11.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:cca6644054e78746d8d4ef238681f9c34ff8b584fe6b988ecebb8db3b15e622a", size = 479623, upload-time = "2026-05-10T18:15:57.544Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/da/5d1876984b3746c85dbd219dbfcb73c85f54ee263fd32e5b2a632ec14571/librt-0.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5b0eea49f5562861ee8d757a32ef7d559c1d35be2aaaa1ec28941d74c9ffc8a", size = 513082, upload-time = "2026-05-10T18:15:58.805Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/6e/55bdf5d5ca00c3e18430690bf2c953d8d3ffd3c337418173d33dec985dc9/librt-0.11.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d1029d7e1ae1a7e647ed6fb5df8c4ce2dffefb7a9f5fd1376a4554d96dac09f", size = 508105, upload-time = "2026-05-10T18:16:00.2Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/10/f1f23a7c595ee90ece4d35c851e5d104b1311a887ed1b4ac4c35bbd13da8/librt-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc3ce6b33c5828d9e80592011a5c584cb2ce86edbc4088405f70da47dc1d1b3b", size = 522268, upload-time = "2026-05-10T18:16:01.708Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b6/02/5720f5697a7f54b78b3aefbe20df3a48cedcff1276618c4aa481177942ed/librt-0.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:936c5995f3514a42111f20099397d8177c79b4d7e70961e396c6f5a0a3566766", size = 527348, upload-time = "2026-05-10T18:16:03.496Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/db/b4a47c6f91db4ff76348a0b3dd0cc65e090a078b765a810a62ff9434c3d3/librt-0.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9bc0ca6ad9381cbe8e4aa6e5726e4c80c78115a6e9723c599ed1d73e092bc49d", size = 516294, upload-time = "2026-05-10T18:16:05.173Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/58/9384b2f4eb1ed1d273d40948a7c5c4b2360213b402ef3be4641c06299f9c/librt-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:070aa8c26c0a74774317a72df8851facc7f0f012a5b406557ac56992d92e1ec8", size = 553608, upload-time = "2026-05-10T18:16:06.839Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/7b/5aa8848a7c6a9278c79375146da1812e695754ceec5f005e6043461a7315/librt-0.11.0-cp312-cp312-win32.whl", hash = "sha256:6bf14feb84b05ae945277395451998c89c54d0def4070eb5c08de544930b245a", size = 101879, upload-time = "2026-05-10T18:16:08.103Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/33/8a745436944947575b584231750a41417de1a38cf6a2e9251d1065651c09/librt-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:75672f0bc524ede266287d532d7923dbce94c7514ad07627bac3d0c6d92cc4d9", size = 119831, upload-time = "2026-05-10T18:16:09.174Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/59/67/a6739ac96e28b7855808bdb0370e250606104a859750d209e5a0716fe7ab/librt-0.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f10cf143e4a9bb0f4f5af568a00df94a2d69ef41c2579584454bb0fe5cc642c", size = 103470, upload-time = "2026-05-10T18:16:10.369Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/61/e59168d4d0bf2bf90f4f0caf7a001bfc60254c3af4586013b04dc3ef517b/librt-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78dc31f7fdfe9c9d0eb0e8f42d139db230e826415bbcabd9f0e9faaaee909894", size = 144119, upload-time = "2026-05-10T18:16:11.771Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/fd/caa1d60b12f7dd79ccea23054e06eeaebe266a5f52c40a6b651069200ce5/librt-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fa475675db22290c3158e1d42326d0f5a65f04f44a0e68c3630a25b53560fb9c", size = 143565, upload-time = "2026-05-10T18:16:13.334Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/a9/dc744f5c2b4978d48db970be29f22716d3413d28b14ad99740817315cf2c/librt-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:621db29691044bdeda22e789e482e1b0f3a985d90e3426c9c6d17606416205ea", size = 485395, upload-time = "2026-05-10T18:16:14.729Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8f/21/7f8e97a1e4dae952a5a95948f6f8507a173bc1e669f54340bba6ca1ca31b/librt-0.11.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a9010e2ed5b3a9e158c5fd966b3ab7e834bb3d3aacc8f66c91dd4b57a3799230", size = 479383, upload-time = "2026-05-10T18:16:16.321Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/6d/d8ee9c114bebf2c50e29ec2aa940826fccb62a645c3e4c18760987d0e16d/librt-0.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c39513d8b7477a2e1ed8c43fc21c524e8d5a0f8d4e8b7b074dbdbe7820a08e2", size = 513010, upload-time = "2026-05-10T18:16:17.647Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/43/0b5708af2bd30a46400e72ba6bdaa8f066f15fb9a688527e34220e8d6c06/librt-0.11.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7aef3cf1d5af86e770ab04bfd993dfc4ae8b8c17f66fb77dd4a7d50de7bbb1a3", size = 508433, upload-time = "2026-05-10T18:16:19.309Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/50/356187247d09013490481033183b3532b58acf8028bcb34b2b56a375c9b2/librt-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:557183ddc36babe46b27dd60facbd5adb4492181a5be887587d57cda6e092f21", size = 522595, upload-time = "2026-05-10T18:16:20.642Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/e7/c6ac4240899c7f3248079d5a9900debe0dadb3fdeaf856684c987105ba47/librt-0.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83d3e1f72bd42f6c5c0b7daec530c3f829bd02db42c70b8ddf0c2d90a2459930", size = 527255, upload-time = "2026-05-10T18:16:22.352Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/b5/a81322dbeedeeaf9c1ee6f001734d28a09d8383ac9e6779bc24bbd0743c6/librt-0.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4ce1f21fbe589bc1afd7872dece84fb0e1144f794a288e58a10d2c54a55c43be", size = 516847, upload-time = "2026-05-10T18:16:23.627Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/66/6e6323787d592b55204a42595ff1102da5115601b53a7e9ddebc889a6da5/librt-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b09f7044ea2b64c9da42fd3d335666518cfd1c6e8a182c95da73d0214b41e", size = 553920, upload-time = "2026-05-10T18:16:25.025Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/21/623f8ca230857102066d9ca8c6c1734995908c4d0d1bee7bb2ef0021cb33/librt-0.11.0-cp313-cp313-win32.whl", hash = "sha256:78fddc31cd4d3caa897ad5d31f856b1faadc9474021ad6cb182b9018793e254e", size = 101898, upload-time = "2026-05-10T18:16:26.649Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/1d/b4ebd44dd723f768469007515cb92251e0ae286c94c140f374801140fa74/librt-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ca8aa88751a775870b764e93bad5135385f563cb8dcee399abf034ea4d3cb47", size = 119812, upload-time = "2026-05-10T18:16:27.859Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/e4/b2f4ca7965ca373b491cdb4bc25cdb30c1649ca81a8782056a83850292a9/librt-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:96f044bb325fd9cf1a723015638c219e9143f0dfbc0ca54c565df2b7fc748b44", size = 103448, upload-time = "2026-05-10T18:16:29.066Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/eb/dbce197da4e227779e56b5735f2decc3eb36e55a1cdbf1bd65d6639d76c1/librt-0.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4a017a95e5837dc15a8c5661d60e05daa96b90908b1aa6b7acdf443cd25c8ebd", size = 143345, upload-time = "2026-05-10T18:16:30.674Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/a3/254bebd0c11c8ba684018efb8006ff22e466abce445215cca6c778e7d9de/librt-0.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b1ecbd9819deccc39b7542bf4d2a740d8a620694d39989e58661d3763458f8d4", size = 143131, upload-time = "2026-05-10T18:16:32.037Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/3f/f77d6122d21ac7bf6ae8a7dfced1bd2a7ac545d3273ebdcaf8042f6d619f/librt-0.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7da327dacd7be8f8ec36547373550744a3cc0e536d54665cd83f8bcd961200e8", size = 477024, upload-time = "2026-05-10T18:16:33.493Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/0a/2c996dadebaa7d9bbbd43ef2d4f3e66b6da545f838a41694ef6172cebec8/librt-0.11.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0dc56b1f8d06e60db362cc3fdae206681817f86ce4725d34511473487f12a34b", size = 474221, upload-time = "2026-05-10T18:16:34.864Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/7e/f5d92af8486b8272c23b3e686b46ff72d89c8169585eb61eef01a2ac7147/librt-0.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb8fb2ab90e21c8d12ea240d744ad514da9baf381ebfa70d91d20d21713175", size = 505174, upload-time = "2026-05-10T18:16:36.705Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/1a/cb0734fe86398eb33193ab753b7326255c74cac5eb09e76b9b16536e7adb/librt-0.11.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae74872be221df4374d10fec61f93ed1513b9546ea84f2c0bf73ab3e9bd0b03", size = 497216, upload-time = "2026-05-10T18:16:38.418Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/06/094820f91558b66e29943c0ec41c9914f460f48dd51fc503c3101e10842d/librt-0.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32bcc918c0148eb7e3d57385125bac7e5f9e4359d05f07448b09f6f778c2f31c", size = 513921, upload-time = "2026-05-10T18:16:39.848Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/c2/00de9018871a282f530cacb457d5ec0428f6ac7e6fedde9aff7468d9fb04/librt-0.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f9743fc99135d5f78d2454435615f6dec0473ca507c26ce9d92b10b562a280d3", size = 520850, upload-time = "2026-05-10T18:16:41.471Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/9d/64631832348fd1834fb3a61b996434edddaaf25a31d03b0a76273159d2cf/librt-0.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5ba067f4aadae8fda802d91d2124c90c42195ff32d9161d3549e6d05cfe26f96", size = 504237, upload-time = "2026-05-10T18:16:43.15Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/ec/ae5525eb16edc827a044e7bb8777a455ff95d4bca9379e7e6bddd7383647/librt-0.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:de3bf945454d032f9e390b85c4072e0a0570bf825421c8be0e71209fa65e1abe", size = 546261, upload-time = "2026-05-10T18:16:44.408Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/09/adce371f27ca039411da9659f7430fcc2ba6cd0c7b3e4467a0f091be7fa9/librt-0.11.0-cp314-cp314-win32.whl", hash = "sha256:d2277a05f6dcb9fd13db9566aac4fabd68c3ea1ea46ee5567d4eef8efa495a2f", size = 96965, upload-time = "2026-05-10T18:16:46.039Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/ee/8ac720d98548f173c7ce2e632a7ca94673f74cacd5c8162a84af5b35958a/librt-0.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:ab73e8db5e3f564d812c1f5c3a175930a5f9bc96ccb5e3b22a34d7858b401cf7", size = 115151, upload-time = "2026-05-10T18:16:47.133Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/20/c900cf14efeb09b6bef2b2dff20779f73464b97fd58d1c6bccc379588ae3/librt-0.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aea3caa317752e3a466fa8af45d91ee0ea8c7fdd96e42b0a8dd9b76a7931eba1", size = 98850, upload-time = "2026-05-10T18:16:48.597Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/71/944bfe4b64e12abffcd3c15e1cce07f72f3d55655083786285f4dedeb532/librt-0.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d1b36540d7aaf9b9101b3a6f376c8d8e9f7a9aec93ed05918f2c69d493ffef72", size = 151138, upload-time = "2026-05-10T18:16:49.839Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b6/10/99e64a5c86989357fda078c8143c533389585f6473b7439172dd8f3b3b2d/librt-0.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:efbb343ab2ce3540f4ecbe6315d677ed70f37cd9a72b1e58066c918ca83acbaa", size = 151976, upload-time = "2026-05-10T18:16:51.062Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/31/5072ad880946d83e5ea4147d6d018c78eefce85b77819b19bdd0ee229435/librt-0.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0dd688aab3f7914d3e6e5e3554978e0383312fb8e771d84be008a35b9ee548", size = 557927, upload-time = "2026-05-10T18:16:52.632Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/8d/70b5fb7cfbab60edbe7381614ab985da58e144fbf465c86d44c95f43cdca/librt-0.11.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f5fb36b8c6c63fdcbb1d526d94c0d1331610d43f4118cc1beb4efef4f3faacb2", size = 539698, upload-time = "2026-05-10T18:16:53.934Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/a3/ba3495a0b3edbd24a4cae0d1d3c64f39a9fc45d06e812101289b50c1a619/librt-0.11.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a9a237d13addb93715b6fee74023d5ee3469b53fce527626c0e088aa585805f", size = 577162, upload-time = "2026-05-10T18:16:55.589Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f7/db/36e25fb81f99937ff1b96612a1dc9fd66f039cb9cc3aee12c01fac31aab9/librt-0.11.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ddd17bd87b2c56ddd60e546a7984a2e64c4e8eab92fb4cf3830a48ad5469d51", size = 566494, upload-time = "2026-05-10T18:16:56.975Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/0d/3f622b47f0b013eeb9cf4cc07ae9bfe378d832a4eec998b2b209fe84244d/librt-0.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd43992b4473d42f12ff9e68326079f0696d9d4e6000e8f39a0238d482ba6ee2", size = 596858, upload-time = "2026-05-10T18:16:58.374Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/02/71b90bc93039c46a2000651f6ad60122b114c8f54c4ad306e0e96f5b75ad/librt-0.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f8e3e8056dd674e279741485e2e512d6e9a751c7455809d0114e6ebf8d781085", size = 590318, upload-time = "2026-05-10T18:16:59.676Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/04/418cb3f75621e2b761fb1ab0f017f4d70a1a72a6e7c74ee4f7e8d198c2f3/librt-0.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c1f708d8ae9c56cf38a903c44297243d2ec83fd82b396b977e0144a3e76217e3", size = 575115, upload-time = "2026-05-10T18:17:01.007Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cc/2c/5a2183ac58dd911f26b5d7e7d7d8f1d87fcecdddd99d6c12169a258ff62c/librt-0.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0add982e0e7b9fc14cf4b33789d5f13f66581889b88c2f58099f6ce8f92617bd", size = 617918, upload-time = "2026-05-10T18:17:02.682Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/1f/dc6771a52592a4451be6effa200cbfc9cec61e4393d3033d81a9d307961d/librt-0.11.0-cp314-cp314t-win32.whl", hash = "sha256:2b481d846ac894c4e8403c5fd0e87c5d11d6499e404b474602508a224ff531c8", size = 103562, upload-time = "2026-05-10T18:17:03.99Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/4a/7d1415567027286a75ba1093ec4aca11f073e0f559c530cf3e0a757ad55c/librt-0.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:28edb433edde181112a908c78907af28f964eabc15f4dd16c9d66c834302677c", size = 124327, upload-time = "2026-05-10T18:17:05.465Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/62/b40b382fa0c66fee1478073eb8db352a4a6beda4a1adccf1df911d8c289c/librt-0.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dee008f20b542e3cd162ba338a7f9ec0f6d23d395f66fe8aeeec3c9d067ea253", size = 102572, upload-time = "2026-05-10T18:17:06.809Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/54/5d5f27cc840d2d8a64d60e0650dba14044a95d85a875e42af2eb104ac8b9/librt-0.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bd72d903911d995ab666dbd1871f8b1e80925a699af8063fbf50053329fb05f", size = 142475, upload-time = "2026-05-10T18:17:08.263Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/72/535efe79cf47f70975e0b14ceb3b7984bb7e8b97fb2867d3979771be0b6a/librt-0.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ef69ac715f3cd8e5cd252cb2aebfa72c015492aacc339d5d7bf8fef3c62c677", size = 143365, upload-time = "2026-05-10T18:17:09.565Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/cc/4130d462aeaf190357517d2a48a0a25030fbfd604230f6c45908452fff9c/librt-0.11.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:624a40c4a4ad7773315c287276cd024509b2c66ff5904f504bfc08d2c70293ab", size = 475743, upload-time = "2026-05-10T18:17:10.822Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/e8/3c8000edefeb443fd2139692fb966f6c5556cb1032c44f734550896df3b9/librt-0.11.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:41dc19fe150b69716c8ece4f76773a9e8813fe3e35e032a58b4d46423fb8d7c0", size = 467088, upload-time = "2026-05-10T18:17:12.273Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/a1/6de754256493924874e5fa6c0f4f990d8b101c38d974589020d9dc3d02af/librt-0.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e8bd98ea9c47ae90b319a087ab28dac493f1ffbc1ecd1f28fcdbf3b7e1108d1", size = 496277, upload-time = "2026-05-10T18:17:13.662Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/fb/c34cb5358d6f993f85014045decd6dccd089a6f11d188660e062ee6262ff/librt-0.11.0-cp39-cp39-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:84308fc49423ce6475d1c5d1985cd69a8ca9f0325fc7d5f81bb690a3f3625d4e", size = 489320, upload-time = "2026-05-10T18:17:15.232Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/65/7761d70841bac875be9627496546b2eccbdeb07da3e42431bc4a40cf0819/librt-0.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ff0fbaf5f44a21beeb0110f2ab64f45135a9536a834b79c0d1ef018f2786bbfa", size = 510221, upload-time = "2026-05-10T18:17:16.595Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/8d/af9d4ac1057cd4e472b89553924b528b3d34afa6b7167645b7e6db39596b/librt-0.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9c028a9442a18e266955d364ce42259136e79a7ba14d773e0d778d5f70cd56f1", size = 516650, upload-time = "2026-05-10T18:17:18.245Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/86/f4/08faaf48ce0833d3717ebe0a0054c09a05df1bc83ee2715113c9901cc147/librt-0.11.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:9f1692105a02bcf853f355032a5fdc5494358ef83d8fd22d16de375c85cec3f5", size = 496622, upload-time = "2026-05-10T18:17:19.857Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/11/ec3e390627f70477093909875a38843c826ee2ff554d1649645c7cc59248/librt-0.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7a80a71e1fda83cc752a9141e87aae7fef279538597564d670e9ce513f286192", size = 538049, upload-time = "2026-05-10T18:17:21.221Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/a7/649401dae7ea8645dd218aa2d9c351afa7b9e0645f07dc8776a1972c0cad/librt-0.11.0-cp39-cp39-win32.whl", hash = "sha256:140695816ddf3c86eb972981a26f35efd871c44b0c3aed44c8cd01749386617f", size = 100360, upload-time = "2026-05-10T18:17:22.537Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/7e/6a9711d78f338445e36992a90071962294f5bab388b554ef8a313e6412dd/librt-0.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:92f7ff819c197fc30473190a12c2856f325ac90aabfccbeb2072d28cc2e234e3", size = 118407, upload-time = "2026-05-10T18:17:24.01Z" }, +] + +[[package]] +name = "lxml" +version = "5.4.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/3d/14e82fc7c8fb1b7761f7e748fd47e2ec8276d137b6acfe5a4bb73853e08f/lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd", size = 3679479, upload-time = "2025-04-23T01:50:29.322Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/1f/a3b6b74a451ceb84b471caa75c934d2430a4d84395d38ef201d539f38cd1/lxml-5.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c", size = 8076838, upload-time = "2025-04-23T01:44:29.325Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/36/af/a567a55b3e47135b4d1f05a1118c24529104c003f95851374b3748139dc1/lxml-5.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7", size = 4381827, upload-time = "2025-04-23T01:44:33.345Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/ba/4ee47d24c675932b3eb5b6de77d0f623c2db6dc466e7a1f199792c5e3e3a/lxml-5.4.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:696ea9e87442467819ac22394ca36cb3d01848dad1be6fac3fb612d3bd5a12cf", size = 5204098, upload-time = "2025-04-23T01:44:35.809Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/0f/b4db6dfebfefe3abafe360f42a3d471881687fd449a0b86b70f1f2683438/lxml-5.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ef80aeac414f33c24b3815ecd560cee272786c3adfa5f31316d8b349bfade28", size = 4930261, upload-time = "2025-04-23T01:44:38.271Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/1f/0bb1bae1ce056910f8db81c6aba80fec0e46c98d77c0f59298c70cd362a3/lxml-5.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b9c2754cef6963f3408ab381ea55f47dabc6f78f4b8ebb0f0b25cf1ac1f7609", size = 5529621, upload-time = "2025-04-23T01:44:40.921Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/21/f5/e7b66a533fc4a1e7fa63dd22a1ab2ec4d10319b909211181e1ab3e539295/lxml-5.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a62cc23d754bb449d63ff35334acc9f5c02e6dae830d78dab4dd12b78a524f4", size = 4983231, upload-time = "2025-04-23T01:44:43.871Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/39/a38244b669c2d95a6a101a84d3c85ba921fea827e9e5483e93168bf1ccb2/lxml-5.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f82125bc7203c5ae8633a7d5d20bcfdff0ba33e436e4ab0abc026a53a8960b7", size = 5084279, upload-time = "2025-04-23T01:44:46.632Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/64/48cac242347a09a07740d6cee7b7fd4663d5c1abd65f2e3c60420e231b27/lxml-5.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b67319b4aef1a6c56576ff544b67a2a6fbd7eaee485b241cabf53115e8908b8f", size = 4927405, upload-time = "2025-04-23T01:44:49.843Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/89/97442835fbb01d80b72374f9594fe44f01817d203fa056e9906128a5d896/lxml-5.4.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:a8ef956fce64c8551221f395ba21d0724fed6b9b6242ca4f2f7beb4ce2f41997", size = 5550169, upload-time = "2025-04-23T01:44:52.791Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/97/164ca398ee654eb21f29c6b582685c6c6b9d62d5213abc9b8380278e9c0a/lxml-5.4.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:0a01ce7d8479dce84fc03324e3b0c9c90b1ece9a9bb6a1b6c9025e7e4520e78c", size = 5062691, upload-time = "2025-04-23T01:44:56.108Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/bc/712b96823d7feb53482d2e4f59c090fb18ec7b0d0b476f353b3085893cda/lxml-5.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:91505d3ddebf268bb1588eb0f63821f738d20e1e7f05d3c647a5ca900288760b", size = 5133503, upload-time = "2025-04-23T01:44:59.222Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/55/a62a39e8f9da2a8b6002603475e3c57c870cd9c95fd4b94d4d9ac9036055/lxml-5.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a3bcdde35d82ff385f4ede021df801b5c4a5bcdfb61ea87caabcebfc4945dc1b", size = 4999346, upload-time = "2025-04-23T01:45:02.088Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ea/47/a393728ae001b92bb1a9e095e570bf71ec7f7fbae7688a4792222e56e5b9/lxml-5.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aea7c06667b987787c7d1f5e1dfcd70419b711cdb47d6b4bb4ad4b76777a0563", size = 5627139, upload-time = "2025-04-23T01:45:04.582Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5e/5f/9dcaaad037c3e642a7ea64b479aa082968de46dd67a8293c541742b6c9db/lxml-5.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7fb111eef4d05909b82152721a59c1b14d0f365e2be4c742a473c5d7372f4f5", size = 5465609, upload-time = "2025-04-23T01:45:07.649Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a7/0a/ebcae89edf27e61c45023005171d0ba95cb414ee41c045ae4caf1b8487fd/lxml-5.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:43d549b876ce64aa18b2328faff70f5877f8c6dede415f80a2f799d31644d776", size = 5192285, upload-time = "2025-04-23T01:45:10.456Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/ad/cc8140ca99add7d85c92db8b2354638ed6d5cc0e917b21d36039cb15a238/lxml-5.4.0-cp310-cp310-win32.whl", hash = "sha256:75133890e40d229d6c5837b0312abbe5bac1c342452cf0e12523477cd3aa21e7", size = 3477507, upload-time = "2025-04-23T01:45:12.474Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/39/597ce090da1097d2aabd2f9ef42187a6c9c8546d67c419ce61b88b336c85/lxml-5.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:de5b4e1088523e2b6f730d0509a9a813355b7f5659d70eb4f319c76beea2e250", size = 3805104, upload-time = "2025-04-23T01:45:15.104Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/2d/67693cc8a605a12e5975380d7ff83020dcc759351b5a066e1cced04f797b/lxml-5.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98a3912194c079ef37e716ed228ae0dcb960992100461b704aea4e93af6b0bb9", size = 8083240, upload-time = "2025-04-23T01:45:18.566Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/53/b5a05ab300a808b72e848efd152fe9c022c0181b0a70b8bca1199f1bed26/lxml-5.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ea0252b51d296a75f6118ed0d8696888e7403408ad42345d7dfd0d1e93309a7", size = 4387685, upload-time = "2025-04-23T01:45:21.387Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/cb/1a3879c5f512bdcd32995c301886fe082b2edd83c87d41b6d42d89b4ea4d/lxml-5.4.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92b69441d1bd39f4940f9eadfa417a25862242ca2c396b406f9272ef09cdcaa", size = 4991164, upload-time = "2025-04-23T01:45:23.849Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/94/bbc66e42559f9d04857071e3b3d0c9abd88579367fd2588a4042f641f57e/lxml-5.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20e16c08254b9b6466526bc1828d9370ee6c0d60a4b64836bc3ac2917d1e16df", size = 4746206, upload-time = "2025-04-23T01:45:26.361Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/95/34b0679bee435da2d7cae895731700e519a8dfcab499c21662ebe671603e/lxml-5.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7605c1c32c3d6e8c990dd28a0970a3cbbf1429d5b92279e37fda05fb0c92190e", size = 5342144, upload-time = "2025-04-23T01:45:28.939Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e0/5d/abfcc6ab2fa0be72b2ba938abdae1f7cad4c632f8d552683ea295d55adfb/lxml-5.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecf4c4b83f1ab3d5a7ace10bafcb6f11df6156857a3c418244cef41ca9fa3e44", size = 4825124, upload-time = "2025-04-23T01:45:31.361Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/78/6bd33186c8863b36e084f294fc0a5e5eefe77af95f0663ef33809cc1c8aa/lxml-5.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cef4feae82709eed352cd7e97ae062ef6ae9c7b5dbe3663f104cd2c0e8d94ba", size = 4876520, upload-time = "2025-04-23T01:45:34.191Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/74/4d7ad4839bd0fc64e3d12da74fc9a193febb0fae0ba6ebd5149d4c23176a/lxml-5.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:df53330a3bff250f10472ce96a9af28628ff1f4efc51ccba351a8820bca2a8ba", size = 4765016, upload-time = "2025-04-23T01:45:36.7Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/0d/0a98ed1f2471911dadfc541003ac6dd6879fc87b15e1143743ca20f3e973/lxml-5.4.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:aefe1a7cb852fa61150fcb21a8c8fcea7b58c4cb11fbe59c97a0a4b31cae3c8c", size = 5362884, upload-time = "2025-04-23T01:45:39.291Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/de/d4f7e4c39740a6610f0f6959052b547478107967362e8424e1163ec37ae8/lxml-5.4.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ef5a7178fcc73b7d8c07229e89f8eb45b2908a9238eb90dcfc46571ccf0383b8", size = 4902690, upload-time = "2025-04-23T01:45:42.386Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/8c/61763abd242af84f355ca4ef1ee096d3c1b7514819564cce70fd18c22e9a/lxml-5.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d2ed1b3cb9ff1c10e6e8b00941bb2e5bb568b307bfc6b17dffbbe8be5eecba86", size = 4944418, upload-time = "2025-04-23T01:45:46.051Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/c5/6d7e3b63e7e282619193961a570c0a4c8a57fe820f07ca3fe2f6bd86608a/lxml-5.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:72ac9762a9f8ce74c9eed4a4e74306f2f18613a6b71fa065495a67ac227b3056", size = 4827092, upload-time = "2025-04-23T01:45:48.943Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/4a/e60a306df54680b103348545706a98a7514a42c8b4fbfdcaa608567bb065/lxml-5.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f5cb182f6396706dc6cc1896dd02b1c889d644c081b0cdec38747573db88a7d7", size = 5418231, upload-time = "2025-04-23T01:45:51.481Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/f2/9754aacd6016c930875854f08ac4b192a47fe19565f776a64004aa167521/lxml-5.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3a3178b4873df8ef9457a4875703488eb1622632a9cee6d76464b60e90adbfcd", size = 5261798, upload-time = "2025-04-23T01:45:54.146Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/a2/0c49ec6941428b1bd4f280650d7b11a0f91ace9db7de32eb7aa23bcb39ff/lxml-5.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e094ec83694b59d263802ed03a8384594fcce477ce484b0cbcd0008a211ca751", size = 4988195, upload-time = "2025-04-23T01:45:56.685Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/75/87a3963a08eafc46a86c1131c6e28a4de103ba30b5ae903114177352a3d7/lxml-5.4.0-cp311-cp311-win32.whl", hash = "sha256:4329422de653cdb2b72afa39b0aa04252fca9071550044904b2e7036d9d97fe4", size = 3474243, upload-time = "2025-04-23T01:45:58.863Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/f9/1f0964c4f6c2be861c50db380c554fb8befbea98c6404744ce243a3c87ef/lxml-5.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd3be6481ef54b8cfd0e1e953323b7aa9d9789b94842d0e5b142ef4bb7999539", size = 3815197, upload-time = "2025-04-23T01:46:01.096Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/4c/d101ace719ca6a4ec043eb516fcfcb1b396a9fccc4fcd9ef593df34ba0d5/lxml-5.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b5aff6f3e818e6bdbbb38e5967520f174b18f539c2b9de867b1e7fde6f8d95a4", size = 8127392, upload-time = "2025-04-23T01:46:04.09Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/84/beddae0cec4dd9ddf46abf156f0af451c13019a0fa25d7445b655ba5ccb7/lxml-5.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942a5d73f739ad7c452bf739a62a0f83e2578afd6b8e5406308731f4ce78b16d", size = 4415103, upload-time = "2025-04-23T01:46:07.227Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/25/d0d93a4e763f0462cccd2b8a665bf1e4343dd788c76dcfefa289d46a38a9/lxml-5.4.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:460508a4b07364d6abf53acaa0a90b6d370fafde5693ef37602566613a9b0779", size = 5024224, upload-time = "2025-04-23T01:46:10.237Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/ce/1df18fb8f7946e7f3388af378b1f34fcf253b94b9feedb2cec5969da8012/lxml-5.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529024ab3a505fed78fe3cc5ddc079464e709f6c892733e3f5842007cec8ac6e", size = 4769913, upload-time = "2025-04-23T01:46:12.757Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/62/f4a6c60ae7c40d43657f552f3045df05118636be1165b906d3423790447f/lxml-5.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ca56ebc2c474e8f3d5761debfd9283b8b18c76c4fc0967b74aeafba1f5647f9", size = 5290441, upload-time = "2025-04-23T01:46:16.037Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/aa/04f00009e1e3a77838c7fc948f161b5d2d5de1136b2b81c712a263829ea4/lxml-5.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a81e1196f0a5b4167a8dafe3a66aa67c4addac1b22dc47947abd5d5c7a3f24b5", size = 4820165, upload-time = "2025-04-23T01:46:19.137Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/1f/e0b2f61fa2404bf0f1fdf1898377e5bd1b74cc9b2cf2c6ba8509b8f27990/lxml-5.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b8686694423ddae324cf614e1b9659c2edb754de617703c3d29ff568448df5", size = 4932580, upload-time = "2025-04-23T01:46:21.963Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/a2/8263f351b4ffe0ed3e32ea7b7830f845c795349034f912f490180d88a877/lxml-5.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c5681160758d3f6ac5b4fea370495c48aac0989d6a0f01bb9a72ad8ef5ab75c4", size = 4759493, upload-time = "2025-04-23T01:46:24.316Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/00/41db052f279995c0e35c79d0f0fc9f8122d5b5e9630139c592a0b58c71b4/lxml-5.4.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:2dc191e60425ad70e75a68c9fd90ab284df64d9cd410ba8d2b641c0c45bc006e", size = 5324679, upload-time = "2025-04-23T01:46:27.097Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/be/ee99e6314cdef4587617d3b3b745f9356d9b7dd12a9663c5f3b5734b64ba/lxml-5.4.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:67f779374c6b9753ae0a0195a892a1c234ce8416e4448fe1e9f34746482070a7", size = 4890691, upload-time = "2025-04-23T01:46:30.009Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/36/239820114bf1d71f38f12208b9c58dec033cbcf80101cde006b9bde5cffd/lxml-5.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:79d5bfa9c1b455336f52343130b2067164040604e41f6dc4d8313867ed540079", size = 4955075, upload-time = "2025-04-23T01:46:32.33Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/e1/1b795cc0b174efc9e13dbd078a9ff79a58728a033142bc6d70a1ee8fc34d/lxml-5.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3d3c30ba1c9b48c68489dc1829a6eede9873f52edca1dda900066542528d6b20", size = 4838680, upload-time = "2025-04-23T01:46:34.852Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/48/3c198455ca108cec5ae3662ae8acd7fd99476812fd712bb17f1b39a0b589/lxml-5.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1af80c6316ae68aded77e91cd9d80648f7dd40406cef73df841aa3c36f6907c8", size = 5391253, upload-time = "2025-04-23T01:46:37.608Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/10/5bf51858971c51ec96cfc13e800a9951f3fd501686f4c18d7d84fe2d6352/lxml-5.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4d885698f5019abe0de3d352caf9466d5de2baded00a06ef3f1216c1a58ae78f", size = 5261651, upload-time = "2025-04-23T01:46:40.183Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/11/06710dd809205377da380546f91d2ac94bad9ff735a72b64ec029f706c85/lxml-5.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea53d51859b6c64e7c51d522c03cc2c48b9b5d6172126854cc7f01aa11f52bc", size = 5024315, upload-time = "2025-04-23T01:46:43.333Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/b0/15b6217834b5e3a59ebf7f53125e08e318030e8cc0d7310355e6edac98ef/lxml-5.4.0-cp312-cp312-win32.whl", hash = "sha256:d90b729fd2732df28130c064aac9bb8aff14ba20baa4aee7bd0795ff1187545f", size = 3486149, upload-time = "2025-04-23T01:46:45.684Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/91/1e/05ddcb57ad2f3069101611bd5f5084157d90861a2ef460bf42f45cced944/lxml-5.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1dc4ca99e89c335a7ed47d38964abcb36c5910790f9bd106f2a8fa2ee0b909d2", size = 3817095, upload-time = "2025-04-23T01:46:48.521Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/cb/2ba1e9dd953415f58548506fa5549a7f373ae55e80c61c9041b7fd09a38a/lxml-5.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:773e27b62920199c6197130632c18fb7ead3257fce1ffb7d286912e56ddb79e0", size = 8110086, upload-time = "2025-04-23T01:46:52.218Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/3e/6602a4dca3ae344e8609914d6ab22e52ce42e3e1638c10967568c5c1450d/lxml-5.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ce9c671845de9699904b1e9df95acfe8dfc183f2310f163cdaa91a3535af95de", size = 4404613, upload-time = "2025-04-23T01:46:55.281Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/72/bf00988477d3bb452bef9436e45aeea82bb40cdfb4684b83c967c53909c7/lxml-5.4.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9454b8d8200ec99a224df8854786262b1bd6461f4280064c807303c642c05e76", size = 5012008, upload-time = "2025-04-23T01:46:57.817Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/1f/93e42d93e9e7a44b2d3354c462cd784dbaaf350f7976b5d7c3f85d68d1b1/lxml-5.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cccd007d5c95279e529c146d095f1d39ac05139de26c098166c4beb9374b0f4d", size = 4760915, upload-time = "2025-04-23T01:47:00.745Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/0b/363009390d0b461cf9976a499e83b68f792e4c32ecef092f3f9ef9c4ba54/lxml-5.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fce1294a0497edb034cb416ad3e77ecc89b313cff7adbee5334e4dc0d11f422", size = 5283890, upload-time = "2025-04-23T01:47:04.702Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/dc/6056c332f9378ab476c88e301e6549a0454dbee8f0ae16847414f0eccb74/lxml-5.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24974f774f3a78ac12b95e3a20ef0931795ff04dbb16db81a90c37f589819551", size = 4812644, upload-time = "2025-04-23T01:47:07.833Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/8a/f8c66bbb23ecb9048a46a5ef9b495fd23f7543df642dabeebcb2eeb66592/lxml-5.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:497cab4d8254c2a90bf988f162ace2ddbfdd806fce3bda3f581b9d24c852e03c", size = 4921817, upload-time = "2025-04-23T01:47:10.317Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/57/2e537083c3f381f83d05d9b176f0d838a9e8961f7ed8ddce3f0217179ce3/lxml-5.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e794f698ae4c5084414efea0f5cc9f4ac562ec02d66e1484ff822ef97c2cadff", size = 4753916, upload-time = "2025-04-23T01:47:12.823Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/80/ea8c4072109a350848f1157ce83ccd9439601274035cd045ac31f47f3417/lxml-5.4.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:2c62891b1ea3094bb12097822b3d44b93fc6c325f2043c4d2736a8ff09e65f60", size = 5289274, upload-time = "2025-04-23T01:47:15.916Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/47/c4be287c48cdc304483457878a3f22999098b9a95f455e3c4bda7ec7fc72/lxml-5.4.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:142accb3e4d1edae4b392bd165a9abdee8a3c432a2cca193df995bc3886249c8", size = 4874757, upload-time = "2025-04-23T01:47:19.793Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/04/6ef935dc74e729932e39478e44d8cfe6a83550552eaa072b7c05f6f22488/lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982", size = 4947028, upload-time = "2025-04-23T01:47:22.401Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/f9/c33fc8daa373ef8a7daddb53175289024512b6619bc9de36d77dca3df44b/lxml-5.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4291d3c409a17febf817259cb37bc62cb7eb398bcc95c1356947e2871911ae61", size = 4834487, upload-time = "2025-04-23T01:47:25.513Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/30/fc92bb595bcb878311e01b418b57d13900f84c2b94f6eca9e5073ea756e6/lxml-5.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4f5322cf38fe0e21c2d73901abf68e6329dc02a4994e483adbcf92b568a09a54", size = 5381688, upload-time = "2025-04-23T01:47:28.454Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/d1/3ba7bd978ce28bba8e3da2c2e9d5ae3f8f521ad3f0ca6ea4788d086ba00d/lxml-5.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0be91891bdb06ebe65122aa6bf3fc94489960cf7e03033c6f83a90863b23c58b", size = 5242043, upload-time = "2025-04-23T01:47:31.208Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/cd/95fa2201041a610c4d08ddaf31d43b98ecc4b1d74b1e7245b1abdab443cb/lxml-5.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:15a665ad90054a3d4f397bc40f73948d48e36e4c09f9bcffc7d90c87410e478a", size = 5021569, upload-time = "2025-04-23T01:47:33.805Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/a6/31da006fead660b9512d08d23d31e93ad3477dd47cc42e3285f143443176/lxml-5.4.0-cp313-cp313-win32.whl", hash = "sha256:d5663bc1b471c79f5c833cffbc9b87d7bf13f87e055a5c86c363ccd2348d7e82", size = 3485270, upload-time = "2025-04-23T01:47:36.133Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/14/c115516c62a7d2499781d2d3d7215218c0731b2c940753bf9f9b7b73924d/lxml-5.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:bcb7a1096b4b6b24ce1ac24d4942ad98f983cd3810f9711bcd0293f43a9d8b9f", size = 3814606, upload-time = "2025-04-23T01:47:39.028Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/65/6cc97ec78bc395af6127850614223568b1808505960e26b8126336d804b2/lxml-5.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:795f61bcaf8770e1b37eec24edf9771b307df3af74d1d6f27d812e15a9ff3872", size = 4400563, upload-time = "2025-04-23T01:48:02.853Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/3f/863f7f5446edbf0edb16fa1f8de8ed825b1fdb01b766598203a15f1c6b32/lxml-5.4.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29f451a4b614a7b5b6c2e043d7b64a15bd8304d7e767055e8ab68387a8cacf4e", size = 5045095, upload-time = "2025-04-23T01:48:05.416Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/34/96b69cea212bc930408820d11ff247d39c7631c9a20fa533328b518a0780/lxml-5.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f7f991a68d20c75cb13c5c9142b2a3f9eb161f1f12a9489c82172d1f133c0", size = 4767094, upload-time = "2025-05-07T08:14:22.387Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/9b/9a78fd2cdfd6594bece1f54bd82c63409270252e728235c8f4585a8a86c3/lxml-5.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4aa412a82e460571fad592d0f93ce9935a20090029ba08eca05c614f99b0cc92", size = 4906101, upload-time = "2025-04-23T01:48:07.985Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/76/c32533364bbaf348441c08460b4cf433accde608737c65c6443096cbefd8/lxml-5.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:ac7ba71f9561cd7d7b55e1ea5511543c0282e2b6450f122672a2694621d63b7e", size = 4752438, upload-time = "2025-05-07T08:14:32.003Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/fb/0fc9e195929e7ca0f4a0c70b17e25104eb311648f437e70e04bb0381db21/lxml-5.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:c5d32f5284012deaccd37da1e2cd42f081feaa76981f0eaa474351b68df813c5", size = 4947162, upload-time = "2025-04-23T01:48:10.566Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/4e/b8c7e2d86a7ccd367aab8ab1d24c5caac37205ddf5b99610caeaa9809ed0/lxml-5.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:ce31158630a6ac85bddd6b830cffd46085ff90498b397bd0a259f59d27a12188", size = 4830106, upload-time = "2025-05-07T08:14:37.097Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/e7/6ad7178994f9a67dbe0a93a99a43c21f157c9bc4d106f495f6696c693d3c/lxml-5.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:31e63621e073e04697c1b2d23fcb89991790eef370ec37ce4d5d469f40924ed6", size = 5001558, upload-time = "2025-04-23T01:48:13.202Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/56/fcef28dd6e03b997b7ee7efbb26591463047ebc02009ab9b454d677dc44f/lxml-5.4.0-cp37-cp37m-win32.whl", hash = "sha256:be2ba4c3c5b7900246a8f866580700ef0d538f2ca32535e991027bdaba944063", size = 3456815, upload-time = "2025-04-23T01:48:16.17Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/60/bac0ea0babefd9d48ba06331c4b2bb24027de0b9f231f5dccf22abf64207/lxml-5.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:09846782b1ef650b321484ad429217f5154da4d6e786636c38e434fa32e94e49", size = 3774236, upload-time = "2025-04-23T01:48:19.011Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/2f/18df18629d0b28ed00a1903033c627249ee002231c0c272cbb616a54dc61/lxml-5.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eaf24066ad0b30917186420d51e2e3edf4b0e2ea68d8cd885b14dc8afdcf6556", size = 4439701, upload-time = "2025-04-23T01:48:22.016Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/95/2a31efe19c8d6e4b7bdbcd1a9a6e0a2cb28472c9ea4c29b0e170c6bc7b08/lxml-5.4.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b31a3a77501d86d8ade128abb01082724c0dfd9524f542f2f07d693c9f1175f", size = 5109242, upload-time = "2025-04-23T01:48:25.128Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/f9/afc3d28beb7125b09bc54b5e7194b4e1bf9f75e8a0ba3f357adc1f6c6f86/lxml-5.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e108352e203c7afd0eb91d782582f00a0b16a948d204d4dec8565024fafeea5", size = 4831235, upload-time = "2025-04-23T01:48:27.645Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/a7/31be3410d202bcd7fb3f21efd2fb868e07eff5c83d7db26e2c76aa1d72fb/lxml-5.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11a96c3b3f7551c8a8109aa65e8594e551d5a84c76bf950da33d0fb6dfafab7", size = 4986329, upload-time = "2025-04-23T01:48:30.212Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b6/72/ff7408e60fa972b5a34e719ecfa3fe292ec72868a703d7eb5fe92eae7183/lxml-5.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:ca755eebf0d9e62d6cb013f1261e510317a41bf4650f22963474a663fdfe02aa", size = 4819967, upload-time = "2025-04-23T01:48:33.319Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/b4/17df5c25d95198ffac5f8fc2a04586c2e8d1c1b7d9e77a8b7e016772f4ea/lxml-5.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:4cd915c0fb1bed47b5e6d6edd424ac25856252f09120e3e8ba5154b6b921860e", size = 5030259, upload-time = "2025-04-23T01:48:36.536Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/ab/3ddf099739ee9ffaf75c6367d4ea9512f1a7b0c72b6d2d37330c8fd23a02/lxml-5.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:226046e386556a45ebc787871d6d2467b32c37ce76c2680f5c608e25823ffc84", size = 4895573, upload-time = "2025-04-23T01:48:39.541Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3e/e2/e6b880194eb24bd55fb48989ce4f653ec4cb31dbe3deeda16957601f71f3/lxml-5.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b108134b9667bcd71236c5a02aad5ddd073e372fb5d48ea74853e009fe38acb6", size = 5084328, upload-time = "2025-04-23T01:48:42.816Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/1a/16467b52c9b5fea958b2173b3fb03be295f308520c9fda1556099641b14e/lxml-5.4.0-cp38-cp38-win32.whl", hash = "sha256:1320091caa89805df7dcb9e908add28166113dcd062590668514dbd510798c88", size = 3484259, upload-time = "2025-04-23T01:48:45.774Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/c2/1365fd76b35a9a03a7ac4a0ce8372b4f792bd64c9d226532fe4ff6923cb4/lxml-5.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:073eb6dcdf1f587d9b88c8c93528b57eccda40209cf9be549d469b942b41d70b", size = 3814595, upload-time = "2025-04-23T01:48:48.095Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/04/acd238222ea25683e43ac7113facc380b3aaf77c53e7d88c4f544cef02ca/lxml-5.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bda3ea44c39eb74e2488297bb39d47186ed01342f0022c8ff407c250ac3f498e", size = 8082189, upload-time = "2025-04-23T01:48:51.829Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/4e/cc7fe9ccb9999cc648492ce970b63c657606aefc7d0fba46b17aa2ba93fb/lxml-5.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ceaf423b50ecfc23ca00b7f50b64baba85fb3fb91c53e2c9d00bc86150c7e40", size = 4384950, upload-time = "2025-04-23T01:48:54.464Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/56/bf/acd219c489346d0243a30769b9d446b71e5608581db49a18c8d91a669e19/lxml-5.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:664cdc733bc87449fe781dbb1f309090966c11cc0c0cd7b84af956a02a8a4729", size = 5209823, upload-time = "2025-04-23T01:48:57.192Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/57/51/ec31cd33175c09aa7b93d101f56eed43d89e15504455d884d021df7166a7/lxml-5.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67ed8a40665b84d161bae3181aa2763beea3747f748bca5874b4af4d75998f87", size = 4931808, upload-time = "2025-04-23T01:48:59.811Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/68/865d229f191514da1777125598d028dc88a5ea300d68c30e1f120bfd01bd/lxml-5.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b4a3bd174cc9cdaa1afbc4620c049038b441d6ba07629d89a83b408e54c35cd", size = 5086067, upload-time = "2025-04-23T01:49:02.887Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/01/4c958c5848b4e263cd9e83dff6b49f975a5a0854feb1070dfe0bdcdf70a0/lxml-5.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:b0989737a3ba6cf2a16efb857fb0dfa20bc5c542737fddb6d893fde48be45433", size = 4929026, upload-time = "2025-04-23T01:49:05.624Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/31/5327d8af74d7f35e645b40ae6658761e1fee59ebecaa6a8d295e495c2ca9/lxml-5.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:dc0af80267edc68adf85f2a5d9be1cdf062f973db6790c1d065e45025fa26140", size = 5134245, upload-time = "2025-04-23T01:49:08.918Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/c9/204eba2400beb0016dacc2c5335ecb1e37f397796683ffdb7f471e86bddb/lxml-5.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:639978bccb04c42677db43c79bdaa23785dc7f9b83bfd87570da8207872f1ce5", size = 5001020, upload-time = "2025-04-23T01:49:11.643Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/53/979165f50a853dab1cf3b9e53105032d55f85c5993f94afc4d9a61a22877/lxml-5.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a99d86351f9c15e4a901fc56404b485b1462039db59288b203f8c629260a142", size = 5192346, upload-time = "2025-04-23T01:49:14.868Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/2b/f37b5ae28949143f863ba3066b30eede6107fc9a503bd0d01677d4e2a1e0/lxml-5.4.0-cp39-cp39-win32.whl", hash = "sha256:3e6d5557989cdc3ebb5302bbdc42b439733a841891762ded9514e74f60319ad6", size = 3478275, upload-time = "2025-04-23T01:49:17.249Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/d5/b795a183680126147665a8eeda8e802c180f2f7661aa9a550bba5bcdae63/lxml-5.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:a8c9b7f16b63e65bbba889acb436a1034a82d34fa09752d754f88d708eca80e1", size = 3806275, upload-time = "2025-04-23T01:49:19.635Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/b0/e4d1cbb8c078bc4ae44de9c6a79fec4e2b4151b1b4d50af71d799e76b177/lxml-5.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1b717b00a71b901b4667226bba282dd462c42ccf618ade12f9ba3674e1fabc55", size = 3892319, upload-time = "2025-04-23T01:49:22.069Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/aa/e2bdefba40d815059bcb60b371a36fbfcce970a935370e1b367ba1cc8f74/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27a9ded0f0b52098ff89dd4c418325b987feed2ea5cc86e8860b0f844285d740", size = 4211614, upload-time = "2025-04-23T01:49:24.599Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/5f/91ff89d1e092e7cfdd8453a939436ac116db0a665e7f4be0cd8e65c7dc5a/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7ce10634113651d6f383aa712a194179dcd496bd8c41e191cec2099fa09de5", size = 4306273, upload-time = "2025-04-23T01:49:27.355Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/be/7c/8c3f15df2ca534589717bfd19d1e3482167801caedfa4d90a575facf68a6/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53370c26500d22b45182f98847243efb518d268374a9570409d2e2276232fd37", size = 4208552, upload-time = "2025-04-23T01:49:29.949Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/d8/9567afb1665f64d73fc54eb904e418d1138d7f011ed00647121b4dd60b38/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6364038c519dffdbe07e3cf42e6a7f8b90c275d4d1617a69bb59734c1a2d571", size = 4331091, upload-time = "2025-04-23T01:49:32.842Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/ab/fdbbd91d8d82bf1a723ba88ec3e3d76c022b53c391b0c13cad441cdb8f9e/lxml-5.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b12cb6527599808ada9eb2cd6e0e7d3d8f13fe7bbb01c6311255a15ded4c7ab4", size = 3487862, upload-time = "2025-04-23T01:49:36.296Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c5/93/1208b3b4e8e112b1eb91a0fcc15c24abc0b153eb66a44cf181db2ecfb408/lxml-5.4.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5f11a1526ebd0dee85e7b1e39e39a0cc0d9d03fb527f56d8457f6df48a10dc0c", size = 3893281, upload-time = "2025-04-23T01:49:38.679Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/a7/6e5d107e9ffd6802ea405bfba20a0fc68587d47d0651dacbcdadbc68cf5c/lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48b4afaf38bf79109bb060d9016fad014a9a48fb244e11b94f74ae366a64d252", size = 4229916, upload-time = "2025-04-23T01:49:41.138Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/63/7e4e577993fb3fc43179e2a3b4a5b2540ffac38892b6b5eb9e9676cb8ce0/lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de6f6bb8a7840c7bf216fb83eec4e2f79f7325eca8858167b68708b929ab2172", size = 4336363, upload-time = "2025-04-23T01:49:43.687Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/17/868d11c87115301da662a0939e2e0a9d0fffc2152c83c50d7c137e3b7077/lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5cca36a194a4eb4e2ed6be36923d3cffd03dcdf477515dea687185506583d4c9", size = 4223704, upload-time = "2025-04-23T01:49:46.257Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/3b/8a3098b45fc619256d1275ab36d88a4bec34e35383a0001972a714bad53b/lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b7c86884ad23d61b025989d99bfdd92a7351de956e01c61307cb87035960bcb1", size = 4354513, upload-time = "2025-04-23T01:49:49.351Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/51/f3bb6239b32475db2b41a0ccf252063f8f40a05f6602e203895aff2da642/lxml-5.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:53d9469ab5460402c19553b56c3648746774ecd0681b1b27ea74d5d8a3ef5590", size = 3489629, upload-time = "2025-04-23T01:49:52.249Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/61/08ef39c34841750f3ba4c7a7b69a0adef131b1863d5547bbd3a8508c6e8e/lxml-5.4.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:56dbdbab0551532bb26c19c914848d7251d73edb507c3079d6805fa8bba5b706", size = 3893294, upload-time = "2025-04-23T01:49:55.237Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8e/79/4194b498e7e936d1d958e89451292f371764e5dd3b2cba5c99f34a94ec87/lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14479c2ad1cb08b62bb941ba8e0e05938524ee3c3114644df905d2331c76cd57", size = 4219875, upload-time = "2025-04-23T01:49:57.91Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/65/30be662dff12cfb38cd54a83b007864672717a0fa9d026452fb7933a3aec/lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32697d2ea994e0db19c1df9e40275ffe84973e4232b5c274f47e7c1ec9763cdd", size = 4309450, upload-time = "2025-04-23T01:50:01.203Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/f9/dbba21a5ed4b2e7d96dedd9a9eb6da0aa3730964965b02e412b58c8539e9/lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:24f6df5f24fc3385f622c0c9d63fe34604893bc1a5bdbb2dbf5870f85f9a404a", size = 4213198, upload-time = "2025-04-23T01:50:04.563Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/de/96e9fd26038b74306967f854bfad25ed9f9f2a3150361bc0562f770a17c9/lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:151d6c40bc9db11e960619d2bf2ec5829f0aaffb10b41dcf6ad2ce0f3c0b2325", size = 4331737, upload-time = "2025-04-23T01:50:07.749Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/21/dbf79a9c96172111c546f7ec9cab1fb4ab7a49fec42a62021840293d1468/lxml-5.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4025bf2884ac4370a3243c5aa8d66d3cb9e15d3ddd0af2d796eccc5f0244390e", size = 3489930, upload-time = "2025-04-23T01:50:10.253Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/fb/d19b67e4bb63adc20574ba3476cf763b3514df1a37551084b890254e4b15/lxml-5.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9459e6892f59ecea2e2584ee1058f5d8f629446eab52ba2305ae13a32a059530", size = 3891034, upload-time = "2025-04-23T01:50:12.71Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/5d/6e1033ee0cdb2f9bc93164f9df14e42cb5bbf1bbed3bf67f687de2763104/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47fb24cc0f052f0576ea382872b3fc7e1f7e3028e53299ea751839418ade92a6", size = 4207420, upload-time = "2025-04-23T01:50:15.281Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/4b/23ac79efc32d913259d66672c5f93daac7750a3d97cdc1c1a9a5d1c1b46c/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50441c9de951a153c698b9b99992e806b71c1f36d14b154592580ff4a9d0d877", size = 4305106, upload-time = "2025-04-23T01:50:17.823Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a4/7a/fe558bee63a62f7a75a52111c0a94556c1c1bdcf558cd7d52861de558759/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ab339536aa798b1e17750733663d272038bf28069761d5be57cb4a9b0137b4f8", size = 4205587, upload-time = "2025-04-23T01:50:20.899Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/5b/3207e6bd8d67c952acfec6bac9d1fa0ee353202e7c40b335ebe00879ab7d/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9776af1aad5a4b4a1317242ee2bea51da54b2a7b7b48674be736d463c999f37d", size = 4329077, upload-time = "2025-04-23T01:50:23.996Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/25/d381abcfd00102d3304aa191caab62f6e3bcbac93ee248771db6be153dfd/lxml-5.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:63e7968ff83da2eb6fdda967483a7a023aa497d85ad8f05c3ad9b1f2e8c84987", size = 3486416, upload-time = "2025-04-23T01:50:26.388Z" }, +] + +[[package]] +name = "lxml" +version = "6.1.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/da/dbe4dfc01ac226fb0504fad035f4d69f3202f3502e20e68537631daddd96/lxml-6.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:09dd5b7075dc2f7709654a46543ba1ea3c2e217b2ed8fbd413a8a945a0f40f60", size = 8541124, upload-time = "2026-05-18T19:17:11.589Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/20/f7095ed9fc2c025f9cfe71cc6ec9f1feb05624edc1812423b5f1aecf3d4b/lxml-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f6ac4ef4d82dff54670227a69c67782ae0b811b5cf6b17954f1e8f7502fc0d1d", size = 4602783, upload-time = "2026-05-18T19:17:20.888Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/a4/65c63ca98bd129f6cff7b8c2fa48953ab058cc6005b541354e7dd54d8000/lxml-6.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:556e94a63c9b04716f8e4de2abb65775061f846e89331b6c5be79183a24f98ea", size = 5002687, upload-time = "2026-05-18T19:17:01.738Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/1d/ab7a5c4b5a394d98a94e2d0fc67bab8297597426770dd4978370fbdaf531/lxml-6.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6bf403fbb3b3e348a561a5f4f0b9961835657981c802a1df03653eef8a9074", size = 5155099, upload-time = "2026-05-18T19:17:05.159Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/b1/07603bfeeb891a2596d5c2a68f7d2f70f7d11c841ebe391412c69c2857b0/lxml-6.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dde6131244bba38a17c745836ba190bc753fd73c9291666287fd0a3fa3dcf30", size = 5057225, upload-time = "2026-05-18T19:17:08.117Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/16/cb391ee4b90186fa16d9ebcbe3ea96c71b8da3b0686386c8dcbcc3c67d44/lxml-6.1.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98fc784c2c1440667aeedf8465bdfe10208acf0ead656a2c68627299f546b315", size = 5287643, upload-time = "2026-05-18T19:17:11.507Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/d6/b619717f918fd76747448fdbaee0e769edbc70e659b5b5d0112b7020b7a3/lxml-6.1.1-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:add8cf6ddf9a65116119a28ece0f7886e30af27ba724a7594305f1d1b58a92a1", size = 5412445, upload-time = "2026-05-18T19:17:22.182Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/80/12bc5390ac0a3edeb579d9535e5049a5dda663438728e179d52fb319c33a/lxml-6.1.1-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cf9d57306d848218f3601fee7601fab1a327c942d56e2e97610583cb4dd74206", size = 4770864, upload-time = "2026-05-18T19:17:26.851Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/59/6500c09da3137f54f020e908d81cfc5ee3e8888e908fd380207afad7c2e6/lxml-6.1.1-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88136950da4d13c318bde414ce10219931937851327f44328f2df4d2c4614067", size = 5359594, upload-time = "2026-05-18T19:17:32.527Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f2/9b/f64b4cc6b7ebcf75d95af3cde934d254b5f2f10d4163928d838d86b6eb48/lxml-6.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cecdd5dfdc87b1fd87dbf81d4b037a544f47f4c744200a67013771682d67686a", size = 5107713, upload-time = "2026-05-18T19:17:04.402Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/19/c7388ad5d3a72315d2832dc1458cbf4f2af7f2b990b606ff4876efd04511/lxml-6.1.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cd312b9692e831d2ffcad61eab31d91d4b4655a962e61de8fb410472cbcd37aa", size = 4803973, upload-time = "2026-05-18T19:17:06.545Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/22/76197f0bbf165f0b9e75be59be4997e5259cde973f12f098c1b54c7f5d60/lxml-6.1.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5b7328b46d49fc9477d91ae8f6d55340347d827b7734ba3ea33faae0efef1383", size = 5349925, upload-time = "2026-05-18T19:17:09.743Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/52/d2a0cfeccb9bcdc47c7ee05cdae5d69b48c9acf20997790a6338bb0d0b3b/lxml-6.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37a58976370f36d9329d118ad0b953c5aeb9119ac9c6a4e258942a225d0573a1", size = 5309825, upload-time = "2026-05-18T19:17:13.831Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/4a/b30944266776c2f49749ef2445aa7e78898194134b80ad776386f61b56ae/lxml-6.1.1-cp310-cp310-win32.whl", hash = "sha256:cea3f4c1af79af13cdb2da0c028111d8f8522d4f22a000c82385535f24e5cf3a", size = 3598402, upload-time = "2026-05-18T19:17:08.21Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9e/97/33691c66a4d7ec1a5a98e7c909a5b83ee45c7f7ba4cf92b1c4cf26e98079/lxml-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3abf332af33a74288675d936fe861fd4344da0dd6622193fbc4f2bfbb35536b5", size = 4021295, upload-time = "2026-05-18T19:17:28.638Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/5f/26a4dd0e12b9456ff7b12a21af5b491eb6629680d1edd73f4140fd386bcf/lxml-6.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8dadbe5b217ff35b6a8d16610dd710219b59b76d13f0e3f0d9f36786206e4485", size = 3667717, upload-time = "2026-05-19T19:22:44.474Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/b0/83f481780d1548750b8ce2ec824073deef2f452d9cd1a6faff8507e3d16d/lxml-6.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2", size = 8526461, upload-time = "2026-05-18T19:17:25.862Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/d5/30fa0f808002c7329397bfbb24e306789c0b29f04aa5842c07b174b4216f/lxml-6.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3f333630ab480244a1bff72043e511a91eb22e7595dead8653ee5612dd8f3d", size = 4595375, upload-time = "2026-05-18T19:17:34.555Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/d2/edb71cf0e561581a7c5eb2626244320eb04e9f8ce6d563184fd668b45073/lxml-6.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510", size = 4923654, upload-time = "2026-05-18T19:17:42.917Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/77/1bc7eeb0de4577d783fb625aa092cc9357883bba35845a3666bf1259f3dc/lxml-6.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a", size = 5067921, upload-time = "2026-05-18T19:17:49.175Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/3c/c0690d74bd2bc17bc03b5b0d093569ead597dd0bfa088bf99eef8c24e19c/lxml-6.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d", size = 5002456, upload-time = "2026-05-18T19:17:59.715Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/66/8d/d1b3271af0c0f1e27e8472a849e4d2c65bc7766884b9ad2da9e76e145c88/lxml-6.1.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8", size = 5202776, upload-time = "2026-05-18T19:18:08.924Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/45/689824ffb237fd10125ad273f32b28ff04dc6203c2822c85ff65a93df65e/lxml-6.1.1-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:752d3bbfe874715ccd0aec7f88d7fc623c0f1fd7aa7b3238a084e017bad2a009", size = 5329945, upload-time = "2026-05-18T19:18:13.673Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/c0/ef73af53767e958fd87d437c170f272e2f6e6c0f854939f133a895f1e711/lxml-6.1.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6", size = 4659237, upload-time = "2026-05-18T19:18:18.657Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/5e/e1158e40397585e91cb0472374a1f63d0926a1ddeaa92f13d1a1ffe306d5/lxml-6.1.1-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8", size = 5265904, upload-time = "2026-05-18T19:18:24.883Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/16/8687e5d1400ed1c0bc41dace232ebb7553952b618ea1f2e5fb6e2cfbbe23/lxml-6.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83", size = 5045225, upload-time = "2026-05-18T19:17:20.073Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/18/d877bd1ae2e5ffdfd4836565aba350db31feb2f2656d6ce70316ed66a05e/lxml-6.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6", size = 4712721, upload-time = "2026-05-18T19:17:40.512Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/4d/1f44fd1d770b10dacbf6b5c6e520f4d6e0708744930f719dc04e67cab981/lxml-6.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c", size = 5252549, upload-time = "2026-05-18T19:17:51.236Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/5d/1d66b84f850089254c230ef6ea6b267a5a54e2e179a5d960036a05d501d7/lxml-6.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08", size = 5226877, upload-time = "2026-05-18T19:18:00.875Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ad/00/84c4b5302d42a2d0184f38d538c8a197f33b52a50bd4f7bcfe990bce3036/lxml-6.1.1-cp311-cp311-win32.whl", hash = "sha256:30a89d3ac8faec007453fb541f3f46807eeec88edd5826f6e3fe001752a2c621", size = 3594072, upload-time = "2026-05-18T19:17:12.714Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/9d/2e2f7d876349f45e0f3e29f72da311668853d59b58d473a2dea4f0160135/lxml-6.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:abbefa31eee84842140f67acef1c828e28bba8bbf0c3bc6e5492a9af88152c28", size = 4025469, upload-time = "2026-05-18T19:17:50.566Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/d5/570e6390e4110331e6208b2ba83d1482cc9146808ee118b22824a34c1070/lxml-6.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:dcb292aa7fe485ceff7af4f92e46c5af397daec5dff64871a528f0fc47a3cc5b", size = 3667640, upload-time = "2026-05-19T19:22:48.293Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/6e/c4add832b6fc1e887125b96f880d7b9b70aae5248718e046b1704bcac4b9/lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7", size = 8570821, upload-time = "2026-05-18T19:17:42.068Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1", size = 4624252, upload-time = "2026-05-18T19:17:47.897Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746, upload-time = "2026-05-18T19:18:29.637Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723, upload-time = "2026-05-18T19:18:34.168Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557, upload-time = "2026-05-18T19:18:39.798Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036, upload-time = "2026-05-18T19:18:44.858Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367, upload-time = "2026-05-18T19:18:49.217Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/83/8555d40948b09ce86f1bd0c68a7ac31d07b1929f92cc1b074006c97ef2d2/lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740", size = 5350171, upload-time = "2026-05-18T19:18:52.779Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874, upload-time = "2026-05-18T19:18:55.139Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492, upload-time = "2026-05-18T19:19:01.28Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232, upload-time = "2026-05-18T19:18:12.67Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023, upload-time = "2026-05-18T19:18:15.928Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773, upload-time = "2026-05-18T19:18:23.223Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088, upload-time = "2026-05-18T19:18:31.433Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995, upload-time = "2026-05-18T19:18:37.091Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/8b/6772e1a4b513fc50a8d931f19edde0e13ae6918510a1e13ff67864f3e5ed/lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a", size = 3596382, upload-time = "2026-05-18T19:17:18.37Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77", size = 3997255, upload-time = "2026-05-18T19:17:56.781Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/a9/7a54b6834088d9ae528a7b780584ba6a39a9457b0ac330479f20ffbc9449/lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f", size = 3659610, upload-time = "2026-05-19T19:22:50.843Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/eb/7e6f37c5584ccbb2ff267f56fd0339016938c1c8684cfefab9b33ffc2f36/lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736", size = 8559780, upload-time = "2026-05-18T19:17:57.661Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/36/587c2521cf23a2cd6c9c22108aa7528f683a1f195ed7ccd23a4b1786ad36/lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9", size = 4618006, upload-time = "2026-05-18T19:18:04.452Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/ca/ab7bfe2bf4c972af5e7878262845ead3a24a929a9b04bc11c7c1ece6c82a/lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354", size = 4924139, upload-time = "2026-05-18T19:19:04.873Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/55/a0c72851dfee5ecc689f949723a73dea457758912542cb955b108eaf0d8f/lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca", size = 5082329, upload-time = "2026-05-18T19:19:09.728Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/b6/0608f7d61a3b96cc67e5648a3d906e31a5082093e10e7be65b3886289938/lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099", size = 4993564, upload-time = "2026-05-18T19:19:13.608Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/66/ae227524b066d29d55bf0b453d93d2d793c40218657d643dcbbca13b8faf/lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6", size = 5613467, upload-time = "2026-05-18T19:19:16.228Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a6/76/dbe4a00b50385e40194231dcfe5a12c059de7cf90e89c83407d2b085b719/lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085", size = 5228304, upload-time = "2026-05-18T19:19:19.354Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/01/00b1b8442ed2041793336868ba0b9ea4b13d7da7c085c6404c207a63bf79/lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e", size = 5341607, upload-time = "2026-05-18T19:19:22.297Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/36/1ad29931e9a4638bb707869f01d423a6c815f82152138d1a40dfcfde2b95/lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f", size = 4700168, upload-time = "2026-05-18T19:19:25.133Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/d1/a9536cecf9be18a0dc72d32bead283a2332d1ffebd2dd3ac70ce444686e5/lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c", size = 5232487, upload-time = "2026-05-18T19:19:28.603Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/77/b4fb1e03bf5d130e879214d3100092e386418807fb74dd0adc4b0a48f351/lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b", size = 5044231, upload-time = "2026-05-18T19:18:42.246Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/4c/d00daeeb0a5530c4028a9232aa1b93db3ef4ed2158c116ea73c79a9765b3/lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2", size = 4769450, upload-time = "2026-05-18T19:18:48.013Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/6a/715a3a8d156ce42f29cf014706f5410c2ff3b02267774110fc23266409fe/lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5", size = 5635874, upload-time = "2026-05-18T19:18:51.914Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/37/0544bc21dde2a88f3a17b504e6fc79c0e01d25a33c2f6079724e9e72b9c7/lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785", size = 5223987, upload-time = "2026-05-18T19:18:59.715Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/f8/f6a5e8185bcb28c2befae3d31f8e3df3b811cb0f47746517a81279fcafe1/lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947", size = 5250276, upload-time = "2026-05-18T19:19:03.834Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/f2/1a2b9f1b7a49d45495369be7ef9ad05b262930f2eab3e3145706fca8083f/lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca", size = 3596903, upload-time = "2026-05-18T19:17:29.863Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/99/f4ffb024f238eec2131aaa09f3278fb6129cf892741bf68e1fc1afb8c100/lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660", size = 3995869, upload-time = "2026-05-18T19:18:02.596Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/53/70eb8c5c6037f27448f1e3c54ebede9545a801ae63f0a7254afca4fe8e45/lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc", size = 3658490, upload-time = "2026-05-19T19:22:53.846Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/13/e2/2e325795566de01d0d7c3bb57d3c370616b2d07b01214e84eec5d3b10963/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0", size = 8577146, upload-time = "2026-05-18T19:18:17.765Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/93/cf/5630b5e4be7d2e6bee8efe83865c925221103cf0221303b104ce134b01e2/lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840", size = 4623866, upload-time = "2026-05-18T19:18:30.669Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/51/3904907c063451cf8d4a5c9fe0cad95fa1f4ec57f4e3884fa0731bd7a305/lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14", size = 4950022, upload-time = "2026-05-18T19:19:31.958Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/cd/9c7611a51c37a2830928405817cc5d56a97f64fab83cc3f628748b135749/lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909", size = 5086695, upload-time = "2026-05-18T19:19:34.764Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/d6/24e3b5906abb0b674ff2ae195bc3ce59708df2bcd17cf17703b2d7dd643a/lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00", size = 5031642, upload-time = "2026-05-18T19:19:37.771Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/db/6ec54f99019838bff54785c51da07f189eb4676861c5f2730962b0d8d665/lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955", size = 5647338, upload-time = "2026-05-18T19:19:40.553Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/3d/ef4dcfffd22d27a61805d8ed9f7fb888495bc6aa88648fa07c1eaa5586b6/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13", size = 5239528, upload-time = "2026-05-18T19:19:43.657Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/bb/37fb3f0dff146bdcfa78eec47879273820b2a0bf350ec236ce14bd0b1c26/lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7", size = 5350730, upload-time = "2026-05-18T19:19:46.307Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/42/43253f168388df4fae1f38c01df36ddb9bee39e2048167b54cdcbae85ea3/lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245", size = 4697530, upload-time = "2026-05-18T19:19:49.889Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/a8/c5a8504f81bbdfc8e7094c2c850cdb4ed6777fc4d5ddd9e5ab819f3b0d54/lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5", size = 5250670, upload-time = "2026-05-18T19:19:53.199Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/b7/c7e76ab18744d75e21f320ebf9ff9d1ceae2b54dd431ea5a64caf26c9672/lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462", size = 5084485, upload-time = "2026-05-18T19:19:08.422Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/31/31/b35c53f8ef7b7c31cacd23d3638652fff7bcd1deb6eedb709ab43b685908/lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465", size = 4737635, upload-time = "2026-05-18T19:19:12.321Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/06/31f23c813a7fe8e0cb1b175e915b08c9bf4e86d225b210feadbdbe519667/lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a", size = 5670681, upload-time = "2026-05-18T19:19:15.001Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/bc/ce619bccc89b1fd9ad8a8e1330ee3f3beff9f2ff95b712d7bbcdd6e22fc3/lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590", size = 5238229, upload-time = "2026-05-18T19:19:18.131Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/5d/b329acbbedc0b619ebc2be6cf7ee9ed07e80892c88d4dfd612c33805789a/lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb", size = 5264191, upload-time = "2026-05-18T19:19:21.118Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/85/be36fb1425b30db3c3f9df75fe86343ebffb79e6320bd7f588e25bfeac39/lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603", size = 3657202, upload-time = "2026-05-18T19:17:39.509Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/ce/3cf9a827342269f54d405a6202397de63f07c69cbd6ce7d183a3f0cba1e9/lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137", size = 4064497, upload-time = "2026-05-18T19:18:14.662Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/3e/1a957bde8f0760039e627f94699f82caa782c9d838d86c3d28245ee67212/lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf", size = 3741991, upload-time = "2026-05-19T19:22:59.111Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/b2/00ed55b3a2efa4658fb795c38d1090ec9b3e8a6c3683d4441fa517f09c3b/lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee", size = 8827545, upload-time = "2026-05-18T19:18:41.193Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/73/74573db19baa618d5f266f2407898b087ff6927115b00b71e5fc1b700847/lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c", size = 4735736, upload-time = "2026-05-18T19:18:46.761Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/02/6f7061f4f95f51e545d48e87647c54791d204a4e881be4156e7a26ba5338/lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef", size = 4970291, upload-time = "2026-05-18T19:19:56.215Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/02/55fc057d8283427dea7d6edb102e7a840239c77a64a983d92f62a304c0e9/lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a", size = 5102822, upload-time = "2026-05-18T19:19:59.223Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/48/8e1cf78d89d66850121d9255a2a24414c98f775da93b90cf976956c24b14/lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c", size = 5027923, upload-time = "2026-05-18T19:20:01.549Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/00/0632a0647612c8af24d26997b3b961397daa9d5b2581444805933629a4cb/lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525", size = 5595843, upload-time = "2026-05-18T19:20:03.93Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/86/ab008a7dc360711b66858d61c80a5979a70a09f2aa2b05d9698df80b803d/lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca", size = 5224515, upload-time = "2026-05-18T19:20:06.381Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/c6/2702ff375e728e34f56d9a45339a9cf7e4427e917f542225242d63a05afa/lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e", size = 5312511, upload-time = "2026-05-18T19:20:09.308Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/57/a5807c98f87a86f10ef9ffab35516df7c0f0c4b6d5d33e9f608ab9c04a31/lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038", size = 4639206, upload-time = "2026-05-18T19:20:11.704Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/e1/8a0a2c35734812395f4da4eaf33748a7e5705bfb2a58b128da764339d5ec/lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e", size = 5232404, upload-time = "2026-05-18T19:20:14.064Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/e2/0e6a4dd5ad84d01d99aa7bae7cfefd4a760a0e0f8176818241de17d9b6c0/lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072", size = 5083769, upload-time = "2026-05-18T19:19:23.758Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/7e/161f33d463f6ffc1c7679104b65086dea120080d49dde4d238f015aaee2f/lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52", size = 4758936, upload-time = "2026-05-18T19:19:27.256Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/fb/2369825e3f6ca99305bf9f7b7085fda91c8b0922a89e54d900974aa3ef85/lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b", size = 5620296, upload-time = "2026-05-18T19:19:29.993Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/90/d61e383146f74c5ab683947ea14dc7b82778838ab9b95ea73a23b60d0191/lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2", size = 5228598, upload-time = "2026-05-18T19:19:33.523Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/76/2d/2dafd8149e94b05bb070690efd5bb2680720681e03ff03fc57d2b70a1105/lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e", size = 5247845, upload-time = "2026-05-18T19:19:36.649Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/68/b30e913340c380ddac9580c6e6230991fc37240ec4f64704833e4f3e2769/lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1", size = 3897345, upload-time = "2026-05-18T19:17:33.562Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/4e/9eb2af5335545f9fbcd7af57bcf87c6025d31eaa31b14ec184a6c8675328/lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e", size = 4393350, upload-time = "2026-05-18T19:18:10.076Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/2c/0f1e93c636720e8a3eb59af2bfda99d98b55891e1c53bc30c2e0e865f01b/lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c", size = 3817223, upload-time = "2026-05-19T19:22:56.823Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/90/2a23efb250167769570750e65468b787e7df1ea78260e98a33329f68ac64/lxml-6.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6689e828a94eee4f139408c337bb198e014724bb8a8c26d3cfac49d119ed69a6", size = 4705505, upload-time = "2026-05-18T19:18:50.286Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/bf/258ecb6dbd35379cae904d92402e92668911e4369af36655a9406dd0d4d6/lxml-6.1.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdebcc8a75d38c7598dfb2c9ed852d7a9eb4a10d6e2d0764b919b802bf32ac88", size = 5074417, upload-time = "2026-05-18T19:20:16.859Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/dc/eff216d79b7660f0a57d1c11b0b5de7e7ee8e0e5edb300d978257edad662/lxml-6.1.1-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8be8ad51249698103d24b0571df35a10990fbe93dd043b6c024172189485f5e3", size = 5220272, upload-time = "2026-05-18T19:20:19.363Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/3b/f854d6b609e47719b16e5fd1bc7a01259778c65f0d6f2c70bd9ad41b9feb/lxml-6.1.1-cp38-cp38-manylinux_2_28_i686.whl", hash = "sha256:76447f65250ed2501ead1a1552f5ce8edff159a86f308348e6a9c4acb5e1f1b4", size = 5377062, upload-time = "2026-05-18T19:20:21.795Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/5f/ad042f749424694f3ebf05f503afc9f49b6e015f3aa902b1c34f28310aac/lxml-6.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ffecec8eb889b58ba9be5b95fb1cc78e22ea8eedea38e8736a1568fe1979250e", size = 5247897, upload-time = "2026-05-18T19:19:39.22Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/c5/bf0ce3a16d1df817b6efc30ab762856a5d7cccbd78a3b8f7fff271fc7318/lxml-6.1.1-cp38-cp38-win32.whl", hash = "sha256:c674693f055fa2495de12292cb45e9944199d8eaef5a2dec45175c7c61cb73e3", size = 3611315, upload-time = "2026-05-18T19:17:52.194Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b9/d2/d6b209b6b2267918065d9f1ffc21545c42c336c8d6a7437ba2c25f9b03c8/lxml-6.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:55b03549819867ea141c0202242c4816c82e52ec36e7e648db9d8da5a3dc3ed6", size = 4033377, upload-time = "2026-05-18T19:18:26.807Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/b5/0a0f61cc8c6aa61f439d276e62e70cbf4f32205f57b1fbd483b8d0cf514b/lxml-6.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9f79d5325907f13e1be0b3e4dacc1049d1dffc4aeee3c995284bea5fe0fab7d", size = 8553821, upload-time = "2026-05-18T19:18:54.406Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/dc/66603d8f755d26f39c41cf29ed30e4a3bc93973d72a825cd12be91c5bd7b/lxml-6.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:83b6b30eb131da7a75b601f28c5d6971e6ed3e887919bf6b6a1ad3c2df289080", size = 4607623, upload-time = "2026-05-18T19:18:58.556Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/ad/5ea70128e6b0d34a52d16e2386666f8f9529c17cfac46d5980fd22c35daa/lxml-6.1.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:441dd227fa0690eb9fc81edabc63cdcefc212bba99b906dcf6e32cc1a9d3e533", size = 5005993, upload-time = "2026-05-18T19:20:24.125Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/c2/13a33e8659f95d59f28a293f31c31d61d858a1bd4294b82a662cfbae126b/lxml-6.1.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e07c65f443c887bbcf31cc1771d932ecc192a5273943589b3c7572b749f1ffb2", size = 5160240, upload-time = "2026-05-18T19:20:26.549Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/06/e850042d7b33cf47d2f1bc4accb31ab34478f56f46c376b7a67c6b1a84c5/lxml-6.1.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5bec7d03d78d853597d6107854c2310ce3f761fd218fe9fe91d5101fcf6c2efe", size = 5062940, upload-time = "2026-05-18T19:20:29.027Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f9/5a/8d7a0b3e42b21a553f01e288e70283f4de37c015c9c2477a0c31dafa0408/lxml-6.1.1-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f76acfb5f68ba982635a53fd985a8044be98a35b43232c2a1ee235ffab3e1dd", size = 5292921, upload-time = "2026-05-18T19:20:31.463Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/03/7c/9238d52bc426c8737b427ce57ea48c8a5a91974c5dcc55a34260dd851763/lxml-6.1.1-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:8d43ca737b20e106e4aebc42b2f3ae19f00ba63d7eb731698ee083d72d15646f", size = 5416716, upload-time = "2026-05-18T19:20:34.059Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/06/be127e1f36410d8ec84964adf76694b72f7705593c16c838dc8b1061b0b8/lxml-6.1.1-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:32ab449a5486f6c758e849bb86710d0e45edc24a04e250c01555f8f5653958f8", size = 4773279, upload-time = "2026-05-18T19:20:36.555Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/42/5e3ca677b4d56ae189a454764d28d922d343750419548409974d913a9b65/lxml-6.1.1-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53c909b62a0532183542fed00c5a7218258c56292d409bc789886fe1cb04c438", size = 5361618, upload-time = "2026-05-18T19:20:39.044Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/20/816979635625f8b8f88b69b5f7d9a4ebdc3c0bab1bf70c824e4ffe239879/lxml-6.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:640f97d43d867bcb9c75b3af013b64850756b746cb6bce8ace83b70da3abba9d", size = 5111217, upload-time = "2026-05-18T19:19:42.123Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/25/86/a6ec97064d25959d4932f2e91b547ce6b8380daa27de08b103c7b50be323/lxml-6.1.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:469e3618338bd7ab5beb412d2439825479fcf0dab99e394ca563dbc4eaf6c834", size = 4808149, upload-time = "2026-05-18T19:19:45.317Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/85/dc6087d1ba06589202ee25cda29abb175443da2da70c9e6bcf92091ad272/lxml-6.1.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:aae97dfdb60715c164419ac2532a76d013c3918a665eb6cb7288098b5f349aaf", size = 5352761, upload-time = "2026-05-18T19:19:48.608Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/93/e89fcb55d12b8e1473ce9a62b8f6ee215c89532f7a75a7ce55830834373b/lxml-6.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c9a4b821dc7055bf9e05ff5719e18ec501f75c0f0bbfabd573b277559780833d", size = 5315355, upload-time = "2026-05-18T19:19:51.077Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/c1/4f07e22d26e2e1ad741666f768df2d3b18ff1ddab3a99e2cb35d5b5df3a3/lxml-6.1.1-cp39-cp39-win32.whl", hash = "sha256:639f6c857d91d9be29bd7502348d6736dab168b54b5158cd899abf11684dc186", size = 3601121, upload-time = "2026-05-18T19:17:58.57Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/49/4bcb779b303876f1750eb37f534230ef4e7221341826cbd5e42388087393/lxml-6.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:34c2d737beabfe35baada43941ed519251e9a12e779031496bcd5d539fcfd730", size = 4024637, upload-time = "2026-05-18T19:18:32.806Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d8/e6/0d1b437d0783874ff15fb94be03045bce6dcefbce1ea22e44a2dbd59a902/lxml-6.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:07a4a68e286ee7a1ed7dfb8af83e615757c0ccfe9f18c6b4ea6771388d9ba8c9", size = 3670865, upload-time = "2026-05-19T19:23:01.555Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/32/86a3f0f724a3a402d4627937a7fc27b160e45e7012b4adf47f6e1e844511/lxml-6.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:31033dc34636ea6b7d5cc11b1ddbda78a14de858ba9d3e1ed4b69a3085bc521e", size = 3930127, upload-time = "2026-05-18T19:19:02.27Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/44/d832e82af08723761556d004b1d04d281c09f9a8cecd7d3148548c9941a3/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004", size = 4210769, upload-time = "2026-05-18T19:20:41.427Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/39/0dc5949f759ed7d951e0bb8c2f2d9d7aca1908d22352fa84a8afd2ea54af/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e", size = 4318163, upload-time = "2026-05-18T19:20:44.702Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e6/fb/8ab3845fe046ba4cbf74536bcf6801a774b7caf4350de1c5d37f1f0a9e90/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2", size = 4250945, upload-time = "2026-05-18T19:20:47.385Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/1b/7553ab136894374ffae8851ec06f98f511cd8e66246e41b6be059d0a7289/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf", size = 4401664, upload-time = "2026-05-18T19:20:50.489Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/db/a4/441aee36c6f6b249823d20fd91f9be9ab89d7c5a8ae542a4a4ca6d342d56/lxml-6.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:ed21202aec73cda4d55d1ce57b389aadb90ffb044e6cd1080b8347efe1b1ec84", size = 3508989, upload-time = "2026-05-18T19:18:38.158Z" }, +] + +[[package]] +name = "lxml-stubs" +version = "0.5.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/da/1a3a3e5d159b249fc2970d73437496b908de8e4716a089c69591b4ffa6fd/lxml-stubs-0.5.1.tar.gz", hash = "sha256:e0ec2aa1ce92d91278b719091ce4515c12adc1d564359dfaf81efa7d4feab79d", size = 14778, upload-time = "2024-01-10T09:37:46.521Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1f/c9/e0f8e4e6e8a69e5959b06499582dca6349db6769cc7fdfb8a02a7c75a9ae/lxml_stubs-0.5.1-py3-none-any.whl", hash = "sha256:1f689e5dbc4b9247cb09ae820c7d34daeb1fdbd1db06123814b856dae7787272", size = 13584, upload-time = "2024-01-10T09:37:44.931Z" }, +] + +[[package]] +name = "markupsafe" +version = "2.1.5" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", size = 19384, upload-time = "2024-02-02T16:31:22.863Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/54/ad5eb37bf9d51800010a74e4665425831a9db4e7c4e0fde4352e391e808e/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", size = 18206, upload-time = "2024-02-02T16:30:04.105Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/4a/a4d49415e600bacae038c67f9fecc1d5433b9d3c71a4de6f33537b89654c/MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", size = 14079, upload-time = "2024-02-02T16:30:06.5Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/7b/85681ae3c33c385b10ac0f8dd025c30af83c78cec1c37a6aa3b55e67f5ec/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", size = 26620, upload-time = "2024-02-02T16:30:08.31Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/52/2b1b570f6b8b803cef5ac28fdf78c0da318916c7d2fe9402a84d591b394c/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", size = 25818, upload-time = "2024-02-02T16:30:09.577Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/29/fe/a36ba8c7ca55621620b2d7c585313efd10729e63ef81e4e61f52330da781/MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", size = 25493, upload-time = "2024-02-02T16:30:11.488Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/60/ae/9c60231cdfda003434e8bd27282b1f4e197ad5a710c14bee8bea8a9ca4f0/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", size = 30630, upload-time = "2024-02-02T16:30:13.144Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/dc/1510be4d179869f5dafe071aecb3f1f41b45d37c02329dfba01ff59e5ac5/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", size = 29745, upload-time = "2024-02-02T16:30:14.222Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/39/8d845dd7d0b0613d86e0ef89549bfb5f61ed781f59af45fc96496e897f3a/MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", size = 30021, upload-time = "2024-02-02T16:30:16.032Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/5c/356a6f62e4f3c5fbf2602b4771376af22a3b16efa74eb8716fb4e328e01e/MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", size = 16659, upload-time = "2024-02-02T16:30:17.079Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/69/48/acbf292615c65f0604a0c6fc402ce6d8c991276e16c80c46a8f758fbd30c/MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", size = 17213, upload-time = "2024-02-02T16:30:18.251Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/e7/291e55127bb2ae67c64d66cef01432b5933859dfb7d6949daa721b89d0b3/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", size = 18219, upload-time = "2024-02-02T16:30:19.988Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/cb/aed7a284c00dfa7c0682d14df85ad4955a350a21d2e3b06d8240497359bf/MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", size = 14098, upload-time = "2024-02-02T16:30:21.063Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/cf/35fe557e53709e93feb65575c93927942087e9b97213eabc3fe9d5b25a55/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", size = 29014, upload-time = "2024-02-02T16:30:22.926Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/18/c30da5e7a0e7f4603abfc6780574131221d9148f323752c2755d48abad30/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", size = 28220, upload-time = "2024-02-02T16:30:24.76Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/40/2e73e7d532d030b1e41180807a80d564eda53babaf04d65e15c1cf897e40/MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", size = 27756, upload-time = "2024-02-02T16:30:25.877Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/46/5dca760547e8c59c5311b332f70605d24c99d1303dd9a6e1fc3ed0d73561/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", size = 33988, upload-time = "2024-02-02T16:30:26.935Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/c5/27febe918ac36397919cd4a67d5579cbbfa8da027fa1238af6285bb368ea/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", size = 32718, upload-time = "2024-02-02T16:30:28.111Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/81/56e567126a2c2bc2684d6391332e357589a96a76cb9f8e5052d85cb0ead8/MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", size = 33317, upload-time = "2024-02-02T16:30:29.214Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/0b/23f4b2470accb53285c613a3ab9ec19dc944eaf53592cb6d9e2af8aa24cc/MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", size = 16670, upload-time = "2024-02-02T16:30:30.915Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/a2/c78a06a9ec6d04b3445a949615c4c7ed86a0b2eb68e44e7541b9d57067cc/MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", size = 17224, upload-time = "2024-02-02T16:30:32.09Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", size = 18215, upload-time = "2024-02-02T16:30:33.081Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", size = 14069, upload-time = "2024-02-02T16:30:34.148Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", size = 29452, upload-time = "2024-02-02T16:30:35.149Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", size = 28462, upload-time = "2024-02-02T16:30:36.166Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", size = 27869, upload-time = "2024-02-02T16:30:37.834Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", size = 33906, upload-time = "2024-02-02T16:30:39.366Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", size = 32296, upload-time = "2024-02-02T16:30:40.413Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", size = 33038, upload-time = "2024-02-02T16:30:42.243Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", size = 16572, upload-time = "2024-02-02T16:30:43.326Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", size = 17127, upload-time = "2024-02-02T16:30:44.418Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a7/88/a940e11827ea1c136a34eca862486178294ae841164475b9ab216b80eb8e/MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", size = 13982, upload-time = "2024-02-02T16:30:46.06Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cb/06/0d28bd178db529c5ac762a625c335a9168a7a23f280b4db9c95e97046145/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", size = 26335, upload-time = "2024-02-02T16:30:47.676Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4a/1d/c4f5016f87ced614eacc7d5fb85b25bcc0ff53e8f058d069fc8cbfdc3c7a/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", size = 25557, upload-time = "2024-02-02T16:30:48.936Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/fb/c18b8c9fbe69e347fdbf782c6478f1bc77f19a830588daa224236678339b/MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", size = 25245, upload-time = "2024-02-02T16:30:50.711Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/69/30d29adcf9d1d931c75001dd85001adad7374381c9c2086154d9f6445be6/MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", size = 31013, upload-time = "2024-02-02T16:30:51.795Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/03/63498d05bd54278b6ca340099e5b52ffb9cdf2ee4f2d9b98246337e21689/MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", size = 30178, upload-time = "2024-02-02T16:30:52.866Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/79/11b4fe15124692f8673b603433e47abca199a08ecd2a4851bfbdc97dc62d/MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", size = 30429, upload-time = "2024-02-02T16:30:53.983Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/88/408bdbf292eb86f03201c17489acafae8358ba4e120d92358308c15cea7c/MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", size = 16633, upload-time = "2024-02-02T16:30:55.317Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/4c/3577a52eea1880538c435176bc85e5b3379b7ab442327ccd82118550758f/MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", size = 17215, upload-time = "2024-02-02T16:30:56.6Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f8/ff/2c942a82c35a49df5de3a630ce0a8456ac2969691b230e530ac12314364c/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", size = 18192, upload-time = "2024-02-02T16:30:57.715Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4f/14/6f294b9c4f969d0c801a4615e221c1e084722ea6114ab2114189c5b8cbe0/MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", size = 14072, upload-time = "2024-02-02T16:30:58.844Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/d4/fd74714ed30a1dedd0b82427c02fa4deec64f173831ec716da11c51a50aa/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", size = 26928, upload-time = "2024-02-02T16:30:59.922Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/bd/50319665ce81bb10e90d1cf76f9e1aa269ea6f7fa30ab4521f14d122a3df/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", size = 26106, upload-time = "2024-02-02T16:31:01.582Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/6f/f2b0f675635b05f6afd5ea03c094557bdb8622fa8e673387444fe8d8e787/MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68", size = 25781, upload-time = "2024-02-02T16:31:02.71Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/e0/393467cf899b34a9d3678e78961c2c8cdf49fb902a959ba54ece01273fb1/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", size = 30518, upload-time = "2024-02-02T16:31:04.392Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/02/5437e2ad33047290dafced9df741d9efc3e716b75583bbd73a9984f1b6f7/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", size = 29669, upload-time = "2024-02-02T16:31:05.53Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/7d/968284145ffd9d726183ed6237c77938c021abacde4e073020f920e060b2/MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", size = 29933, upload-time = "2024-02-02T16:31:06.636Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bf/f3/ecb00fc8ab02b7beae8699f34db9357ae49d9f21d4d3de6f305f34fa949e/MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", size = 16656, upload-time = "2024-02-02T16:31:07.767Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/92/21/357205f03514a49b293e214ac39de01fadd0970a6e05e4bf1ddd0ffd0881/MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", size = 17206, upload-time = "2024-02-02T16:31:08.843Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/31/780bb297db036ba7b7bbede5e1d7f1e14d704ad4beb3ce53fb495d22bc62/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", size = 18193, upload-time = "2024-02-02T16:31:10.155Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6c/77/d77701bbef72892affe060cdacb7a2ed7fd68dae3b477a8642f15ad3b132/MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", size = 14073, upload-time = "2024-02-02T16:31:11.442Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d9/a7/1e558b4f78454c8a3a0199292d96159eb4d091f983bc35ef258314fe7269/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", size = 26486, upload-time = "2024-02-02T16:31:12.488Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/5a/360da85076688755ea0cceb92472923086993e86b5613bbae9fbc14136b0/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", size = 25685, upload-time = "2024-02-02T16:31:13.726Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/18/ae5a258e3401f9b8312f92b028c54d7026a97ec3ab20bfaddbdfa7d8cce8/MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", size = 25338, upload-time = "2024-02-02T16:31:14.812Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/cc/48206bd61c5b9d0129f4d75243b156929b04c94c09041321456fd06a876d/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", size = 30439, upload-time = "2024-02-02T16:31:15.946Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/06/a41c112ab9ffdeeb5f77bc3e331fdadf97fa65e52e44ba31880f4e7f983c/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", size = 29531, upload-time = "2024-02-02T16:31:17.13Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/8c/ab9a463301a50dab04d5472e998acbd4080597abc048166ded5c7aa768c8/MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", size = 29823, upload-time = "2024-02-02T16:31:18.247Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/29/9bc18da763496b055d8e98ce476c8e718dcfd78157e17f555ce6dd7d0895/MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", size = 16658, upload-time = "2024-02-02T16:31:19.583Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/f8/4da07de16f10551ca1f640c92b5f316f9394088b183c6a57183df6de5ae4/MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", size = 17211, upload-time = "2024-02-02T16:31:20.96Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/56/23/0d8c13a44bde9154821586520840643467aee574d8ce79a17da539ee7fed/markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26", size = 11623, upload-time = "2025-09-27T18:37:29.296Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/23/07a2cb9a8045d5f3f0890a8c3bc0859d7a47bfd9a560b563899bec7b72ed/markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc", size = 12049, upload-time = "2025-09-27T18:37:30.234Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/bc/e4/6be85eb81503f8e11b61c0b6369b6e077dcf0a74adbd9ebf6b349937b4e9/markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c", size = 21923, upload-time = "2025-09-27T18:37:31.177Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/bc/4dc914ead3fe6ddaef035341fee0fc956949bbd27335b611829292b89ee2/markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42", size = 20543, upload-time = "2025-09-27T18:37:32.168Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/6e/5fe81fbcfba4aef4093d5f856e5c774ec2057946052d18d168219b7bd9f9/markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b", size = 20585, upload-time = "2025-09-27T18:37:33.166Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/f6/e0e5a3d3ae9c4020f696cd055f940ef86b64fe88de26f3a0308b9d3d048c/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758", size = 21387, upload-time = "2025-09-27T18:37:34.185Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c8/25/651753ef4dea08ea790f4fbb65146a9a44a014986996ca40102e237aa49a/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2", size = 20133, upload-time = "2025-09-27T18:37:35.138Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/0a/c3cf2b4fef5f0426e8a6d7fce3cb966a17817c568ce59d76b92a233fdbec/markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d", size = 20588, upload-time = "2025-09-27T18:37:36.096Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/1b/a7782984844bd519ad4ffdbebbba2671ec5d0ebbeac34736c15fb86399e8/markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7", size = 14566, upload-time = "2025-09-27T18:37:37.09Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/1f/8d9c20e1c9440e215a44be5ab64359e207fcb4f675543f1cf9a2a7f648d0/markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e", size = 15053, upload-time = "2025-09-27T18:37:38.054Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/d3/fe08482b5cd995033556d45041a4f4e76e7f0521112a9c9991d40d39825f/markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8", size = 13928, upload-time = "2025-09-27T18:37:39.037Z" }, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, +] + +[[package]] +name = "mypy" +version = "1.19.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "librt", marker = "python_full_version == '3.9.*' and platform_python_implementation != 'PyPy'" }, + { name = "mypy-extensions", marker = "python_full_version == '3.9.*'" }, + { name = "pathspec", marker = "python_full_version == '3.9.*'" }, + { name = "tomli", marker = "python_full_version == '3.9.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f5/db/4efed9504bc01309ab9c2da7e352cc223569f05478012b5d9ece38fd44d2/mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", size = 3582404, upload-time = "2025-12-15T05:03:48.42Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/63/e499890d8e39b1ff2df4c0c6ce5d371b6844ee22b8250687a99fd2f657a8/mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec", size = 13101333, upload-time = "2025-12-15T05:03:03.28Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/4b/095626fc136fba96effc4fd4a82b41d688ab92124f8c4f7564bffe5cf1b0/mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b", size = 12164102, upload-time = "2025-12-15T05:02:33.611Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0c/5b/952928dd081bf88a83a5ccd49aaecfcd18fd0d2710c7ff07b8fb6f7032b9/mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6", size = 12765799, upload-time = "2025-12-15T05:03:28.44Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2a/0d/93c2e4a287f74ef11a66fb6d49c7a9f05e47b0a4399040e6719b57f500d2/mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74", size = 13522149, upload-time = "2025-12-15T05:02:36.011Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/0e/33a294b56aaad2b338d203e3a1d8b453637ac36cb278b45005e0901cf148/mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1", size = 13810105, upload-time = "2025-12-15T05:02:40.327Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/fd/3e82603a0cb66b67c5e7abababce6bf1a929ddf67bf445e652684af5c5a0/mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac", size = 10057200, upload-time = "2025-12-15T05:02:51.012Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ef/47/6b3ebabd5474d9cdc170d1342fbf9dddc1b0ec13ec90bf9004ee6f391c31/mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288", size = 13028539, upload-time = "2025-12-15T05:03:44.129Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/a6/ac7c7a88a3c9c54334f53a941b765e6ec6c4ebd65d3fe8cdcfbe0d0fd7db/mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab", size = 12083163, upload-time = "2025-12-15T05:03:37.679Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/af/3afa9cf880aa4a2c803798ac24f1d11ef72a0c8079689fac5cfd815e2830/mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6", size = 12687629, upload-time = "2025-12-15T05:02:31.526Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2d/46/20f8a7114a56484ab268b0ab372461cb3a8f7deed31ea96b83a4e4cfcfca/mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331", size = 13436933, upload-time = "2025-12-15T05:03:15.606Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/f8/33b291ea85050a21f15da910002460f1f445f8007adb29230f0adea279cb/mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925", size = 13661754, upload-time = "2025-12-15T05:02:26.731Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fd/a3/47cbd4e85bec4335a9cd80cf67dbc02be21b5d4c9c23ad6b95d6c5196bac/mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042", size = 10055772, upload-time = "2025-12-15T05:03:26.179Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/8a/19bfae96f6615aa8a0604915512e0289b1fad33d5909bf7244f02935d33a/mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1", size = 13206053, upload-time = "2025-12-15T05:03:46.622Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/34/3e63879ab041602154ba2a9f99817bb0c85c4df19a23a1443c8986e4d565/mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e", size = 12219134, upload-time = "2025-12-15T05:03:24.367Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/89/cc/2db6f0e95366b630364e09845672dbee0cbf0bbe753a204b29a944967cd9/mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2", size = 12731616, upload-time = "2025-12-15T05:02:44.725Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/be/dd56c1fd4807bc1eba1cf18b2a850d0de7bacb55e158755eb79f77c41f8e/mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8", size = 13620847, upload-time = "2025-12-15T05:03:39.633Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/42/332951aae42b79329f743bf1da088cd75d8d4d9acc18fbcbd84f26c1af4e/mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a", size = 13834976, upload-time = "2025-12-15T05:03:08.786Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/63/e7493e5f90e1e085c562bb06e2eb32cae27c5057b9653348d38b47daaecc/mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13", size = 10118104, upload-time = "2025-12-15T05:03:10.834Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/9f/a6abae693f7a0c697dbb435aac52e958dc8da44e92e08ba88d2e42326176/mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250", size = 13201927, upload-time = "2025-12-15T05:02:29.138Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9a/a4/45c35ccf6e1c65afc23a069f50e2c66f46bd3798cbe0d680c12d12935caa/mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b", size = 12206730, upload-time = "2025-12-15T05:03:01.325Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/bb/cdcf89678e26b187650512620eec8368fded4cfd99cfcb431e4cdfd19dec/mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e", size = 12724581, upload-time = "2025-12-15T05:03:20.087Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/32/dd260d52babf67bad8e6770f8e1102021877ce0edea106e72df5626bb0ec/mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef", size = 13616252, upload-time = "2025-12-15T05:02:49.036Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/d0/5e60a9d2e3bd48432ae2b454b7ef2b62a960ab51292b1eda2a95edd78198/mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75", size = 13840848, upload-time = "2025-12-15T05:02:55.95Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/76/d32051fa65ecf6cc8c6610956473abdc9b4c43301107476ac03559507843/mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd", size = 10135510, upload-time = "2025-12-15T05:02:58.438Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/eb/b83e75f4c820c4247a58580ef86fcd35165028f191e7e1ba57128c52782d/mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1", size = 13199744, upload-time = "2025-12-15T05:03:30.823Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/28/52785ab7bfa165f87fcbb61547a93f98bb20e7f82f90f165a1f69bce7b3d/mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718", size = 12215815, upload-time = "2025-12-15T05:02:42.323Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/c6/bdd60774a0dbfb05122e3e925f2e9e846c009e479dcec4821dad881f5b52/mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b", size = 12740047, upload-time = "2025-12-15T05:03:33.168Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/2a/66ba933fe6c76bd40d1fe916a83f04fed253152f451a877520b3c4a5e41e/mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045", size = 13601998, upload-time = "2025-12-15T05:03:13.056Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/da/5055c63e377c5c2418760411fd6a63ee2b96cf95397259038756c042574f/mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957", size = 13807476, upload-time = "2025-12-15T05:03:17.977Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/09/4ebd873390a063176f06b0dbf1f7783dd87bd120eae7727fa4ae4179b685/mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f", size = 10281872, upload-time = "2025-12-15T05:03:05.549Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/f7/88436084550ca9af5e610fa45286be04c3b63374df3e021c762fe8c4369f/mypy-1.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3", size = 13102606, upload-time = "2025-12-15T05:02:46.833Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/a5/43dfad311a734b48a752790571fd9e12d61893849a01bff346a54011957f/mypy-1.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a", size = 12164496, upload-time = "2025-12-15T05:03:41.947Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/88/f0/efbfa391395cce2f2771f937e0620cfd185ec88f2b9cd88711028a768e96/mypy-1.19.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67", size = 12772068, upload-time = "2025-12-15T05:02:53.689Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/25/05/58b3ba28f5aed10479e899a12d2120d582ba9fa6288851b20bf1c32cbb4f/mypy-1.19.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e", size = 13520385, upload-time = "2025-12-15T05:02:38.328Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c5/a0/c006ccaff50b31e542ae69b92fe7e2f55d99fba3a55e01067dd564325f85/mypy-1.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376", size = 13796221, upload-time = "2025-12-15T05:03:22.147Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/ff/8bdb051cd710f01b880472241bd36b3f817a8e1c5d5540d0b761675b6de2/mypy-1.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24", size = 10055456, upload-time = "2025-12-15T05:03:35.169Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8d/f4/4ce9a05ce5ded1de3ec1c1d96cf9f9504a04e54ce0ed55cfa38619a32b8d/mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247", size = 2471239, upload-time = "2025-12-15T05:03:07.248Z" }, +] + +[[package]] +name = "mypy" +version = "2.1.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "ast-serialize", marker = "python_full_version >= '3.10'" }, + { name = "librt", marker = "python_full_version >= '3.10' and platform_python_implementation != 'PyPy'" }, + { name = "mypy-extensions", marker = "python_full_version >= '3.10'" }, + { name = "pathspec", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/82/15/cca9d88503549ed6fedeaa1d448cdddd542ee8a490232d732e278036fbf2/mypy-2.1.0.tar.gz", hash = "sha256:81e76ad12c2d804512e9b13240d1588316531bfba07558286078bfbce9613633", size = 3898359, upload-time = "2026-05-11T18:37:36.237Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a4/71/d351dca3e9b30da2328ee9d445c88b8388072808ebfbc49eb69d30b67749/mypy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11a6beb180257a805961aea9ec591bbd0bd17f1e18d35b8456d57aee5bedfedc", size = 14778792, upload-time = "2026-05-11T18:36:23.605Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2f/45/7d51594b644c17c0bcf74ed8cd5fc33b324276d708e8506f220b70dab9d9/mypy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ef78c1d306bbf9a8a12f526c44902c9c28dffd6c52c52bf6a72641ce18d3849", size = 13645739, upload-time = "2026-05-11T18:37:22.752Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/65/01/455c31b170e9468265074840bf18863a8482a24103fdaabe4e199392aa5f/mypy-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c209a90853081ff01d01ee895cafe10f7db1474e0d95beaeef0f6c1db9119bbd", size = 14074199, upload-time = "2026-05-11T18:35:09.292Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/41/5a/93093f0b29a9e982deafde698f740a2eb2e05886e79ccf0594c7fd5413a3/mypy-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47cebf61abde7c088a4e27718a8b13a81655686b2e9c251f5c0915a802248166", size = 14953128, upload-time = "2026-05-11T18:31:57.678Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/2f/a196f5331d96170ad3d28f144d2aba690d4b2911381f68d51e489c7ab82a/mypy-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d57a90ae5e872138a425ec328edbc9b235d1934c4377881a33ec05b341acc9a8", size = 15249378, upload-time = "2026-05-11T18:33:00.101Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/54/de/94d321cc12da9f71341ac0c270efbed5c725750c7b4c334d957de9a087d9/mypy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:aea7f7a8a55b459c34275fc468ada6ca7c173a5e43a68f5dbe588a563d8a06b8", size = 11060994, upload-time = "2026-05-11T18:33:18.848Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/62/0c27ca55219a7c764a7fb88c7bb2b7b2f9780ade8bbf16bc8ed8400eef6b/mypy-2.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c989640253f0d76843e9c6c1bbf4bd48c5e85ada61bde4beb37cb3eca035685e", size = 9976743, upload-time = "2026-05-11T18:31:25.554Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/a1/639f3024794a2a15899cb90707fe02e044c4412794c39c5769fd3df2e2ef/mypy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a683016b16fe2f572dc04c72be7ee0504ac1605a265d0200f5cea695fb788f41", size = 14691685, upload-time = "2026-05-11T18:33:27.973Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/08/9a585dea4325f20d8b80dc78623fa50d1fd2173b710f6237afd6ba6ab39b/mypy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a293c534adb55271fef24a26da04b855540a8c13cc07bc5917b9fd2c394f2ca", size = 13555165, upload-time = "2026-05-11T18:32:16.107Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/81/dc/7c42cc9c6cb01e8eb09961f1f738741d3e9c7e9d5c5b30ec69222625cd5f/mypy-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7406f4d048e71e576f5356d317e5b0a9e666dfd966bd99f9d14ca06e1a341538", size = 13994376, upload-time = "2026-05-11T18:32:39.256Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/fa/285946c33bce716e082c11dfeee9ee196eaf1f5042efb3581a31f9f205e4/mypy-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0210d626fc8b31ccc90233754c7bc90e1f43205e85d96387f7db1285b55c398", size = 14864618, upload-time = "2026-05-11T18:34:49.765Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/83/82397f48af6c27e295d57979ded8490c9829040152cf7571b2f026aeb9a0/mypy-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3712c20deed54e814eaaa825603bada8ea1c390670a397c95b98405347acc563", size = 15102063, upload-time = "2026-05-11T18:34:05.855Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/68/b02dec39057b88eb03dc0aa854732e26e8361f34f9d0e20c7614967d1eba/mypy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fcaa0e479066e31f7cceb6a3bea39cb22b2ff51a6b2f24f193d19179ba17c389", size = 11060564, upload-time = "2026-05-11T18:35:36.494Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cf/a8/ea3dcbef31f99b634f2ee23bb0321cbc8c1b388b76a861eb849f13c347dc/mypy-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b1a5260c95aa443083f9ed3592662941951bca3d4ca224a5dc517c38b7cf666", size = 9966983, upload-time = "2026-05-11T18:37:14.139Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/b1/55861beb5c339b44f9a2ba92df9e2cb1eeb4ae1eee674cdf7772c797778b/mypy-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:244358bf1c0da7722230bce60683d52e8e9fd030554926f15b747a84efb5b3af", size = 14874381, upload-time = "2026-05-11T18:37:31.784Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0b/b3/b7f770114b7d0ac92d0f76e8d93c2780844a70488a90e91821927850da86/mypy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ec7c57657493c7a75534df2751c8ae2cda383c16ecc55d2106c54476b1b16f6", size = 13665501, upload-time = "2026-05-11T18:34:23.063Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b6/f3/8ae2037967e2126689a0c11d99e2b707134a565191e92c60ca2572aec60a/mypy-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8161b6ff4392410023224f0969d17db93e1e154bc3e4ba62598e720723ae211", size = 14045750, upload-time = "2026-05-11T18:31:48.151Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/32/615eb5911859e43d054941b0d0a7d06cfa2870eba86529cf385b052b111c/mypy-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf03e12003084a67395184d3eb8cbd6a489dc3655b5664b28c210a9e2403ab0b", size = 15061630, upload-time = "2026-05-11T18:37:06.898Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d4/03/4eafbfff8bfab1b87082741eae6e6a624028c984e6708b73bce2a8570c9d/mypy-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:20509760fd791c51579d573153407d226385ec1f8bcce55d730b354f3336bc22", size = 15288831, upload-time = "2026-05-11T18:31:18.07Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/ee/919661478e5891a3c96e549c036e467e64563ab85995b10c53c8358e16a3/mypy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6753d0c1fdd6b1a23b9e4f283ce80b2153b724adcb2653b20b85a8a28ac6436b", size = 11135228, upload-time = "2026-05-11T18:34:31.23Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/0a/6a12b9782ca0831a553192f351679f4548abc9d19a7cc93bb7feb02084c7/mypy-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:98ebb6589bb3b6d0c6f0c459d53ca55b8091fbc13d277c4041c885392e8195e8", size = 10040684, upload-time = "2026-05-11T18:36:48.199Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/dd/c7191469c777f07689c032a8f7326e393ea34c92d6d76eb7ce5ba57ea66d/mypy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35aac3bb114e03888f535d5eb51b8bafbb3266586b599da1940f9b1be3ec5bd5", size = 14852174, upload-time = "2026-05-11T18:31:38.929Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/8c/aed55408879043d72bb9135f4d0d19a02b886dd569631e113e3d2706cb8d/mypy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de55a8c861f2a49331f807be98d90caeceeef520bde13d43a160207f8af613e", size = 13651542, upload-time = "2026-05-11T18:36:04.636Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3a/8e/f371a824b1f1fa8ea6e3dbb8703d232977d572be2329554a3bc4d960302f/mypy-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fdf2941a07434af755837d9880f7d7d25f1dacb1af9dcd4b9b66f2220a3024e", size = 14033929, upload-time = "2026-05-11T18:35:55.742Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/21/f54be870d6dd53a82c674407e0f8eed7174b05ec78d42e5abd7b42e84fd5/mypy-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e195b817c13f02352a9c124301f9f30f078405444679b6753c1b96b6eed37285", size = 15039200, upload-time = "2026-05-11T18:33:10.281Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/17/99/bf21748626a40ce59fd29a39386ab46afec88b7bd2f0fa6c3a97c995523f/mypy-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5431d42af987ebd92ba2f71d45c85ed41d8e6ca9f5fd209a69f68f707d2469e5", size = 15272690, upload-time = "2026-05-11T18:32:07.205Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/d7/9e90d2cf47100bea550ed2bc7b0d4de3a62181d84d5e37da0003e8462637/mypy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:767fe8c66dc3e01e19e1737d4c38ebefead16125e1b8e58ad421903b376f5c65", size = 11147435, upload-time = "2026-05-11T18:33:56.477Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/46/e5c449e858798e35ffc90946282a27c62a77be743fe17480e4977374eb91/mypy-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ecfe70d43775ab99562ab128ce49854a362044c9f894961f68f898c23cb7429d", size = 10035052, upload-time = "2026-05-11T18:32:30.049Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/ca/b279a672e874aedd5498ae25f722dacc8aa86bbffb939b3f97cbb1cf6686/mypy-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7354c5a7f69d9345c3d6e69921d57088eea3ddeeb6b20d34c1b3855b02c36ec2", size = 14848422, upload-time = "2026-05-11T18:35:45.984Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/e6/3efe56c631d959b9b4454e208b0ac4b7f4f58b404c89f8bec7b49efdfc21/mypy-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:49890d4f76ac9e06ec117f9e09f3174da70a620a0c300953d8595c926e80947f", size = 13677374, upload-time = "2026-05-11T18:36:57.188Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/84/7f/8107ea87a44fd1f1b59882442f033c9c3488c127201b1d1d15f1cbd6022e/mypy-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:761be68e023ef5d94678772396a8af1220030f80837a3afd8d0aef3b419666f4", size = 14055743, upload-time = "2026-05-11T18:35:18.361Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/4d/b6d34db183133b83761b9199a82d31557cdbb70a380d8c3b3438e11882a3/mypy-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c90345fc182dc363b891350457ec69c35140858538f38b4540845afcc32b1aef", size = 15020937, upload-time = "2026-05-11T18:34:59.618Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/d7/f08360c691d758acb02f45022c34d98b92892f4ea756644e1000d4b9f3d8/mypy-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b84802e7b5a6daf1f5e15bc9fcd7ddae77be13981ffab037f1c67bb84d67d135", size = 15253371, upload-time = "2026-05-11T18:36:41.081Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/1b/09460a13719530a19bce27bd3bc8449e83569dd2ba7faf51c9c3c30c0b61/mypy-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:022c771234936ceac541ebaf836fe9e2abeb3f5e09aff21588fe543ff006fe21", size = 11326429, upload-time = "2026-05-11T18:34:13.526Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/62/75dbf0f82f7b6680340efc614af29dd0b3c17b8a4f1cd09b8bd2fd6bc814/mypy-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:498207db725cec88829a6a5c2fc771205fd043719ef98bc49aba8fb9fc4e6d57", size = 10218799, upload-time = "2026-05-11T18:32:23.491Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/66/caca04ed7d972fb6eb6dd1ccd6df1de5c38fae8c5b3dc1c4e8e0d85ee6b9/mypy-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d5e5cad0efeba72b93cd17490cc0d69c5ac9ca132994fe3fb0314808aeeb83e", size = 15923458, upload-time = "2026-05-11T18:35:28.64Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/52/2d90cbe49d014b13ed7ff337930c30bad35893fe38a1e4641e756bb62191/mypy-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff715050c127d724fd260a2e666e7747fdd83511c0c47d449d98238970aef780", size = 14757697, upload-time = "2026-05-11T18:36:14.208Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/37/d98f4a14e081b238992d0ed96b6d39c7cc0148c9699eb71eaa68629665ea/mypy-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82208da9e09414d520e912d3e462d454854bed0810b71540bb016dcbca7308fd", size = 15405638, upload-time = "2026-05-11T18:33:48.249Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/c2/15c46613b24a84fad2aea1248bf9619b99c2767ae9071fe224c179a0b7d4/mypy-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e79ebc1b904b84f0310dff7469655a9c36c7a68bddb37bdd42b67a332df61d08", size = 16215852, upload-time = "2026-05-11T18:32:50.296Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/90/9c16a57f482c76d25f6379762b56bbf65c711d8158cf271fb2802cfb0640/mypy-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e583edc957cfb0deb142079162ae826f58449b116c1d442f2d91c69d9fced081", size = 16452695, upload-time = "2026-05-11T18:33:38.182Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0f/4c/215a4eeb63cacc5f17f516691ea7285d11e249802b942476bff15922a314/mypy-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b33b6cd332695bba180d55e717a79d3038e479a2c49cc5eb3d53603409b9a5d7", size = 12866622, upload-time = "2026-05-11T18:34:39.945Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4b/50/1043e1db5f455ffe4c9ab22747cd8ca2bc492b1e4f4e21b130a44ee2b217/mypy-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4f910fe825376a7b66ef7ca8c98e5a149e8cd64c19ae71d84047a74ee060d4e6", size = 10610798, upload-time = "2026-05-11T18:36:31.444Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/2a/13ca1f292f6db1b98ff495ef3467736b331621c5917cad984b7043e7348d/mypy-2.1.0-py3-none-any.whl", hash = "sha256:a663814603a5c563fb87a4f96fb473eeb30d1f5a4885afcf44f9db000a366289", size = 2693302, upload-time = "2026-05-11T18:31:29.246Z" }, +] + +[[package]] +name = "mypy-extensions" +version = "1.1.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, +] + +[[package]] +name = "packaging" +version = "24.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ee/b5/b43a27ac7472e1818c4bafd44430e69605baefe1f34440593e0332ec8b4d/packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9", size = 147882, upload-time = "2024-03-10T09:39:28.33Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", size = 53488, upload-time = "2024-03-10T09:39:25.947Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pathspec" +version = "1.1.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, +] + +[[package]] +name = "pockets" +version = "0.9.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/8e/0601097cfcce2e8c2297db5080e9719f549c2bd4b94420ddc8d3f848bbca/pockets-0.9.1.tar.gz", hash = "sha256:9320f1a3c6f7a9133fe3b571f283bcf3353cd70249025ae8d618e40e9f7e92b3", size = 24993, upload-time = "2019-11-02T14:46:19.433Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e9/2f/a4583c70fbd8cd04910e2884bcc2bdd670e884061f7b4d70bc13e632a993/pockets-0.9.1-py2.py3-none-any.whl", hash = "sha256:68597934193c08a08eb2bf6a1d85593f627c22f9b065cc727a4f03f669d96d86", size = 26263, upload-time = "2019-11-02T14:46:17.814Z" }, +] + +[[package]] +name = "pycodestyle" +version = "2.14.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", size = 39472, upload-time = "2025-06-20T18:49:48.75Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" }, +] + +[[package]] +name = "pyflakes" +version = "3.4.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/dc/fd034dc20b4b264b3d015808458391acbf9df40b1e54750ef175d39180b1/pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58", size = 64669, upload-time = "2025-06-20T18:45:27.834Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" }, +] + +[[package]] +name = "pygments" +version = "2.17.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/59/8bccf4157baf25e4aa5a0bb7fa3ba8600907de105ebc22b0c78cfbf6f565/pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367", size = 4827772, upload-time = "2023-11-21T20:43:53.875Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/97/9c/372fef8377a6e340b1704768d20daaded98bf13282b5327beb2e2fe2c7ef/pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", size = 1179756, upload-time = "2023-11-21T20:43:49.423Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "python-docx" +version = "1.1.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "lxml", version = "5.4.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "typing-extensions", version = "4.7.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/82/eb6c794e61b7060d465a23917161da4ab554dccce07a3b44a0d69a61ea7d/python-docx-1.1.0.tar.gz", hash = "sha256:5829b722141cf1ab79aedf0c34d9fe9924b29764584c0f2164eb2b02dcdf17c9", size = 5650988, upload-time = "2023-11-04T00:21:25.875Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5f/d8/6948f7ac00edf74bfa52b3c5e3073df20284bec1db466d13e668fe991707/python_docx-1.1.0-py3-none-any.whl", hash = "sha256:bac9773278098a1ddc43a52d84e22f5909c4a3080a624530b3ecb3771b07c6cd", size = 239604, upload-time = "2023-11-04T00:21:17.894Z" }, +] + +[[package]] +name = "python-docx" +version = "1.1.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "lxml", version = "6.1.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "typing-extensions", version = "4.13.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/e4/386c514c53684772885009c12b67a7edd526c15157778ac1b138bc75063e/python_docx-1.1.2.tar.gz", hash = "sha256:0cf1f22e95b9002addca7948e16f2cd7acdfd498047f1941ca5d293db7762efd", size = 5656581, upload-time = "2024-05-01T19:41:57.772Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3e/3d/330d9efbdb816d3f60bf2ad92f05e1708e4a1b9abe80461ac3444c83f749/python_docx-1.1.2-py3-none-any.whl", hash = "sha256:08c20d6058916fb19853fcf080f7f42b6270d89eac9fa5f8c15f691c0017fabe", size = 244315, upload-time = "2024-05-01T19:41:47.006Z" }, +] + +[[package]] +name = "python-docx" +version = "1.2.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "lxml", version = "6.1.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.9'" }, + { name = "typing-extensions", version = "4.15.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a9/f7/eddfe33871520adab45aaa1a71f0402a2252050c14c7e3009446c8f4701c/python_docx-1.2.0.tar.gz", hash = "sha256:7bc9d7b7d8a69c9c02ca09216118c86552704edc23bac179283f2e38f86220ce", size = 5723256, upload-time = "2025-06-16T20:46:27.921Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d0/00/1e03a4989fa5795da308cd774f05b704ace555a70f9bf9d3be057b680bcf/python_docx-1.2.0-py3-none-any.whl", hash = "sha256:3fd478f3250fbbbfd3b94fe1e985955737c145627498896a8a6bf81f4baf66c7", size = 252987, upload-time = "2025-06-16T20:46:22.506Z" }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[package]] +name = "requests" +version = "2.31.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version < '3.8'" }, + { name = "charset-normalizer", marker = "python_full_version < '3.8'" }, + { name = "idna", version = "3.10", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "urllib3", version = "2.0.7", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9d/be/10918a2eac4ae9f02f6cfe6414b7a155ccd8f7f9d4380d62fd5b955065c3/requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1", size = 110794, upload-time = "2023-05-22T15:12:44.175Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", size = 62574, upload-time = "2023-05-22T15:12:42.313Z" }, +] + +[[package]] +name = "requests" +version = "2.32.4" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version == '3.8.*'" }, + { name = "charset-normalizer", marker = "python_full_version == '3.8.*'" }, + { name = "idna", version = "3.15", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version == '3.9.*'" }, + { name = "charset-normalizer", marker = "python_full_version == '3.9.*'" }, + { name = "idna", version = "3.18", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "urllib3", version = "2.6.3", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version >= '3.10'" }, + { name = "charset-normalizer", marker = "python_full_version >= '3.10'" }, + { name = "idna", version = "3.18", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.10'" }, + { name = "urllib3", version = "2.7.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "roman-numerals" +version = "4.1.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "snowballstemmer" +version = "3.1.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/f8/0a71edf031f03c40db17503cb8ca78a69a171254e568e7db241b0ab57ea1/snowballstemmer-3.1.1.tar.gz", hash = "sha256:e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260", size = 123314, upload-time = "2026-06-03T00:56:40.194Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4c/07/2ebca9b11fb9be7340a818d8d6f63feaebb146be2c4afbd6061701d6df6e/snowballstemmer-3.1.1-py3-none-any.whl", hash = "sha256:7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752", size = 104164, upload-time = "2026-06-03T00:56:38.614Z" }, +] + +[[package]] +name = "sphinx" +version = "5.3.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "alabaster", version = "0.7.13", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "babel", version = "2.14.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "colorama", marker = "python_full_version < '3.8' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.19", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "imagesize", version = "1.5.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "importlib-metadata", version = "6.7.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "jinja2", marker = "python_full_version < '3.8'" }, + { name = "packaging", version = "24.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "pygments", version = "2.17.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "requests", version = "2.31.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "snowballstemmer", marker = "python_full_version < '3.8'" }, + { name = "sphinxcontrib-applehelp", version = "1.0.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "sphinxcontrib-devhelp", version = "1.0.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version < '3.8'" }, + { name = "sphinxcontrib-qthelp", version = "1.0.3", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, + { name = "sphinxcontrib-serializinghtml", version = "1.1.5", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/b2/02a43597980903483fe5eb081ee8e0ba2bb62ea43a70499484343795f3bf/Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5", size = 6811365, upload-time = "2022-10-16T09:58:25.963Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/a7/01dd6fd9653c056258d65032aa09a615b5d7b07dd840845a9f41a8860fbc/sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d", size = 3183160, upload-time = "2022-10-16T09:58:21.63Z" }, +] + +[[package]] +name = "sphinx" +version = "7.1.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +dependencies = [ + { name = "alabaster", version = "0.7.13", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "babel", version = "2.18.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "colorama", marker = "python_full_version == '3.8.*' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.20.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "imagesize", version = "1.5.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "importlib-metadata", version = "8.5.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "jinja2", marker = "python_full_version == '3.8.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "pygments", version = "2.19.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "snowballstemmer", marker = "python_full_version == '3.8.*'" }, + { name = "sphinxcontrib-applehelp", version = "1.0.4", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "sphinxcontrib-devhelp", version = "1.0.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.0.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.8.*'" }, + { name = "sphinxcontrib-qthelp", version = "1.0.3", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, + { name = "sphinxcontrib-serializinghtml", version = "1.1.5", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/01/688bdf9282241dca09fe6e3a1110eda399fa9b10d0672db609e37c2e7a39/sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f", size = 6828258, upload-time = "2023-08-02T02:06:09.375Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/17/325cf6a257d84751a48ae90752b3d8fe0be8f9535b6253add61c49d0d9bc/sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe", size = 3169543, upload-time = "2023-08-02T02:06:06.816Z" }, +] + +[[package]] +name = "sphinx" +version = "7.4.7" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "alabaster", version = "0.7.16", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "babel", version = "2.18.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "colorama", marker = "python_full_version == '3.9.*' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "imagesize", version = "1.5.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "importlib-metadata", version = "8.7.1", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "jinja2", marker = "python_full_version == '3.9.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "snowballstemmer", marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.9.*'" }, + { name = "tomli", marker = "python_full_version == '3.9.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911, upload-time = "2024-07-20T14:46:56.059Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624, upload-time = "2024-07-20T14:46:52.142Z" }, +] + +[[package]] +name = "sphinx" +version = "8.1.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "babel", version = "2.18.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "imagesize", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "jinja2", marker = "python_full_version == '3.10.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "requests", version = "2.34.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "snowballstemmer", marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.10.*'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload-time = "2024-10-13T20:27:10.448Z" }, +] + +[[package]] +name = "sphinx" +version = "9.0.4" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.11.*'", +] +dependencies = [ + { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "babel", version = "2.18.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "colorama", marker = "python_full_version == '3.11.*' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "imagesize", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "jinja2", marker = "python_full_version == '3.11.*'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "requests", version = "2.34.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "roman-numerals", marker = "python_full_version == '3.11.*'" }, + { name = "snowballstemmer", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version == '3.11.*'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, +] + +[[package]] +name = "sphinx" +version = "9.1.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", +] +dependencies = [ + { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "babel", version = "2.18.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "imagesize", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "jinja2", marker = "python_full_version >= '3.12'" }, + { name = "packaging", version = "26.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "pygments", version = "2.20.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "requests", version = "2.34.2", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-applehelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-devhelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-htmlhelp", version = "2.1.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-qthelp", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-serializinghtml", version = "2.0.0", source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/9f/01/ad9d4ebbceddbed9979ab4a89ddb78c9760e74e6757b1880f1b2760e8295/sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58", size = 24548, upload-time = "2020-02-29T04:12:56.32Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/47/86022665a9433d89a66f5911b558ddff69861766807ba685de2e324bd6ed/sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a", size = 121180, upload-time = "2020-02-29T04:12:53.793Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.4" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/32/df/45e827f4d7e7fcc84e853bcef1d836effd762d63ccb86f43ede4e98b478c/sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e", size = 24766, upload-time = "2023-01-23T09:41:54.435Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/06/c1/5e2cafbd03105ce50d8500f9b4e8a6e8d02e22d0475b574c3b3e9451a15f/sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228", size = 120601, upload-time = "2023-01-23T09:41:52.364Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/98/33/dc28393f16385f722c893cb55539c641c9aaec8d1bc1c15b69ce0ac2dbb3/sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4", size = 17398, upload-time = "2020-02-29T04:14:43.378Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c5/09/5de5ed43a521387f18bdf5f5af31d099605c992fd25372b2b9b825ce48ee/sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", size = 84690, upload-time = "2020-02-29T04:14:40.765Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/eb/85/93464ac9bd43d248e7c74573d58a791d48c475230bcf000df2b2700b9027/sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2", size = 28144, upload-time = "2021-05-22T16:02:13.018Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/40/c854ef09500e25f6432dcbad0f37df87fd7046d376272292d8654cc71c95/sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07", size = 100451, upload-time = "2021-05-22T16:02:11.218Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b3/47/64cff68ea3aa450c373301e5bebfbb9fce0a3e70aca245fcadd4af06cd75/sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff", size = 27967, upload-time = "2023-01-31T17:29:20.935Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6e/ee/a1f5e39046cbb5f8bc8fba87d1ddf1c6643fbc9194e58d26e606de4b9074/sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903", size = 99833, upload-time = "2023-01-31T17:29:18.489Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, +] + +[[package]] +name = "sphinxcontrib-napoleon" +version = "0.7" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +dependencies = [ + { name = "pockets" }, + { name = "six" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fa/eb/ad89500f4cee83187596e07f43ad561f293e8e6e96996005c3319653b89f/sphinxcontrib-napoleon-0.7.tar.gz", hash = "sha256:407382beed396e9f2d7f3043fad6afda95719204a1e1a231ac865f40abcbfcf8", size = 21232, upload-time = "2018-09-23T14:16:47.272Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/75/f2/6b7627dfe7b4e418e295e254bb15c3a6455f11f8c0ad0d43113f678049c3/sphinxcontrib_napoleon-0.7-py2.py3-none-any.whl", hash = "sha256:711e41a3974bdf110a484aec4c1a556799eb0b3f3b897521a018ad7e2db13fef", size = 17151, upload-time = "2018-09-23T14:16:45.548Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/8e/c4846e59f38a5f2b4a0e3b27af38f2fcf904d4bfd82095bf92de0b114ebd/sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", size = 21658, upload-time = "2020-02-29T04:19:10.026Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/14/05f9206cf4e9cfca1afb5fd224c7cd434dcc3a433d6d9e4e0264d29c6cdb/sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6", size = 90609, upload-time = "2020-02-29T04:19:08.451Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b5/72/835d6fadb9e5d02304cf39b18f93d227cd93abd3c41ebf58e6853eeb1455/sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952", size = 21019, upload-time = "2021-05-22T16:07:43.043Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/77/5464ec50dd0f1c1037e3c93249b040c8fc8078fdda97530eeb02424b6eea/sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", size = 94021, upload-time = "2021-05-22T16:07:41.627Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876, upload-time = "2023-07-02T14:20:55.045Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232, upload-time = "2023-07-02T14:20:53.275Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967, upload-time = "2025-04-10T14:19:05.416Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806, upload-time = "2025-04-10T14:19:03.967Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "urllib3" +version = "2.0.7" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/af/47/b215df9f71b4fdba1025fc05a77db2ad243fa0926755a52c5e71659f4e3c/urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", size = 282546, upload-time = "2023-10-17T17:46:50.542Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d2/b2/b157855192a68541a91ba7b2bbcb91f1b4faa51f8bae38d8005c034be524/urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e", size = 124213, upload-time = "2023-10-17T17:46:48.538Z" }, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677, upload-time = "2024-09-12T10:52:18.401Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338, upload-time = "2024-09-12T10:52:16.589Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version >= '3.15'", + "python_full_version >= '3.12' and python_full_version < '3.15'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "zipp" +version = "3.15.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/00/27/f0ac6b846684cecce1ee93d32450c45ab607f65c2e0255f0092032d91f07/zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", size = 18454, upload-time = "2023-02-25T02:17:22.503Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556", size = 6758, upload-time = "2023-02-25T02:17:20.807Z" }, +] + +[[package]] +name = "zipp" +version = "3.20.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.8.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", size = 24199, upload-time = "2024-09-13T13:44:16.101Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", size = 9200, upload-time = "2024-09-13T13:44:14.38Z" }, +] + +[[package]] +name = "zipp" +version = "3.23.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/30/21/093488dfc7cc8964ded15ab726fad40f25fd3d788fd741cc1c5a17d78ee8/zipp-3.23.1.tar.gz", hash = "sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110", size = 25965, upload-time = "2026-04-13T23:21:46.6Z" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl", hash = "sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc", size = 10378, upload-time = "2026-04-13T23:21:45.386Z" }, +] From 005620d5a1a6f900bce10cd24ec3246d7fe1f612 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 11:35:06 +0800 Subject: [PATCH 55/64] ci: add test workflow --- .github/workflows/test.yml | 58 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..3638775 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,58 @@ +name: Test +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: + - "3.14" + - "3.13" + - "3.12" + - "3.11" + - "3.10" + - "3.9" + - "3.8" + fail-fast: false + steps: + - name: Dump GitHub context + env: + GITHUB_CONTEXT: ${{ toJson(github) }} + run: echo "$GITHUB_CONTEXT" + - uses: actions/checkout@v6 + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: ${{ matrix.python-version }} + allow-prereleases: true + - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + with: + activate-environment: true + - name: Install dependencies + run: uv sync --all-extras --all-groups + - name: Build + run: uv build + - name: Test + run: python tests/runtests.py + + test_py37: + runs-on: ubuntu-latest + container: python:3.7-slim + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: "3.x" + - name: Install and configure Poetry + run: | + python3 -m pip install -U pip poetry + poetry env use 3.7 + - name: Install dependencies + run: poetry install --all-extras --all-groups + - name: Test + run: | + poetry run python tests/runtests.py + poetry run python -V + - name: Build + run: poetry build From 6f30ad4b5cee4acb54b06f53226e0db8ea3ef7ee Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 11:42:13 +0800 Subject: [PATCH 56/64] ci: update the test workflow --- .github/workflows/test.yml | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3638775..7c6dbea 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,6 @@ jobs: - "3.11" - "3.10" - "3.9" - - "3.8" fail-fast: false steps: - name: Dump GitHub context @@ -36,6 +35,27 @@ jobs: - name: Test run: python tests/runtests.py + test_py38: + runs-on: ubuntu-latest + container: python:3.8-slim + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-python@v6 + with: + python-version: "3.12" + - name: Install and configure Poetry + run: | + python3 -m pip install -U pip poetry + poetry env use 3.8 + - name: Install dependencies + run: poetry install --all-extras --all-groups + - name: Build + run: poetry build + - name: Test + run: | + poetry run python tests/runtests.py + poetry run python -V + test_py37: runs-on: ubuntu-latest container: python:3.7-slim @@ -43,16 +63,16 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: - python-version: "3.x" + python-version: "3.12" - name: Install and configure Poetry run: | python3 -m pip install -U pip poetry poetry env use 3.7 - name: Install dependencies run: poetry install --all-extras --all-groups + - name: Build + run: poetry build - name: Test run: | poetry run python tests/runtests.py poetry run python -V - - name: Build - run: poetry build From 45c3787d7f56fb473dffe68bb596c54bcef0f11b Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 11:54:01 +0800 Subject: [PATCH 57/64] Fix ci test error --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7c6dbea..5bc58c4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,13 +36,13 @@ jobs: run: python tests/runtests.py test_py38: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 container: python:3.8-slim steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: - python-version: "3.12" + python-version: "3.x" - name: Install and configure Poetry run: | python3 -m pip install -U pip poetry @@ -57,13 +57,13 @@ jobs: poetry run python -V test_py37: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 container: python:3.7-slim steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: - python-version: "3.12" + python-version: "3.x" - name: Install and configure Poetry run: | python3 -m pip install -U pip poetry From e51b194e22e1d3ef9c21856d003dccc2d184ca88 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 12:16:27 +0800 Subject: [PATCH 58/64] Fixing ci test error --- .github/workflows/test.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5bc58c4..32e59e0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,9 +40,6 @@ jobs: container: python:3.8-slim steps: - uses: actions/checkout@v6 - - uses: actions/setup-python@v6 - with: - python-version: "3.x" - name: Install and configure Poetry run: | python3 -m pip install -U pip poetry @@ -61,9 +58,6 @@ jobs: container: python:3.7-slim steps: - uses: actions/checkout@v6 - - uses: actions/setup-python@v6 - with: - python-version: "3.x" - name: Install and configure Poetry run: | python3 -m pip install -U pip poetry From f7422d775f829a90236e582e487450a6ac392fbf Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 12:33:04 +0800 Subject: [PATCH 59/64] ci: explicitly requires `poetry>=2.0` --- .github/workflows/test.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 32e59e0..d05d586 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,7 +24,6 @@ jobs: uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - allow-prereleases: true - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: activate-environment: true @@ -40,9 +39,13 @@ jobs: container: python:3.8-slim steps: - uses: actions/checkout@v6 + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" - name: Install and configure Poetry run: | - python3 -m pip install -U pip poetry + python3 -m pip install -U pip "poetry>=2.0" poetry env use 3.8 - name: Install dependencies run: poetry install --all-extras --all-groups @@ -58,9 +61,13 @@ jobs: container: python:3.7-slim steps: - uses: actions/checkout@v6 + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" - name: Install and configure Poetry run: | - python3 -m pip install -U pip poetry + python3 -m pip install -U pip "poetry>=2.0" poetry env use 3.7 - name: Install dependencies run: poetry install --all-extras --all-groups From 2b9c585c0d24aa86b4dd81f3791fb52304202cdb Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 14:06:52 +0800 Subject: [PATCH 60/64] ci: update test --- .github/workflows/test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d05d586..5ae51d4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -45,7 +45,7 @@ jobs: python-version: "3.12" - name: Install and configure Poetry run: | - python3 -m pip install -U pip "poetry>=2.0" + python3.12 -m pip install -U pip "poetry>=2.0" poetry env use 3.8 - name: Install dependencies run: poetry install --all-extras --all-groups @@ -67,7 +67,7 @@ jobs: python-version: "3.12" - name: Install and configure Poetry run: | - python3 -m pip install -U pip "poetry>=2.0" + python3.12 -m pip install -U pip "poetry>=2.0" poetry env use 3.7 - name: Install dependencies run: poetry install --all-extras --all-groups From a894d4c03ed1f74d8b007e6e4a624f0fe32c8bdb Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 14:26:41 +0800 Subject: [PATCH 61/64] ci: use uv --- .github/workflows/test.yml | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5ae51d4..aed3b28 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,41 +39,31 @@ jobs: container: python:3.8-slim steps: - uses: actions/checkout@v6 - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: "3.12" - - name: Install and configure Poetry - run: | - python3.12 -m pip install -U pip "poetry>=2.0" - poetry env use 3.8 + - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Create virtual environment + run: uv venv --python 3.8 - name: Install dependencies - run: poetry install --all-extras --all-groups + run: uv sync --all-extras --all-groups - name: Build - run: poetry build + run: uv build - name: Test run: | - poetry run python tests/runtests.py - poetry run python -V + uv run --frozen python tests/runtests.py + uv run --frozen python -V test_py37: runs-on: ubuntu-22.04 container: python:3.7-slim steps: - uses: actions/checkout@v6 - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: "3.12" - - name: Install and configure Poetry - run: | - python3.12 -m pip install -U pip "poetry>=2.0" - poetry env use 3.7 + - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Create virtual environment + run: uv venv --python 3.7 - name: Install dependencies - run: poetry install --all-extras --all-groups + run: uv sync --all-extras --all-groups - name: Build - run: poetry build + run: uv build - name: Test run: | - poetry run python tests/runtests.py - poetry run python -V + uv run --frozen python tests/runtests.py + uv run --frozen python -V From d56905a9cf143e2295b4fd7ebdd087f0d12ce847 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 18:00:45 +0800 Subject: [PATCH 62/64] Use pdm backend to fix py37/py38 ci test error --- .github/workflows/test.yml | 19 ++++++++++++------- pyproject.toml | 7 +++++-- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index aed3b28..c497d97 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -56,14 +56,19 @@ jobs: container: python:3.7-slim steps: - uses: actions/checkout@v6 - - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 - - name: Create virtual environment - run: uv venv --python 3.7 + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" + - name: Install and configure Poetry + run: | + python3.12 -m pip install -U pip "poetry>=2.0" + poetry env use 3.7 - name: Install dependencies - run: uv sync --all-extras --all-groups + run: poetry install --all-extras --all-groups - name: Build - run: uv build + run: poetry build - name: Test run: | - uv run --frozen python tests/runtests.py - uv run --frozen python -V + poetry run python tests/runtests.py + poetry run python -V diff --git a/pyproject.toml b/pyproject.toml index 00511f8..50a2091 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -66,6 +66,9 @@ exclude = ["docs", "build", "setup.py"] module = ["docxcompose.*"] ignore_missing_imports = true +[tool.pdm] +version = {source="file", path="docxtpl/__init__.py"} + [build-system] -requires = ["poetry-core", "poetry-dynamic-versioning >=1.0.0,<2.0.0"] -build-backend = "poetry_dynamic_versioning.backend" +requires = ["pdm-backend"] +build-backend = "pdm.backend" From 3576eabcfd733ece9757b854b11e0f21a43051c7 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Sun, 21 Jun 2026 23:52:40 +0800 Subject: [PATCH 63/64] ci: uv for py37 and poetry for py38 --- .github/workflows/test.yml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c497d97..fd44840 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -37,23 +37,6 @@ jobs: test_py38: runs-on: ubuntu-22.04 container: python:3.8-slim - steps: - - uses: actions/checkout@v6 - - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 - - name: Create virtual environment - run: uv venv --python 3.8 - - name: Install dependencies - run: uv sync --all-extras --all-groups - - name: Build - run: uv build - - name: Test - run: | - uv run --frozen python tests/runtests.py - uv run --frozen python -V - - test_py37: - runs-on: ubuntu-22.04 - container: python:3.7-slim steps: - uses: actions/checkout@v6 - name: Set up Python @@ -63,7 +46,7 @@ jobs: - name: Install and configure Poetry run: | python3.12 -m pip install -U pip "poetry>=2.0" - poetry env use 3.7 + poetry env use 3.8 - name: Install dependencies run: poetry install --all-extras --all-groups - name: Build @@ -72,3 +55,20 @@ jobs: run: | poetry run python tests/runtests.py poetry run python -V + + test_py37: + runs-on: ubuntu-22.04 + container: python:3.7-slim + steps: + - uses: actions/checkout@v6 + - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Create virtual environment + run: uv venv --python 3.7 + - name: Install dependencies + run: uv sync --all-extras --all-groups + - name: Build + run: uv build + - name: Test + run: | + uv run --frozen python tests/runtests.py + uv run --frozen python -V From 5b8aca5bdc2e9617ea2081c6cda0adc1f2358658 Mon Sep 17 00:00:00 2001 From: Waket Zheng Date: Mon, 22 Jun 2026 00:33:20 +0800 Subject: [PATCH 64/64] ci: uv for py38 test --- .github/workflows/test.yml | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fd44840..aed3b28 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -39,22 +39,17 @@ jobs: container: python:3.8-slim steps: - uses: actions/checkout@v6 - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: "3.12" - - name: Install and configure Poetry - run: | - python3.12 -m pip install -U pip "poetry>=2.0" - poetry env use 3.8 + - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Create virtual environment + run: uv venv --python 3.8 - name: Install dependencies - run: poetry install --all-extras --all-groups + run: uv sync --all-extras --all-groups - name: Build - run: poetry build + run: uv build - name: Test run: | - poetry run python tests/runtests.py - poetry run python -V + uv run --frozen python tests/runtests.py + uv run --frozen python -V test_py37: runs-on: ubuntu-22.04