diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c04e6b7..5d6b5ca 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,7 +26,7 @@ jobs: python -m pip install --upgrade pip pip install pipenv pipenv install --dev --deploy --system - pip install requests + pip install urllib3 - name: Run Tests run: | diff --git a/Pipfile b/Pipfile index 7001cf7..2f1b107 100644 --- a/Pipfile +++ b/Pipfile @@ -10,6 +10,6 @@ pylint = "*" pytest = "*" [packages] -requests = "*" +urllib3 = "*" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index f4e2d3c..4853b4b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e2d0f5150df22ec219f7a7db6bce507a8814df10b94e7a3acbac90a99ccdaa85" + "sha256": "d30b4043f48cf76dcc71b28f331c53a4e4fd90ac75299a90f8dddb4834c5fcb7" }, "pipfile-spec": 6, "requires": {}, @@ -14,13 +14,32 @@ ] }, "default": { + "urllib3": { + "hashes": [ + "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", + "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==2.6.3" + } + }, + "develop": { + "astroid": { + "hashes": [ + "sha256:52f39653876c7dec3e3afd4c2696920e05c83832b9737afc21928f2d2eb7a753", + "sha256:986fed8bcf79fb82c78b18a53352a0b287a73817d6dbcfba3162da36667c49a0" + ], + "markers": "python_full_version >= '3.10.0'", + "version": "==4.0.4" + }, "certifi": { "hashes": [ - "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", - "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7" + "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", + "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580" ], "markers": "python_version >= '3.7'", - "version": "==2026.2.25" + "version": "==2026.4.22" }, "charset-normalizer": { "hashes": [ @@ -157,183 +176,13 @@ "markers": "python_version >= '3.7'", "version": "==3.4.7" }, - "idna": { - "hashes": [ - "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", - "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902" - ], - "markers": "python_version >= '3.8'", - "version": "==3.11" - }, - "requests": { - "hashes": [ - "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", - "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a" - ], - "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==2.33.1" - }, - "urllib3": { - "hashes": [ - "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", - "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6.3" - } - }, - "develop": { - "astroid": { - "hashes": [ - "sha256:08d1de40d251cc3dc4a7a12726721d475ac189e4e583d596ece7422bc176bda3", - "sha256:864a0a34af1bd70e1049ba1e61cee843a7252c826d97825fcee9b2fcbd9e1b14" - ], - "markers": "python_full_version >= '3.10.0'", - "version": "==4.0.3" - }, - "backports.tarfile": { - "hashes": [ - "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", - "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991" - ], - "markers": "python_version >= '3.8'", - "version": "==1.2.0" - }, - "certifi": { - "hashes": [ - "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", - "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120" - ], - "markers": "python_version >= '3.7'", - "version": "==2026.1.4" - }, - "charset-normalizer": { - "hashes": [ - "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", - "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", - "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", - "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", - "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc", - "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", - "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63", - "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d", - "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", - "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", - "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", - "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505", - "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", - "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af", - "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", - "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318", - "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", - "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", - "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", - "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", - "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576", - "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", - "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1", - "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", - "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1", - "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", - "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", - "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", - "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88", - "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", - "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", - "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", - "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a", - "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", - "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", - "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", - "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", - "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", - "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7", - "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", - "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", - "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", - "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", - "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", - "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", - "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2", - "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", - "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", - "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", - "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", - "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf", - "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6", - "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", - "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", - "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa", - "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", - "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", - "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", - "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", - "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", - "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", - "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", - "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", - "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", - "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", - "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", - "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", - "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", - "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", - "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", - "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3", - "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9", - "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", - "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", - "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", - "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", - "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50", - "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf", - "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", - "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", - "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac", - "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", - "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", - "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c", - "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", - "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", - "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e", - "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4", - "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84", - "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", - "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", - "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", - "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", - "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", - "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", - "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", - "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", - "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", - "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074", - "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3", - "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", - "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", - "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", - "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d", - "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", - "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", - "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", - "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", - "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966", - "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", - "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3", - "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", - "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608" - ], - "markers": "python_version >= '3.7'", - "version": "==3.4.4" - }, "dill": { "hashes": [ - "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", - "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" + "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", + "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa" ], - "markers": "python_version >= '3.8'", - "version": "==0.4.0" + "markers": "python_version >= '3.9'", + "version": "==0.4.1" }, "docutils": { "hashes": [ @@ -345,19 +194,19 @@ }, "id": { "hashes": [ - "sha256:292cb8a49eacbbdbce97244f47a97b4c62540169c976552e497fd57df0734c1d", - "sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658" + "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069", + "sha256:f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca" ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" + "markers": "python_version >= '3.9'", + "version": "==1.6.1" }, "idna": { "hashes": [ - "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", - "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902" + "sha256:60ffaa1858fac94c9c124728c24fcde8160f3fb4a7f79aa8cdd33a9d1af60a67", + "sha256:724e9952cc9e2bd7550ea784adb098d837ab5267ef67a1ab9cf7846bdbdd8254" ], "markers": "python_version >= '3.8'", - "version": "==3.11" + "version": "==3.12" }, "iniconfig": { "hashes": [ @@ -369,11 +218,11 @@ }, "isort": { "hashes": [ - "sha256:1bcabac8bc3c36c7fb7b98a76c8abb18e0f841a3ba81decac7691008592499c1", - "sha256:5513527951aadb3ac4292a41a16cbc50dd1642432f5e8c20057d414bdafb4187" + "sha256:171ac4ff559cdc060bcfff550bc8404a486fee0caab245679c2abe7cb253c78d", + "sha256:28b89bc70f751b559aeca209e6120393d43fbe2490de0559662be7a9787e3d75" ], "markers": "python_full_version >= '3.10.0'", - "version": "==7.0.0" + "version": "==8.0.1" }, "jaraco.classes": { "hashes": [ @@ -385,11 +234,11 @@ }, "jaraco.context": { "hashes": [ - "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f", - "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda" + "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", + "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3" ], - "markers": "python_version >= '3.9'", - "version": "==6.1.0" + "markers": "python_version >= '3.10'", + "version": "==6.1.2" }, "jaraco.functools": { "hashes": [ @@ -409,85 +258,99 @@ }, "librt": { "hashes": [ - "sha256:067be973d90d9e319e6eb4ee2a9b9307f0ecd648b8a9002fa237289a4a07a9e7", - "sha256:0996c83b1cb43c00e8c87835a284f9057bc647abd42b5871e5f941d30010c832", - "sha256:0ecce0544d3db91a40f8b57ae26928c02130a997b540f908cefd4d279d6c5848", - "sha256:10c8fb9966f84737115513fecbaf257f9553d067a7dd45a69c2c7e5339e6a8dc", - "sha256:142c2cd91794b79fd0ce113bd658993b7ede0fe93057668c2f98a45ca00b7e91", - "sha256:14ef0f4ac3728ffd85bfc58e2f2f48fb4ef4fa871876f13a73a7381d10a9f77c", - "sha256:1908c3e5a5ef86b23391448b47759298f87f997c3bd153a770828f58c2bb4630", - "sha256:1bcd79be209313b270b0e1a51c67ae1af28adad0e0c7e84c3ad4b5cb57aaa75b", - "sha256:23d2299ed007812cccc1ecef018db7d922733382561230de1f3954db28433977", - "sha256:23daa1ab0512bafdd677eb1bfc9611d8ffbe2e328895671e64cb34166bc1b8c8", - "sha256:2567cb48dc03e5b246927ab35cbb343376e24501260a9b5e30b8e255dca0d1d2", - "sha256:264720fc288c86039c091a4ad63419a5d7cabbf1c1c9933336a957ed2483e570", - "sha256:2987cf827011907d3dfd109f1be0d61e173d68b1270107bb0e89f2fca7f2ed6b", - "sha256:2a85a1fc4ed11ea0eb0a632459ce004a2d14afc085a50ae3463cd3dfe1ce43fc", - "sha256:3d1fe2e8df3268dd6734dba33ededae72ad5c3a859b9577bc00b715759c5aaab", - "sha256:4353ee891a1834567e0302d4bd5e60f531912179578c36f3d0430f8c5e16b456", - "sha256:44d63ce643f34a903f09ff7ca355aae019a3730c7afd6a3c037d569beeb5d151", - "sha256:467dbd7443bda08338fc8ad701ed38cef48194017554f4c798b0a237904b3f99", - "sha256:4862cb2c702b1f905c0503b72d9d4daf65a7fdf5a9e84560e563471e57a56949", - "sha256:4bf3cc46d553693382d2abf5f5bd493d71bb0f50a7c0beab18aa13a5545c8900", - "sha256:4dcee2f921a8632636d1c37f1bbdb8841d15666d119aa61e5399c5268e7ce02e", - "sha256:50d1d1ee813d2d1a3baf2873634ba506b263032418d16287c92ec1cc9c1a00cb", - "sha256:5335890fea9f9e6c4fdf8683061b9ccdcbe47c6dc03ab8e9b68c10acf78be78d", - "sha256:558a9e5a6f3cc1e20b3168fb1dc802d0d8fa40731f6e9932dcc52bbcfbd37111", - "sha256:5e419e0db70991b6ba037b70c1d5bbe92b20ddf82f31ad01d77a347ed9781398", - "sha256:6066c638cdf85ff92fc6f932d2d73c93a0e03492cdfa8778e6d58c489a3d7259", - "sha256:6ae8aec43117a645a31e5f60e9e3a0797492e747823b9bda6972d521b436b4e8", - "sha256:6b6f8ea465524aa4c7420c7cc4ca7d46fe00981de8debc67b1cc2e9957bb5b9d", - "sha256:7b16ccaeff0ed4355dfb76fe1ea7a5d6d03b5ad27f295f77ee0557bc20a72495", - "sha256:7d13cc340b3b82134f8038a2bfe7137093693dcad8ba5773da18f95ad6b77a8a", - "sha256:7ef28f2e7a016b29792fe0a2dd04dec75725b32a1264e390c366103f834a9c3a", - "sha256:8185c8497d45164e256376f9da5aed2bb26ff636c798c9dabe313b90e9f25b28", - "sha256:81d957b069fed1890953c3b9c3895c7689960f233eea9a1d9607f71ce7f00b2c", - "sha256:86f86b3b785487c7760247bcdac0b11aa8bf13245a13ed05206286135877564b", - "sha256:8e92c8de62b40bfce91d5e12c6e8b15434da268979b1af1a6589463549d491e6", - "sha256:8f2f8dcf5ab9f80fb970c6fd780b398efb2f50c1962485eb8d3ab07788595a48", - "sha256:8f4a0b0a3c86ba9193a8e23bb18f100d647bf192390ae195d84dfa0a10fb6244", - "sha256:8f7a74cf3a80f0c3b0ec75b0c650b2f0a894a2cec57ef75f6f72c1e82cdac61d", - "sha256:955c62571de0b181d9e9e0a0303c8bc90d47670a5eff54cf71bf5da61d1899cf", - "sha256:983de36b5a83fe9222f4f7dcd071f9b1ac6f3f17c0af0238dadfb8229588f890", - "sha256:9b15e5d17812d4d629ff576699954f74e2cc24a02a4fc401882dd94f81daba45", - "sha256:9b4346b1225be26def3ccc6c965751c74868f0578cbcba293c8ae9168483d811", - "sha256:9b5fb1ecb2c35362eab2dbd354fd1efa5a8440d3e73a68be11921042a0edc0ff", - "sha256:a10b8eebdaca6e9fdbaf88b5aefc0e324b763a5f40b1266532590d5afb268a4c", - "sha256:a1f5cc41a570269d1be7a676655875e3a53de4992a9fa38efb7983e97cf73d7c", - "sha256:a3bfe73a32bd0bdb9a87d586b05a23c0a1729205d79df66dee65bb2e40d671ba", - "sha256:a487b71fbf8a9edb72a8c7a456dda0184642d99cd007bc819c0b7ab93676a8ee", - "sha256:a609849aca463074c17de9cda173c276eb8fee9e441053529e7b9e249dc8b8ee", - "sha256:a76f1d679beccccdf8c1958e732a1dfcd6e749f8821ee59d7bec009ac308c029", - "sha256:a7ea4e1fbd253e5c68ea0fe63d08577f9d288a73f17d82f652ebc61fa48d878d", - "sha256:ab2a2a9cd7d044e1a11ca64a86ad3361d318176924bbe5152fbc69f99be20b8c", - "sha256:ad3fc2d859a709baf9dd9607bb72f599b1cfb8a39eafd41307d0c3c4766763cb", - "sha256:add4e0a000858fe9bb39ed55f31085506a5c38363e6eb4a1e5943a10c2bfc3d1", - "sha256:aea05f701ccd2a76b34f0daf47ca5068176ff553510b614770c90d76ac88df06", - "sha256:b8bb331aad734b059c4b450cd0a225652f16889e286b2345af5e2c3c625c3d85", - "sha256:bdb9f3d865b2dafe7f9ad7f30ef563c80d0ddd2fdc8cc9b8e4f242f475e34d75", - "sha256:c084841b879c4d9b9fa34e5d5263994f21aea7fd9c6add29194dbb41a6210536", - "sha256:c48c7e150c095d5e3cea7452347ba26094be905d6099d24f9319a8b475fcd3e0", - "sha256:c7e5070cf3ec92d98f57574da0224f8c73faf1ddd6d8afa0b8c9f6e86997bc74", - "sha256:c87654e29a35938baead1c4559858f346f4a2a7588574a14d784f300ffba0efd", - "sha256:c8ffe3431d98cc043a14e88b21288b5ec7ee12cb01260e94385887f285ef9389", - "sha256:c9faaebb1c6212c20afd8043cd6ed9de0a47d77f91a6b5b48f4e46ed470703fe", - "sha256:d1454899909d63cc9199a89fcc4f81bdd9004aef577d4ffc022e600c412d57f3", - "sha256:d6b7d93657332c817b8d674ef6bf1ab7796b4f7ce05e420fd45bd258a72ac804", - "sha256:dbc4900e95a98fc0729523be9d93a8fedebb026f32ed9ffc08acd82e3e181503", - "sha256:e40d20ae1722d6b8ea6acf4597e789604649dcd9c295eb7361a28225bc2e9e12", - "sha256:e4836c5645f40fbdc275e5670819bde5ab5f2e882290d304e3c6ddab1576a6d0", - "sha256:e4ab69fa37f8090f2d971a5d2bc606c7401170dbdae083c393d6cbf439cb45b8", - "sha256:ef7699b7a5a244b1119f85c5bbc13f152cd38240cbb2baa19b769433bae98e50", - "sha256:f0c8fe5aeadd8a0e5b0598f8a6ee3533135ca50fd3f20f130f9d72baf5c6ac58", - "sha256:f2cb63c49bc96847c3bb8dca350970e4dcd19936f391cfdfd057dcb37c4fa97e", - "sha256:f4d4efb218264ecf0f8516196c9e2d1a0679d9fb3bb15df1155a35220062eba8", - "sha256:f683dcd49e2494a7535e30f779aa1ad6e3732a019d80abe1309ea91ccd3230e3", - "sha256:f83c971eb9d2358b6a18da51dc0ae00556ac7c73104dde16e9e14c15aaf685ca", - "sha256:f8df32a99cc46eb0ee90afd9ada113ae2cafe7e8d673686cf03ec53e49635439", - "sha256:ff1fb2dfef035549565a4124998fadcb7a3d4957131ddf004a56edeb029626b3" + "sha256:07cf11f769831186eeac424376e6189f20ace4f7263e2134bdb9757340d84d4d", + "sha256:0a09c2f5869649101738653a9b7ab70cf045a1105ac66cbb8f4055e61df78f2d", + "sha256:0a1be03168b2691ba61927e299b352a6315189199ca18a57b733f86cb3cc8d38", + "sha256:0b73e4266307e51c95e09c0750b7ec383c561d2e97d58e473f6f6a209952fbb8", + "sha256:15cb151e52a044f06e54ac7f7b47adbfc89b5c8e2b63e1175a9d587c43e8942a", + "sha256:194fc1a32e1e21fe809d38b5faea66cc65eaa00217c8901fbdb99866938adbdb", + "sha256:1bf465d1e5b0a27713862441f6467b5ab76385f4ecf8f1f3a44f8aa3c695b4b6", + "sha256:1c587494461ebd42229d0f1739f3aa34237dd9980623ecf1be8d3bcba79f4499", + "sha256:224b9727eb8bc188bc3bcf29d969dba0cd61b01d9bac80c41575520cc4baabb2", + "sha256:22a904cbdb678f7cb348c90d543d3c52f581663d687992fee47fd566dcbf5285", + "sha256:2b8f5d00b49818f4e2b1667db994488b045835e0ac16fe2f924f3871bd2b8ac5", + "sha256:2c3786f0f4490a5cd87f1ed6cefae833ad6b1060d52044ce0434a2e85893afd0", + "sha256:2d03fa4fd277a7974c1978c92c374c57f44edeee163d147b477b143446ad1bf6", + "sha256:2f8e12706dcb8ff6b3ed57514a19e45c49ad00bcd423e87b2b2e4b5f64578443", + "sha256:3be322a15ee5e70b93b7a59cfd074614f22cc8c9ff18bd27f474e79137ea8d3b", + "sha256:3cc2917258e131ae5f958a4d872e07555b51cb7466a43433218061c74ef33745", + "sha256:3f05d145df35dca5056a8bc3838e940efebd893a54b3e19b2dda39ceaa299bcb", + "sha256:3fe56e80badb66fdcde06bef81bbaa5bfcf6fbd7aefb86222d9e369c38c6b228", + "sha256:42ff8a962554c350d4a83cf47d9b7b78b0e6ff7943e87df7cdfc97c07f3c016f", + "sha256:451daa98463b7695b0a30aa56bf637831ea559e7b8101ac2ef6382e8eb15e29c", + "sha256:465814ab157986acb9dfa5ccd7df944be5eefc0d08d31ec6e8d88bc71251d845", + "sha256:4c4d0440a3a8e31d962340c3e1cc3fc9ee7febd34c8d8f770d06adb947779ea5", + "sha256:4e3dda8345307fd7306db0ed0cb109a63a2c85ba780eb9dc2d09b2049a931f9c", + "sha256:5093043afb226ecfa1400120d1ebd4442b4f99977783e4f4f7248879009b227f", + "sha256:5112c2fb7c2eefefaeaf5c97fec81343ef44ee86a30dcfaa8223822fba6467b4", + "sha256:527b5b820b47a09e09829051452bb0d1dd2122261254e2a6f674d12f1d793d54", + "sha256:54d412e47c21b85865676ed0724e37a89e9593c2eee1e7367adf85bfad56ffb1", + "sha256:56d65b583cf43b8cf4c8fbe1e1da20fa3076cc32a1149a141507af1062718236", + "sha256:5ca8e133d799c948db2ab1afc081c333a825b5540475164726dcbf73537e5c2f", + "sha256:603138ee838ee1583f1b960b62d5d0007845c5c423feb68e44648b1359014e27", + "sha256:63c12efcd160e1d14da11af0c46c0217473e1e0d2ae1acbccc83f561ea4c2a7b", + "sha256:657f8ba7b9eaaa82759a104137aed2a3ef7bc46ccfd43e0d89b04005b3e0a4cc", + "sha256:66b58fed90a545328e80d575467244de3741e088c1af928f0b489ebec3ef3858", + "sha256:6788207daa0c19955d2b668f3294a368d19f67d9b5f274553fd073c1260cbb9f", + "sha256:703f4ae36d6240bfe24f542bac784c7e4194ec49c3ba5a994d02891649e2d85b", + "sha256:7202bdcac47d3a708271c4304a474a8605a4a9a4a709e954bf2d3241140aa938", + "sha256:756775d25ec8345b837ab52effee3ad2f3b2dfd6bbee3e3f029c517bd5d8f05a", + "sha256:78042f6facfd98ecb25e9829c7e37cce23363d9d7c83bc5f72702c5059eb082b", + "sha256:789fff71757facc0738e8d89e3b84e4f0251c1c975e85e81b152cdaca927cc2d", + "sha256:7bc30ad339f4e1a01d4917d645e522a0bc0030644d8973f6346397c93ba1503f", + "sha256:7d429bdd4ac0ab17c8e4a8af0ed2a7440b16eba474909ab357131018fe8c7e71", + "sha256:7d5c8a5929ac325729f6119802070b561f4db793dffc45e9ac750992a4ed4d22", + "sha256:7e6274fd33fc5b2a14d41c9119629d3ff395849d8bcbc80cf637d9e8d2034da8", + "sha256:80b25c7b570a86c03b5da69e665809deb39265476e8e21d96a9328f9762f9990", + "sha256:81107843ed1836874b46b310f9b1816abcb89912af627868522461c3b7333c0f", + "sha256:8494cfc61e03542f2d381e71804990b3931175a29b9278fdb4a5459948778dc2", + "sha256:850d6d03177e52700af605fd60db7f37dcb89782049a149674d1a9649c2138fd", + "sha256:8c6bc1384d9738781cfd41d09ad7f6e8af13cfea2c75ece6bd6d2566cdea2076", + "sha256:90904fac73c478f4b83f4ed96c99c8208b75e6f9a8a1910548f69a00f1eaa671", + "sha256:90e6d5420fc8a300518d4d2288154ff45005e920425c22cbbfe8330f3f754bd9", + "sha256:928bd06eca2c2bbf4349e5b817f837509b0604342e65a502de1d50a7570afd15", + "sha256:9b3e3bc363f71bda1639a4ee593cb78f7fbfeacc73411ec0d4c92f00730010a4", + "sha256:9edcc35d1cae9fd5320171b1a838c7da8a5c968af31e82ecc3dff30b4be0957f", + "sha256:9fcb461fbf70654a52a7cc670e606f04449e2374c199b1825f754e16dacfedd8", + "sha256:a0951822531e7aee6e0dfb556b30d5ee36bbe234faf60c20a16c01be3530869d", + "sha256:a361c9434a64d70a7dbb771d1de302c0cc9f13c0bffe1cf7e642152814b35265", + "sha256:a4b25c6c25cac5d0d9d6d6da855195b254e0021e513e0249f0e3b444dc6e0e61", + "sha256:a5af136bfba820d592f86c67affcef9b3ff4d4360ac3255e341e964489b48519", + "sha256:a81eea9b999b985e4bacc650c4312805ea7008fd5e45e1bf221310176a7bcb3a", + "sha256:a9c63e04d003bc0fb6a03b348018b9a3002f98268200e22cc80f146beac5dc40", + "sha256:aa95738a68cedd3a6f5492feddc513e2e166b50602958139e47bbdd82da0f5a7", + "sha256:b0a2040f801406b93657a70b72fa12311063a319fee72ce98e1524da7200171f", + "sha256:b8bd70d5d816566a580d193326912f4a76ec2d28a97dc4cd4cc831c0af8e330e", + "sha256:b8da9f8035bb417770b1e1610526d87ad4fc58a2804dc4d79c53f6d2cf5a6eb9", + "sha256:bc5518873822d2faa8ebdd2c1a4d7c8ef47b01a058495ab7924cb65bdbf5fc9a", + "sha256:c0d620e74897f8c2613b3c4e2e9c1e422eb46d2ddd07df540784d44117836af3", + "sha256:c2640e23d2b7c98796f123ffd95cf2022c7777aa8a4a3b98b36c570d37e85eee", + "sha256:c81aef782380f0f13ead670aae01825eb653b44b046aa0e5ebbb79f76ed4aa11", + "sha256:d4d16b608a1c43d7e33142099a75cd93af482dadce0bf82421e91cad077157f4", + "sha256:d69fc39e627908f4c03297d5a88d9284b73f4d90b424461e32e8c2485e21c283", + "sha256:d9da80e5b04acce03ced8ba6479a71c2a2edf535c2acc0d09c80d2f80f3bad15", + "sha256:dd2c7e082b0b92e1baa4da28163a808672485617bc855cc22a2fd06978fa9084", + "sha256:de7dac64e3eb832ffc7b840eb8f52f76420cde1b845be51b2a0f6b870890645e", + "sha256:e0785c2fb4a81e1aece366aa3e2e039f4a4d7d21aaaded5227d7f3c703427882", + "sha256:e306d956cfa027fe041585f02a1602c32bfa6bb8ebea4899d373383295a6c62f", + "sha256:e78fb7419e07d98c2af4b8567b72b3eaf8cb05caad642e9963465569c8b2d87e", + "sha256:e9002e98dcb1c0a66723592520decd86238ddcef168b37ff6cfb559200b4b774", + "sha256:e94cbc6ad9a6aeea46d775cbb11f361022f778a9cc8cc90af653d3a594b057ce", + "sha256:eea1b54943475f51698f85fa230c65ccac769f1e603b981be060ac5763d90927", + "sha256:f100bfe2acf8a3689af9d0cc660d89f17286c9c795f9f18f7b62dd1a6b247ae6", + "sha256:f162af66a2ed3f7d1d161a82ca584efd15acd9c1cff190a373458c32f7d42118", + "sha256:f24b90b0e0c8cc9491fb1693ae91fe17cb7963153a1946395acdbdd5818429a4", + "sha256:f29b68cd9714531672db62cc54f6e8ff981900f824d13fa0e00749189e13778e", + "sha256:f38bc489037eca88d6ebefc9c4d41a4e07c8e8b4de5188a9e6d290273ad7ebb1", + "sha256:f3fd278f5e6bf7c75ccd6d12344eb686cc020712683363b66f46ac79d37c799f", + "sha256:f4003f70c56a5addd6aa0897f200dd59afd3bf7bcd5b3cce46dd21f925743bc2", + "sha256:f48c963a76d71b9d7927eb817b543d0dccd52ab6648b99d37bd54f4cd475d856", + "sha256:f819e0c6413e259a17a7c0d49f97f405abadd3c2a316a3b46c6440b7dbbedbb1", + "sha256:fc5758e2b7a56532dc33e3c544d78cbaa9ecf0a0f2a2da2df882c1d6b99a317f", + "sha256:fcbdf2a9ca24e87bbebb47f1fe34e531ef06f104f98c9ccfc953a3f3344c567a" ], "markers": "python_version >= '3.9'", - "version": "==0.7.7" + "version": "==0.9.0" }, "markdown-it-py": { "hashes": [ @@ -515,56 +378,62 @@ }, "more-itertools": { "hashes": [ - "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", - "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd" + "sha256:392a9e1e362cbc106a2457d37cabf9b36e5e12efd4ebff1654630e76597df804", + "sha256:6e35b35f818b01f691643c6c611bc0902f2e92b46c18fffa77ae1e7c46e912e4" ], - "markers": "python_version >= '3.9'", - "version": "==10.8.0" + "markers": "python_version >= '3.10'", + "version": "==11.0.2" }, "mypy": { "hashes": [ - "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd", - "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b", - "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1", - "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", - "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b", - "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045", - "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac", - "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6", - "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a", - "sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24", - "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957", - "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042", - "sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e", - "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec", - "sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3", - "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718", - "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f", - "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331", - "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1", - "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1", - "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13", - "sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67", - "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2", - "sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a", - "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b", - "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8", - "sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376", - "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef", - "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288", - "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75", - "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74", - "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250", - "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab", - "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6", - "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247", - "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925", - "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e", - "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e" + "sha256:0c64e5973df366b747646fc98da921f9d6eba9716d57d1db94a83c026a08e0fb", + "sha256:0deb80d062b2479f2c87ae568f89845afc71d11bc41b04179e58165fd9f31e98", + "sha256:1e1c12f6d2db3d78b909b5f77513c11eb7f2dd2782b96a3ab6dffc7d44575c99", + "sha256:20175a1c0f49863946ec20b7f63255768058ac4f07d2b9ded6a6b46cfb5a9100", + "sha256:29752dbbf8cc53f89f6ac096d363314333045c257c9c75cbd189ca2de0455744", + "sha256:2a4102b03bb7481d9a91a6da8d174740c9c8c4401024684b9ca3b7cc5e49852f", + "sha256:2de3dcea53babc1c3237a19002bc3d228ce1833278f093b8d619e06e7cc79609", + "sha256:34397cdced6b90b836e38182076049fdb41424322e0b0728c946b0939ebdf9f6", + "sha256:4077797a273e56e8843d001e9dfe4ba10e33323d6ade647ff260e5cd97d9758c", + "sha256:419413398fe250aae057fd2fe50166b61077083c9b82754c341cf4fd73038f30", + "sha256:4b6481b228d072315b053210b01ac320e1be243dc17f9e5887ef167f23f5fae4", + "sha256:4dbfcf869f6b0517f70cf0030ba6ea1d6645e132337a7d5204a18d8d5636c02b", + "sha256:4fef51b01e638974a6e69885687e9bd40c8d1e09a6cd291cca0619625cf1f558", + "sha256:52b176444e2e5054dfcbcb8c75b0b719865c96247b37407184bbfca5c353f2c2", + "sha256:56908d7e08318d39f85b1f0c6cfd47b0cac1a130da677630dac0de3e0623e102", + "sha256:5a65aa591af023864fd08a97da9974e919452cfe19cb146c8a5dc692626445dc", + "sha256:688c3312e5dadb573a2c69c82af3a298d43ecf9e6d264e0f95df960b5f6ac19c", + "sha256:6e2b469efd811707bc530fd1effef0f5d6eebcb7fe376affae69025da4b979a2", + "sha256:7488448de6007cd5177c6cea0517ac33b4c0f5ee9b5e9f2be51ce75511a85517", + "sha256:785b08db19c9f214dc37d65f7c165d19a30fcecb48abfa30f31b01b5acaabb58", + "sha256:7b0e817b518bff7facd7f85ea05b643ad8bdcce684cf29784987b0a7c8e1f997", + "sha256:803203d2b6ea644982c644895c2f78b28d0e208bba7b27d9b921e0ec5eb207c6", + "sha256:89dce27e142d25ffbc154c1819383b69f2e9234dc4ed4766f42e0e8cb264ab5c", + "sha256:913485a03f1bcf5d279409a9d2b9ed565c151f61c09f29991e5faa14033da4c8", + "sha256:97d7b9a485b40f8ca425460e89bf1da2814625b2da627c0dcc6aa46c92631d14", + "sha256:9bcb8aa397ff0093c824182fd76a935a9ba7ad097fcbef80ae89bf6c1731d8ec", + "sha256:9d56a78b646f2e3daa865bc70cd5ec5a46c50045801ca8ff17a0c43abc97e3ee", + "sha256:a5da6976f20cae27059ea8d0c86e7cef3de720e04c4bb9ee18e3690fdb792066", + "sha256:a94c5a76ab46c5e6257c7972b6c8cff0574201ca7dc05647e33e795d78680563", + "sha256:a95a9248b0c6fd933a442c03c3b113c3b61320086b88e2c444676d3fd1ca3330", + "sha256:baf593f2765fa3a6b1ef95807dbaa3d25b594f6a52adcc506a6b9cb115e1be67", + "sha256:bb9c2fa06887e21d6a3a868762acb82aec34e2c6fd0174064f27c93ede68ad15", + "sha256:bba9ad231e92a3e424b3e56b65aa17704993425bba97e302c832f9466bb85bac", + "sha256:c3bae4f855d965b5453784300c12ffc63a548304ac7f99e55d4dc7c898673aa3", + "sha256:c566c3a88b6ece59b3d70f65bedef17304f48eb52ff040a6a18214e1917b3254", + "sha256:cdecf62abcc4292500d7858aeae87a1f8f1150f4c4dd08fb0b336ee79b2a6df3", + "sha256:cf5a4db6dca263010e2c7bff081c89383c72d187ba2cf4c44759aac970e2f0c4", + "sha256:d52ad8d78522da1d308789df651ee5379088e77c76cb1994858d40a426b343b9", + "sha256:e061b58443f1736f8a37c48978d7ab581636d6ab03e3d4f99e3fa90463bb9382", + "sha256:e2877a02380adfcdbc69071a0f74d6e9dbbf593c0dc9d174e1f223ffd5281943", + "sha256:e73c07f23009962885c197ccb9b41356a30cc0e5a1d0c2ea8fd8fb1362d7f924", + "sha256:e8222c26daaafd9e8626dec58ae36029f82585890589576f769a650dd20fd665", + "sha256:edfbfca868cdd6bd8d974a60f8a3682f5565d3f5c99b327640cedd24c4264026", + "sha256:f376e37f9bf2a946872fc5fd1199c99310748e3c26c7a26683f13f8bdb756cbd" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==1.19.1" + "markers": "python_version >= '3.10'", + "version": "==1.20.2" }, "mypy-extensions": { "hashes": [ @@ -576,59 +445,60 @@ }, "nh3": { "hashes": [ - "sha256:019ecbd007536b67fdf76fab411b648fb64e2257ca3262ec80c3425c24028c80", - "sha256:03d617e5c8aa7331bd2659c654e021caf9bba704b109e7b2b28b039a00949fe5", - "sha256:0dca4365db62b2d71ff1620ee4f800c4729849906c5dd504ee1a7b2389558e31", - "sha256:0fe7ee035dd7b2290715baf29cb27167dddd2ff70ea7d052c958dbd80d323c99", - "sha256:13398e676a14d6233f372c75f52d5ae74f98210172991f7a3142a736bd92b131", - "sha256:169db03df90da63286e0560ea0efa9b6f3b59844a9735514a1d47e6bb2c8c61b", - "sha256:1710f3901cd6440ca92494ba2eb6dc260f829fa8d9196b659fa10de825610ce0", - "sha256:1f9ba555a797dbdcd844b89523f29cdc90973d8bd2e836ea6b962cf567cadd93", - "sha256:2ab70e8c6c7d2ce953d2a58102eefa90c2d0a5ed7aa40c7e29a487bc5e613131", - "sha256:2c9850041b77a9147d6bbd6dbbf13eeec7009eb60b44e83f07fcb2910075bf9b", - "sha256:403c11563e50b915d0efdb622866d1d9e4506bce590ef7da57789bf71dd148b5", - "sha256:45c953e57028c31d473d6b648552d9cab1efe20a42ad139d78e11d8f42a36130", - "sha256:562da3dca7a17f9077593214a9781a94b8d76de4f158f8c895e62f09573945fe", - "sha256:6d66f41672eb4060cf87c037f760bdbc6847852ca9ef8e9c5a5da18f090abf87", - "sha256:7064ccf5ace75825bd7bf57859daaaf16ed28660c1c6b306b649a9eda4b54b1e", - "sha256:72d67c25a84579f4a432c065e8b4274e53b7cf1df8f792cf846abfe2c3090866", - "sha256:7bb18403f02b655a1bbe4e3a4696c2ae1d6ae8f5991f7cacb684b1ae27e6c9f7", - "sha256:91e9b001101fb4500a2aafe3e7c92928d85242d38bf5ac0aba0b7480da0a4cd6", - "sha256:a40202fd58e49129764f025bbaae77028e420f1d5b3c8e6f6fd3a6490d513868", - "sha256:c8745454cdd28bbbc90861b80a0111a195b0e3961b9fa2e672be89eb199fa5d8", - "sha256:cf5964d54edd405e68583114a7cba929468bcd7db5e676ae38ee954de1cfc104", - "sha256:d18957a90806d943d141cc5e4a0fefa1d77cf0d7a156878bf9a66eed52c9cc7d", - "sha256:dce4248edc427c9b79261f3e6e2b3ecbdd9b88c267012168b4a7b3fc6fd41d13", - "sha256:f2f55c4d2d5a207e74eefe4d828067bbb01300e06e2a7436142f915c5928de07", - "sha256:f394759a06df8b685a4ebfb1874fb67a9cbfd58c64fc5ed587a663c0e63ec376", - "sha256:f97f8b25cb2681d25e2338148159447e4d689aafdccfcf19e61ff7db3905768a" + "sha256:07999b998bf89692738f15c0eac76a416382932f855709e0b7488b595c30ec89", + "sha256:0961a27dc2057c38d0364cb05880e1997ae1c80220cbc847db63213720b8f304", + "sha256:0d825722a1e8cbc87d7ca1e47ffb1d2a6cf343ad4c1b8465becf7cadcabcdfd0", + "sha256:18a2e44ccb29cbb45071b8f3f2dab9ebfb41a6516f328f91f1f1fd18196239a4", + "sha256:3390e4333883673a684ce16c1716b481e91782d6f56dec5c85fed9feedb23382", + "sha256:41e46b3499918ab6128b6421677b316e79869d0c140da24069d220a94f4e72d1", + "sha256:43ad4eedee7e049b9069bc015b7b095d320ed6d167ecec111f877de1540656e9", + "sha256:47d749d99ae005ab19517224140b280dd56e77b33afb82f9b600e106d0458003", + "sha256:4aa8b43e68c26b68069a3b6cef09de166d1d7fa140cf8d77e409a46cbf742e44", + "sha256:554cc2bab281758e94d770c3fb0bf2d8be5fb403ef6b2e8841dd7c1615df7a0f", + "sha256:72e4e9ca1c4bd41b4a28b0190edc2e21e3f71496acd36a0162858e1a28db3d7e", + "sha256:75643c22f5092d8e209f766ee8108c400bc1e44760fc94d2d638eb138d18f853", + "sha256:7cae217f031809321db962cd7e092bda8d4e95a87f78c0226628fa6c2ea8ebc5", + "sha256:80b955d802bf365bd42e09f6c3d64567dce777d20e97968d94b3e9d9e99b265e", + "sha256:87dac8d611b4a478400e0821a13b35770e88c266582f065e7249d6a37b0f86e8", + "sha256:883d5a6d6ee8078c4afc8e96e022fe579c4c265775ff6ee21e39b8c542cabab3", + "sha256:8b61058f34c2105d44d2a4d4241bacf603a1ef5c143b08766bbd0cf23830118f", + "sha256:8d697e19f2995b337f648204848ac3a528eaafffc39e7ce4ac6b7a2fbe6c84af", + "sha256:9337517edb7c10228252cce2898e20fb3d77e32ffaccbb3c66897927d74215a0", + "sha256:96709a379997c1b28c8974146ca660b0dcd3794f4f6d50c1ea549bab39ac6ade", + "sha256:c10b1f0c741e257a5cb2978d6bac86e7c784ab20572724b20c6402c2e24bce75", + "sha256:ca90397c8d36c1535bf1988b2bed006597337843a164c7ec269dc8813f37536b", + "sha256:d866701affe67a5171b916b5c076e767a74c6a9efb7fb2006eb8d3c5f9a293d5", + "sha256:d8bebcb20ab4b91858385cd98fe58046ec4a624275b45ef9b976475604f45b49", + "sha256:dbe76feaa44e2ef9436f345016012a591550e77818876a8de5c8bc2a248e08df", + "sha256:f5f214618ad5eff4f2a6b13a8d4da4d9e7f37c569d90a13fb9f0caaf7d04fe21", + "sha256:f987cb56458323405e8e5ea827e1befcf141ffa0c0ac797d6d02e6b646056d9a" ], "markers": "python_version >= '3.8'", - "version": "==0.3.2" + "version": "==0.3.4" }, "packaging": { "hashes": [ - "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", - "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529" + "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", + "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de" ], "markers": "python_version >= '3.8'", - "version": "==26.0" + "version": "==26.1" }, "pathspec": { "hashes": [ - "sha256:62f8558917908d237d399b9b338ef455a814801a4688bc41074b25feefd93472", - "sha256:fa32b1eb775ed9ba8d599b22c5f906dc098113989da2c00bf8b210078ca7fb92" + "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", + "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723" ], "markers": "python_version >= '3.9'", - "version": "==1.0.2" + "version": "==1.0.4" }, "platformdirs": { "hashes": [ - "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", - "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31" + "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", + "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917" ], "markers": "python_version >= '3.10'", - "version": "==4.5.1" + "version": "==4.9.6" }, "pluggy": { "hashes": [ @@ -648,12 +518,12 @@ }, "pylint": { "hashes": [ - "sha256:63e06a37d5922555ee2c20963eb42559918c20bd2b21244e4ef426e7c43b92e0", - "sha256:d9b71674e19b1c36d79265b5887bf8e55278cbe236c9e95d22dc82cf044fdbd2" + "sha256:00f51c9b14a3b3ae08cff6b2cdd43f28165c78b165b628692e428fb1f8dc2cf2", + "sha256:8cd6a618df75deb013bd7eb98327a95f02a6fb839205a6bbf5456ef96afb317c" ], "index": "pypi", "markers": "python_full_version >= '3.10.0'", - "version": "==4.0.4" + "version": "==4.0.5" }, "pytest": { "hashes": [ @@ -672,6 +542,14 @@ "markers": "python_version >= '3.9'", "version": "==44.0" }, + "requests": { + "hashes": [ + "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", + "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a" + ], + "markers": "python_version >= '3.10'", + "version": "==2.33.1" + }, "requests-toolbelt": { "hashes": [ "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", @@ -690,19 +568,19 @@ }, "rich": { "hashes": [ - "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", - "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd" + "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", + "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36" ], - "markers": "python_full_version >= '3.8.0'", - "version": "==14.2.0" + "markers": "python_full_version >= '3.9.0'", + "version": "==15.0.0" }, "tomlkit": { "hashes": [ - "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", - "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0" + "sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680", + "sha256:cf00efca415dbd57575befb1f6634c4f42d2d87dbba376128adb42c121b87064" ], - "markers": "python_version >= '3.8'", - "version": "==0.13.3" + "markers": "python_version >= '3.9'", + "version": "==0.14.0" }, "twine": { "hashes": [ @@ -726,6 +604,7 @@ "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4" ], + "index": "pypi", "markers": "python_version >= '3.9'", "version": "==2.6.3" } diff --git a/README.md b/README.md index bb2f4cb..eecbb6c 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ For an overview of the Monday API, [click here](https://developer.monday.com/api #### Requirements - Python >= 3.11 +- urllib3 >= 2.6.0 #### Getting started `pip install monday` @@ -54,6 +55,3 @@ monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a - -### Bug Reports -TBD diff --git a/docs/README.rst b/docs/README.rst index ca9c530..a9d74d3 100644 --- a/docs/README.rst +++ b/docs/README.rst @@ -5,18 +5,20 @@ monday -|All Contributors| A monday.com Python Client Library +|All Contributors| -For an overview of the Monday API, `click -here `__. +A monday.com Python Client Library + +For an overview of the Monday API, `click here `__. Requirements -^^^^^^^^^^^^ +============ -- Python >= 3.11 +- Python >= 3.11 +- urllib3 >= 2.6.0 Getting started -^^^^^^^^^^^^^^^ +=============== ``pip install monday`` @@ -30,8 +32,17 @@ Getting started monday.items.create_item(board_id='12345678', group_id='today', item_name='Do a thing') +Custom Timeout +^^^^^^^^^^^^^^ + +To specify a custom timeout (default: 60 seconds), you can pass the ``timeout`` parameter: + +.. code:: python + + monday = MondayClient('your token', timeout=120) + Available methods -^^^^^^^^^^^^^^^^^ +================= Items Resource (monday.items) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -369,11 +380,5 @@ Taylor Cochran💻 -Bug Reports -~~~~~~~~~~~ - -TBD - .. |All Contributors| image:: https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square :target: #contributors- - diff --git a/monday/client.py b/monday/client.py index cc9d17f..951c371 100644 --- a/monday/client.py +++ b/monday/client.py @@ -7,17 +7,26 @@ """ from .__version__ import __version__ -from .resources import CustomResource, ItemResource, ColumnsResource, UpdateResource, TagResource, BoardResource, \ - UserResource, GroupResource, ComplexityResource, WorkspaceResource, NotificationResource, MeResource +from .resources import ( + BoardResource, + ColumnsResource, + ComplexityResource, + CustomResource, + GroupResource, + ItemResource, + MeResource, + NotificationResource, + TagResource, + UpdateResource, + UserResource, + WorkspaceResource, +) + +_DEFAULT_HEADERS = {"API-Version": "2026-01"} -_DEFAULT_HEADERS = { - "API-Version": "2026-01" -} - -DEFAULT_TIMEOUT = 60 class MondayClient: - def __init__(self, token, headers=None, timeout=DEFAULT_TIMEOUT): + def __init__(self, token, headers=None, timeout=None): """ :param token: API token for the new :class:`BaseResource` object. :param headers: (optional) headers for the new :class:`BaseResource` object. @@ -34,13 +43,19 @@ def __init__(self, token, headers=None, timeout=DEFAULT_TIMEOUT): self.boards = BoardResource(token=token, headers=headers, timeout=timeout) self.users = UserResource(token=token, headers=headers, timeout=timeout) self.groups = GroupResource(token=token, headers=headers, timeout=timeout) - self.complexity = ComplexityResource(token=token, headers=headers, timeout=timeout) - self.workspaces = WorkspaceResource(token=token, headers=headers, timeout=timeout) - self.notifications = NotificationResource(token=token, headers=headers, timeout=timeout) + self.complexity = ComplexityResource( + token=token, headers=headers, timeout=timeout + ) + self.workspaces = WorkspaceResource( + token=token, headers=headers, timeout=timeout + ) + self.notifications = NotificationResource( + token=token, headers=headers, timeout=timeout + ) self.me = MeResource(token=token, headers=headers, timeout=timeout) def __str__(self): - return f'MondayClient {__version__}' + return f"MondayClient {__version__}" def __repr__(self): - return f'MondayClient {__version__}' + return f"MondayClient {__version__}" diff --git a/monday/constants.py b/monday/constants.py new file mode 100644 index 0000000..82e1682 --- /dev/null +++ b/monday/constants.py @@ -0,0 +1,5 @@ +TOKEN_HEADER = "Authorization" + +DEFAULT_TIMEOUT = 60 + +DEFAULT_PAGE_LIMIT_ITEMS = 500 diff --git a/monday/graphqlclient/client.py b/monday/graphqlclient/client.py index 6d58197..30bb524 100644 --- a/monday/graphqlclient/client.py +++ b/monday/graphqlclient/client.py @@ -1,13 +1,9 @@ import json -import requests -from monday.exceptions import MondayQueryError - -TOKEN_HEADER = 'Authorization' +import urllib3 -DEFAULT_TIMEOUT = 60 - -DEFAULT_PAGE_LIMIT_ITEMS = 500 +from monday.constants import DEFAULT_TIMEOUT, TOKEN_HEADER +from monday.exceptions import MondayQueryError class GraphQLClient: @@ -16,6 +12,7 @@ def __init__(self, endpoint, timeout=DEFAULT_TIMEOUT): self.timeout = timeout self.token = None self.headers = {} + self._http = urllib3.PoolManager() def execute(self, query, variables=None): return self._send(query, variables) @@ -27,34 +24,46 @@ def inject_headers(self, headers): self.headers = headers def _send(self, query, variables): - payload = {'query': query} headers = self.headers.copy() - files = None if self.token is not None: headers[TOKEN_HEADER] = self.token - if variables is None: - headers.setdefault('Content-Type', 'application/json') - - payload = json.dumps({'query': query}).encode('utf-8') - - elif variables.get('file', None) is not None: - headers.setdefault('content', 'multipart/form-data') - - files = [ - ('variables[file]', (variables['file'], open(variables['file'], 'rb'))) - ] - - try: - response = requests.request("POST", self.endpoint, headers=headers, data=payload, files=files, timeout=self.timeout) - response.raise_for_status() - response_data = response.json() - self._throw_on_error(response_data) - return response_data - except (requests.HTTPError, json.JSONDecodeError, MondayQueryError) as e: - raise e + if variables is not None and variables.get("file") is not None: + file_path = variables["file"] + with open(file_path, "rb") as f: + file_data = f.read() + + response = self._http.request( + "POST", + self.endpoint, + headers=headers, + fields={"query": query, "variables[file]": (file_path, file_data)}, + timeout=self.timeout, + ) + else: + headers.setdefault("Content-Type", "application/json") + body = json.dumps({"query": query}).encode("utf-8") + + response = self._http.request( + "POST", + self.endpoint, + headers=headers, + body=body, + timeout=self.timeout, + ) + + if response.status >= 400: + raise urllib3.exceptions.HTTPError( + f"HTTP {response.status}: {response.data.decode('utf-8')}" + ) + + response_data = json.loads(response.data.decode("utf-8")) + self._throw_on_error(response_data) + return response_data def _throw_on_error(self, response_data): - if 'errors' in response_data: - raise MondayQueryError(response_data['errors'][0]['message'], response_data['errors']) + if "errors" in response_data: + raise MondayQueryError( + response_data["errors"][0]["message"], response_data["errors"] + ) diff --git a/monday/resources/base.py b/monday/resources/base.py index 94e60df..aaa34aa 100644 --- a/monday/resources/base.py +++ b/monday/resources/base.py @@ -7,10 +7,13 @@ class BaseResource: - def __init__(self, token, headers, timeout): + def __init__(self, token, headers, timeout=None): self._token = token - self.client = GraphQLClient(_URLS['prod'], timeout=timeout) - self.file_upload_client = GraphQLClient(_URLS['file'], timeout=timeout) + kwargs = {} + if timeout is not None: + kwargs['timeout'] = timeout + self.client = GraphQLClient(_URLS['prod'], **kwargs) + self.file_upload_client = GraphQLClient(_URLS['file'], **kwargs) self.client.inject_token(token) self.client.inject_headers(headers) self.file_upload_client.inject_token(token) diff --git a/monday/resources/boards.py b/monday/resources/boards.py index 33ff941..de18590 100644 --- a/monday/resources/boards.py +++ b/monday/resources/boards.py @@ -1,35 +1,61 @@ -from typing import List, Optional, Union, Any, Mapping +from typing import Any, List, Mapping, Optional, Union -from monday.query_joins import get_boards_query, get_boards_by_id_query, get_board_items_query, \ - get_next_items_query, get_columns_by_board_query, create_board_by_workspace_query, \ - duplicate_board_query +from monday.constants import DEFAULT_PAGE_LIMIT_ITEMS +from monday.query_joins import ( + create_board_by_workspace_query, + duplicate_board_query, + get_board_items_query, + get_boards_by_id_query, + get_boards_query, + get_columns_by_board_query, + get_next_items_query, +) from monday.resources.base import BaseResource -from monday.resources.types import BoardKind, BoardState, BoardsOrderBy, DuplicateType -from monday.graphqlclient.client import DEFAULT_PAGE_LIMIT_ITEMS +from monday.resources.types import BoardKind, BoardsOrderBy, BoardState, DuplicateType class BoardResource(BaseResource): - def fetch_boards(self, limit: Optional[int] = None, page: Optional[int] = None, ids: Optional[List[int]] = None, - board_kind: Optional[BoardKind] = None, state: Optional[BoardState] = None, - order_by: Optional[BoardsOrderBy] = None, workspace_ids: Optional[List[int]] = None): - query = get_boards_query(limit, page, ids, board_kind, state, order_by, workspace_ids) + def fetch_boards( + self, + limit: Optional[int] = None, + page: Optional[int] = None, + ids: Optional[List[int]] = None, + board_kind: Optional[BoardKind] = None, + state: Optional[BoardState] = None, + order_by: Optional[BoardsOrderBy] = None, + workspace_ids: Optional[List[int]] = None, + ): + query = get_boards_query( + limit, page, ids, board_kind, state, order_by, workspace_ids + ) return self.client.execute(query) def fetch_boards_by_id(self, board_ids: Union[int, str]): query = get_boards_by_id_query(board_ids) return self.client.execute(query) - def fetch_items_by_board_id(self, board_ids: Union[int, str], query_params: Optional[Mapping[str, Any]] = None, - limit: Optional[int] = DEFAULT_PAGE_LIMIT_ITEMS, cursor: Optional[str] = None): - query = get_board_items_query(board_ids, query_params=query_params, limit=limit, cursor=cursor) + def fetch_items_by_board_id( + self, + board_ids: Union[int, str], + query_params: Optional[Mapping[str, Any]] = None, + limit: Optional[int] = DEFAULT_PAGE_LIMIT_ITEMS, + cursor: Optional[str] = None, + ): + query = get_board_items_query( + board_ids, query_params=query_params, limit=limit, cursor=cursor + ) return self.client.execute(query) def fetch_next_items_by_cursor(self, cursor: str, limit: Optional[int] = None): query = get_next_items_query(limit=limit, cursor=cursor) return self.client.execute(query) - def fetch_all_items_by_board_id(self, board_ids: Union[int, str], query_params: Optional[Mapping[str, Any]] = None, - limit: Optional[int] = DEFAULT_PAGE_LIMIT_ITEMS) -> List[dict]: + def fetch_all_items_by_board_id( + self, + board_ids: Union[int, str], + query_params: Optional[Mapping[str, Any]] = None, + limit: Optional[int] = DEFAULT_PAGE_LIMIT_ITEMS, + ) -> List[dict]: items: List[dict] = [] cursor: Optional[str] = None @@ -38,8 +64,9 @@ def fetch_all_items_by_board_id(self, board_ids: Union[int, str], query_params: response = self.fetch_next_items_by_cursor(cursor=cursor, limit=limit) items_page = response["data"]["next_items_page"] else: - response = self.fetch_items_by_board_id(board_ids, query_params=query_params, - limit=limit, cursor=cursor) + response = self.fetch_items_by_board_id( + board_ids, query_params=query_params, limit=limit, cursor=cursor + ) items_page = response["data"]["boards"][0]["items_page"] items.extend(items_page.get("items", [])) @@ -54,12 +81,27 @@ def fetch_columns_by_board_id(self, board_ids: Union[int, str]): query = get_columns_by_board_query(board_ids) return self.client.execute(query) - def create_board(self, board_name: str, board_kind: BoardKind, workspace_id: Optional[int] = None): + def create_board( + self, board_name: str, board_kind: BoardKind, workspace_id: Optional[int] = None + ): query = create_board_by_workspace_query(board_name, board_kind, workspace_id) return self.client.execute(query) - def duplicate_board(self, board_id: int, duplicate_type: DuplicateType, board_name: Optional[str] = None, - folder_id: Optional[int] = None, keep_subscribers: Optional[bool] = None, - workspace_id: Optional[int] = None): - query = duplicate_board_query(board_id, duplicate_type, board_name, folder_id, keep_subscribers, workspace_id) + def duplicate_board( + self, + board_id: int, + duplicate_type: DuplicateType, + board_name: Optional[str] = None, + folder_id: Optional[int] = None, + keep_subscribers: Optional[bool] = None, + workspace_id: Optional[int] = None, + ): + query = duplicate_board_query( + board_id, + duplicate_type, + board_name, + folder_id, + keep_subscribers, + workspace_id, + ) return self.client.execute(query) diff --git a/monday/tests/test_graphql_client.py b/monday/tests/test_graphql_client.py index af61e2c..37b595e 100644 --- a/monday/tests/test_graphql_client.py +++ b/monday/tests/test_graphql_client.py @@ -1,11 +1,16 @@ import unittest +from unittest.mock import patch, MagicMock +import json +import urllib3 + from monday.graphqlclient.client import GraphQLClient +from monday.exceptions import MondayQueryError class GraphQlClientTestCase(unittest.TestCase): def setUp(self): self.token = "foo" - self.url = "https://api.monday.com/v2'" + self.url = "https://api.monday.com/v2" self.client = GraphQLClient(self.url) def test_client_endpoint(self): @@ -15,3 +20,39 @@ def test_inject_token(self): client = self.client client.inject_token(token=self.token) self.assertEqual(client.token, self.token) + + def test_client_has_pool_manager(self): + self.assertIsInstance(self.client._http, urllib3.PoolManager) + + @patch.object(urllib3.PoolManager, 'request') + def test_execute_sends_post(self, mock_request): + mock_response = MagicMock() + mock_response.status = 200 + mock_response.data = json.dumps({'data': {'boards': []}}).encode('utf-8') + mock_request.return_value = mock_response + + self.client.inject_token(self.token) + result = self.client.execute('{ boards { id } }') + + mock_request.assert_called_once() + self.assertEqual(result, {'data': {'boards': []}}) + + @patch.object(urllib3.PoolManager, 'request') + def test_execute_raises_on_http_error(self, mock_request): + mock_response = MagicMock() + mock_response.status = 500 + mock_response.data = b'Internal Server Error' + mock_request.return_value = mock_response + + with self.assertRaises(urllib3.exceptions.HTTPError): + self.client.execute('{ boards { id } }') + + @patch.object(urllib3.PoolManager, 'request') + def test_execute_raises_on_query_error(self, mock_request): + mock_response = MagicMock() + mock_response.status = 200 + mock_response.data = json.dumps({'errors': [{'message': 'bad query'}]}).encode('utf-8') + mock_request.return_value = mock_response + + with self.assertRaises(MondayQueryError): + self.client.execute('{ bad }') diff --git a/setup.py b/setup.py index f165349..18dfbaf 100644 --- a/setup.py +++ b/setup.py @@ -23,7 +23,7 @@ zip_safe=False, license="BSD", install_requires=[ - "requests>=2.30.0", + "urllib3>=2.6.0", ], python_requires=">=3.11", classifiers=[