diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 0aa7f86..810f188 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -34,7 +34,7 @@ jobs: - name: Run tests 🧪 env: - PARCL_LABS_API_KEY: ${{ secrets.PARCL_LABS_API_KEY }} + PARCL_LABS_API_KEY: ${{ secrets.PARCL_LABS_API_KEY }} run: | set -e pipenv run make test diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ffe69c..810b2f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ -### v1.6.0 +### v1.6.2 +- Fix bug where `limit` parameter was not being applied when `turbo_mode` was enabled. +- Update handingling of `limit` parameter. If the `limit` parameter is greater than maximum allowed limit on the particular endpoint, the `limit` will automatically default to the maximum allowed value instead of throwing an error. +- Refactor `ParclLabsClient` so that `limit` is not set during client instantiation. Limit should be set when calling specific `retrieve` methods. + +### v1.6.1 - Bug fix for handling of 422 validation errors. ### v1.6.0 diff --git a/Pipfile.lock b/Pipfile.lock index c8c0667..4cff232 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "945a87a0653976f09609ce6372af59f4c93daabe292c250d379e5283cff7e405" + "sha256": "4c5b4750b7167d79a6c480337368126c3c0068044d750c268bbcceb876118733" }, "pipfile-spec": 6, "requires": { @@ -157,11 +157,11 @@ }, "certifi": { "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.7.4" + "version": "==2024.8.30" }, "charset-normalizer": { "hashes": [ @@ -484,62 +484,63 @@ }, "numpy": { "hashes": [ - "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b", - "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911", - "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977", - "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84", - "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b", - "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33", - "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b", - "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d", - "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111", - "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673", - "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06", - "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36", - "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f", - "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd", - "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e", - "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62", - "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb", - "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300", - "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b", - "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb", - "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8", - "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195", - "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2", - "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce", - "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6", - "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2", - "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33", - "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b", - "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667", - "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1", - "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a", - "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e", - "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745", - "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc", - "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324", - "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0", - "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8", - "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02", - "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574", - "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd", - "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1", - "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5", - "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d", - "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883", - "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575", - "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529", - "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa", - "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3", - "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211", - "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1", - "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736", - "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.1.0" + "version": "==2.1.1" }, "packaging": { "hashes": [ @@ -587,12 +588,12 @@ }, "plotly": { "hashes": [ - "sha256:76cbe78f75eddc10c56f5a4ee3e7ccaade7c0a57465546f02098c0caed6c2d1a", - "sha256:89e57d003a116303a34de6700862391367dd564222ab71f8531df70279fc0193" + "sha256:0e54efe52c8cef899f7daa41be9ed97dfb6be622613a2a8f56a86a0634b2b67e", + "sha256:eae9f4f54448682442c92c1e97148e3ad0c52f0cf86306e1b76daba24add554a" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.23.0" + "version": "==5.24.0" }, "python-dateutil": { "hashes": [ @@ -652,99 +653,101 @@ }, "yarl": { "hashes": [ - "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51", - "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce", - "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559", - "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0", - "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81", - "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc", - "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4", - "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c", - "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130", - "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136", - "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e", - "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec", - "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7", - "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1", - "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", - "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099", - "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129", - "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10", - "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142", - "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98", - "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa", - "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7", - "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525", - "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c", - "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9", - "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", - "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8", - "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", - "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", - "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23", - "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd", - "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27", - "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f", - "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece", - "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434", - "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec", - "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff", - "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78", - "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d", - "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", - "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", - "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31", - "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15", - "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5", - "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b", - "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57", - "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3", - "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1", - "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f", - "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", - "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c", - "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7", - "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2", - "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b", - "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", - "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b", - "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9", - "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be", - "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", - "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984", - "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4", - "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074", - "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2", - "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", - "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91", - "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", - "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf", - "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572", - "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", - "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575", - "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14", - "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5", - "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1", - "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e", - "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", - "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17", - "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead", - "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0", - "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe", - "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", - "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0", - "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7", - "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34", - "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42", - "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", - "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78", - "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be", - "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958", - "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749", - "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec" + "sha256:03e917cc44a01e1be60a83ee1a17550b929490aaa5df2a109adc02137bddf06b", + "sha256:050f3e4d886be55728fef268587d061c5ce6f79a82baba71840801b63441c301", + "sha256:0a1b8fd849567be56342e988e72c9d28bd3c77b9296c38b9b42d2fe4813c9d3f", + "sha256:0d8cf3d0b67996edc11957aece3fbce4c224d0451c7c3d6154ec3a35d0e55f6b", + "sha256:0fdb156a06208fc9645ae7cc0fca45c40dd40d7a8c4db626e542525489ca81a9", + "sha256:10452727843bc847596b75e30a7fe92d91829f60747301d1bd60363366776b0b", + "sha256:1787dcfdbe730207acb454548a6e19f80ae75e6d2d1f531c5a777bc1ab6f7952", + "sha256:1cd450e10cb53d63962757c3f6f7870be49a3e448c46621d6bd46f8088d532de", + "sha256:1d5594512541e63188fea640b7f066c218d2176203d6e6f82abf702ae3dca3b2", + "sha256:1fc728857df4087da6544fc68f62d7017fa68d74201d5b878e18ed4822c31fb3", + "sha256:23404842228e6fa8ace235024519df37f3f8e173620407644d40ddca571ff0f4", + "sha256:25508739e9b44d251172145f54c084b71747b09e4d237dc2abb045f46c36a66e", + "sha256:29c80890e0a64fb0e5f71350d48da330995073881f8b8e623154aef631febfb0", + "sha256:2d71a5d818d82586ac46265ae01466e0bda0638760f18b21f1174e0dd58a9d2f", + "sha256:2ead2f87a1174963cc406d18ac93d731fbb190633d3995fa052d10cefae69ed8", + "sha256:316c82b499b6df41444db5dea26ee23ece9356e38cea43a8b2af9e6d8a3558e4", + "sha256:34736fcc9d6d7080ebbeb0998ecb91e4f14ad8f18648cf0b3099e2420a225d86", + "sha256:36b16884336c15adf79a4bf1d592e0c1ffdb036a760e36a1361565b66785ec6c", + "sha256:395ab0d8ce6d104a988da429bcbfd445e03fb4c911148dfd523f69d13f772e47", + "sha256:3a7748cd66fef49c877e59503e0cc76179caf1158d1080228e67e1db14554f08", + "sha256:3dba2ebac677184d56374fa3e452b461f5d6a03aa132745e648ae8859361eb6b", + "sha256:3f53df493ec80b76969d6e1ae6e4411a55ab1360e02b80c84bd4b33d61a567ba", + "sha256:4052dbd0c900bece330e3071c636f99dff06e4628461a29b38c6e222a427cf98", + "sha256:48ce93947554c2c85fe97fc4866646ec90840bc1162e4db349b37d692a811755", + "sha256:48f7a158f3ca67509d21cb02a96964e4798b6f133691cc0c86cf36e26e26ec8f", + "sha256:49827dfccbd59c4499605c13805e947349295466e490860a855b7c7e82ec9c75", + "sha256:49935cc51d272264358962d050d726c3e5603a616f53e52ea88e9df1728aa2ee", + "sha256:4a6fa3aeca8efabb0fbbb3b15e0956b0cb77f7d9db67c107503c30af07cd9e00", + "sha256:4db97210433366dfba55590e48285b89ad0146c52bf248dd0da492dd9f0f72cf", + "sha256:522fa3d300d898402ae4e0fa7c2c21311248ca43827dc362a667de87fdb4f1be", + "sha256:58e3f01673873b8573da3abe138debc63e4e68541b2104a55df4c10c129513a4", + "sha256:596069ddeaf72b5eb36cd714dcd2b5751d0090d05a8d65113b582ed9e1c801fb", + "sha256:5d585c7d834c13f24c7e3e0efaf1a4b7678866940802e11bd6c4d1f99c935e6b", + "sha256:5e338b6febbae6c9fe86924bac3ea9c1944e33255c249543cd82a4af6df6047b", + "sha256:60c04415b31a1611ef5989a6084dd6f6b95652c6a18378b58985667b65b2ecb6", + "sha256:60f3b5aec3146b6992640592856414870f5b20eb688c1f1d5f7ac010a7f86561", + "sha256:62440431741d0b7d410e5cbad800885e3289048140a43390ecab4f0b96dde3bb", + "sha256:628619008680a11d07243391271b46f07f13b75deb9fe92ef342305058c70722", + "sha256:62e110772330d7116f91e79cd83fef92545cb2f36414c95881477aa01971f75f", + "sha256:653597b615809f2e5f4dba6cd805608b6fd3597128361a22cc612cf7c7a4d1bf", + "sha256:65e3098969baf221bb45e3b2f60735fc2b154fc95902131ebc604bae4c629ea6", + "sha256:6639444d161c693cdabb073baaed1945c717d3982ecedf23a219bc55a242e728", + "sha256:71bb1435a84688ed831220c5305d96161beb65cac4a966374475348aa3de4575", + "sha256:71d33fd1c219b5b28ee98cd76da0c9398a4ed4792fd75c94135237db05ba5ca8", + "sha256:74d3ef5e81f81507cea04bf5ae22f18ef538607a7c754aac2b6e3029956a2842", + "sha256:78250f635f221dde97d02c57aade3313310469bc291888dfe32acd1012594441", + "sha256:78805148e780a9ca66f3123e04741e344b66cf06b4fb13223e3a209f39a6da55", + "sha256:7ab906a956d2109c6ea11e24c66592b06336e2743509290117f0f7f47d2c1dd3", + "sha256:7fc441408ed0d9c6d2d627a02e281c21f5de43eb5209c16636a17fc704f7d0f8", + "sha256:808eddabcb6f7b2cdb6929b3e021ac824a2c07dc7bc83f7618e18438b1b65781", + "sha256:8525f955a2dcc281573b6aadeb8ab9c37e2d3428b64ca6a2feec2a794a69c1da", + "sha256:867b13c1b361f9ba5d2f84dc5408082f5d744c83f66de45edc2b96793a9c5e48", + "sha256:87aa5308482f248f8c3bd9311cd6c7dfd98ea1a8e57e35fb11e4adcac3066003", + "sha256:8af0bbd4d84f8abdd9b11be9488e32c76b1501889b73c9e2292a15fb925b378b", + "sha256:8e8916b1ff7680b1f2b1608c82dc15c569b9f2cb2da100c747c291f1acf18a14", + "sha256:91567ff4fce73d2e7ac67ed5983ad26ba2343bc28cb22e1e1184a9677df98d7c", + "sha256:9163d21aa40ff8528db2aee2b0b6752efe098055b41ab8e5422b2098457199fe", + "sha256:9c2743e43183e4afbb07d5605693299b8756baff0b086c25236c761feb0e3c56", + "sha256:9d319ac113ca47352319cbea92d1925a37cb7bd61a8c2f3e3cd2e96eb33cccae", + "sha256:a48d2b9f0ae29a456fb766ae461691378ecc6cf159dd9f938507d925607591c3", + "sha256:a564155cc2194ecd9c0d8f8dc57059b822a507de5f08120063675eb9540576aa", + "sha256:a95167ae34667c5cc7d9206c024f793e8ffbadfb307d5c059de470345de58a21", + "sha256:a9552367dc440870556da47bb289a806f08ad06fbc4054072d193d9e5dd619ba", + "sha256:a99cecfb51c84d00132db909e83ae388793ca86e48df7ae57f1be0beab0dcce5", + "sha256:b1557456afce5db3d655b5f8a31cdcaae1f47e57958760525c44b76e812b4987", + "sha256:bc23d870864971c8455cfba17498ccefa53a5719ea9f5fce5e7e9c1606b5755f", + "sha256:bc9233638b07c2e4a3a14bef70f53983389bffa9e8cb90a2da3f67ac9c5e1842", + "sha256:c81c28221a85add23a0922a6aeb2cdda7f9723e03e2dfae06fee5c57fe684262", + "sha256:ca5e86be84492fa403c4dcd4dcaf8e1b1c4ffc747b5176f7c3d09878c45719b0", + "sha256:cb870907e8b86b2f32541403da9455afc1e535ce483e579bea0e6e79a0cc751c", + "sha256:cddebd096effe4be90fd378e4224cd575ac99e1c521598a6900e94959006e02e", + "sha256:cf37dd0008e5ac5c3880198976063c491b6a15b288d150d12833248cf2003acb", + "sha256:cf85599c9336b89b92c313519bcaa223d92fa5d98feb4935a47cce2e8722b4b8", + "sha256:d06d6a8f98dd87646d98f0c468be14b201e47ec6092ad569adf835810ad0dffb", + "sha256:d0aabe557446aa615693a82b4d3803c102fd0e7a6a503bf93d744d182a510184", + "sha256:d35f9cdab0ec5e20cf6d2bd46456cf599052cf49a1698ef06b9592238d1cf1b1", + "sha256:d8ad761493d5aaa7ab2a09736e62b8a220cb0b10ff8ccf6968c861cd8718b915", + "sha256:daa69a3a2204355af39f4cfe7f3870d87c53d77a597b5100b97e3faa9460428b", + "sha256:dd08da4f2d171e19bd02083c921f1bef89f8f5f87000d0ffc49aa257bc5a9802", + "sha256:df47612129e66f7ce7c9994d4cd4e6852f6e3bf97699375d86991481796eeec8", + "sha256:e649d37d04665dddb90994bbf0034331b6c14144cc6f3fbce400dc5f28dc05b7", + "sha256:e7f9cabfb8b980791b97a3ae3eab2e38b2ba5eab1af9b7495bdc44e1ce7c89e3", + "sha256:e8362c941e07fbcde851597672a5e41b21dc292b7d5a1dc439b7a93c9a1af5d9", + "sha256:eefda67ba0ba44ab781e34843c266a76f718772b348f7c5d798d8ea55b95517f", + "sha256:f28e602edeeec01fc96daf7728e8052bc2e12a672e2a138561a1ebaf30fd9df7", + "sha256:f3aaf9fa960d55bd7876d55d7ea3cc046f3660df1ff73fc1b8c520a741ed1f21", + "sha256:f5ddad20363f9f1bbedc95789c897da62f939e6bc855793c3060ef8b9f9407bf", + "sha256:f6b8bbdd425d0978311520ea99fb6c0e9e04e64aee84fac05f3157ace9f81b05", + "sha256:f87d8645a7a806ec8f66aac5e3b1dcb5014849ff53ffe2a1f0b86ca813f534c7", + "sha256:f9d715b2175dff9a49c6dafdc2ab3f04850ba2f3d4a77f69a5a1786b057a9d45", + "sha256:fcd3d94b848cba132f39a5b40d80b0847d001a91a6f35a2204505cdd46afe1b2", + "sha256:ff03f1c1ac474c66d474929ae7e4dd195592c1c7cc8c36418528ed81b1ca0a79" ], - "markers": "python_version >= '3.7'", - "version": "==1.9.4" + "markers": "python_version >= '3.8'", + "version": "==1.9.7" } }, "develop": { @@ -951,11 +954,11 @@ }, "certifi": { "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.7.4" + "version": "==2024.8.30" }, "charset-normalizer": { "hashes": [ @@ -1117,11 +1120,11 @@ }, "executing": { "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" + "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", + "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab" ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" }, "fastjsonschema": { "hashes": [ @@ -1246,11 +1249,11 @@ }, "ipython": { "hashes": [ - "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c", - "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff" + "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e", + "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c" ], "markers": "python_version >= '3.10'", - "version": "==8.26.0" + "version": "==8.27.0" }, "jedi": { "hashes": [ @@ -1436,62 +1439,63 @@ }, "numpy": { "hashes": [ - "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b", - "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911", - "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977", - "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84", - "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b", - "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33", - "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b", - "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d", - "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111", - "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673", - "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06", - "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36", - "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f", - "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd", - "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e", - "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62", - "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb", - "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300", - "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b", - "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb", - "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8", - "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195", - "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2", - "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce", - "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6", - "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2", - "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33", - "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b", - "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667", - "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1", - "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a", - "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e", - "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745", - "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc", - "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324", - "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0", - "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8", - "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02", - "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574", - "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd", - "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1", - "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5", - "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d", - "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883", - "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575", - "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529", - "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa", - "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3", - "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211", - "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1", - "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736", - "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==2.1.0" + "version": "==2.1.1" }, "packaging": { "hashes": [ @@ -1575,12 +1579,12 @@ }, "plotly": { "hashes": [ - "sha256:76cbe78f75eddc10c56f5a4ee3e7ccaade7c0a57465546f02098c0caed6c2d1a", - "sha256:89e57d003a116303a34de6700862391367dd564222ab71f8531df70279fc0193" + "sha256:0e54efe52c8cef899f7daa41be9ed97dfb6be622613a2a8f56a86a0634b2b67e", + "sha256:eae9f4f54448682442c92c1e97148e3ad0c52f0cf86306e1b76daba24add554a" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.23.0" + "version": "==5.24.0" }, "pluggy": { "hashes": [ @@ -1983,14 +1987,6 @@ "markers": "python_version >= '3.8'", "version": "==5.14.3" }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version < '3.12'", - "version": "==4.12.2" - }, "tzdata": { "hashes": [ "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", @@ -2016,99 +2012,101 @@ }, "yarl": { "hashes": [ - "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51", - "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce", - "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559", - "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0", - "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81", - "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc", - "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4", - "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c", - "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130", - "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136", - "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e", - "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec", - "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7", - "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1", - "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", - "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099", - "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129", - "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10", - "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142", - "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98", - "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa", - "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7", - "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525", - "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c", - "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9", - "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", - "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8", - "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", - "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", - "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23", - "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd", - "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27", - "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f", - "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece", - "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434", - "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec", - "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff", - "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78", - "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d", - "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", - "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", - "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31", - "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15", - "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5", - "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b", - "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57", - "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3", - "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1", - "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f", - "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", - "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c", - "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7", - "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2", - "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b", - "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", - "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b", - "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9", - "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be", - "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", - "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984", - "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4", - "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074", - "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2", - "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", - "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91", - "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", - "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf", - "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572", - "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", - "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575", - "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14", - "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5", - "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1", - "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e", - "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", - "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17", - "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead", - "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0", - "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe", - "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", - "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0", - "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7", - "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34", - "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42", - "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", - "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78", - "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be", - "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958", - "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749", - "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec" + "sha256:03e917cc44a01e1be60a83ee1a17550b929490aaa5df2a109adc02137bddf06b", + "sha256:050f3e4d886be55728fef268587d061c5ce6f79a82baba71840801b63441c301", + "sha256:0a1b8fd849567be56342e988e72c9d28bd3c77b9296c38b9b42d2fe4813c9d3f", + "sha256:0d8cf3d0b67996edc11957aece3fbce4c224d0451c7c3d6154ec3a35d0e55f6b", + "sha256:0fdb156a06208fc9645ae7cc0fca45c40dd40d7a8c4db626e542525489ca81a9", + "sha256:10452727843bc847596b75e30a7fe92d91829f60747301d1bd60363366776b0b", + "sha256:1787dcfdbe730207acb454548a6e19f80ae75e6d2d1f531c5a777bc1ab6f7952", + "sha256:1cd450e10cb53d63962757c3f6f7870be49a3e448c46621d6bd46f8088d532de", + "sha256:1d5594512541e63188fea640b7f066c218d2176203d6e6f82abf702ae3dca3b2", + "sha256:1fc728857df4087da6544fc68f62d7017fa68d74201d5b878e18ed4822c31fb3", + "sha256:23404842228e6fa8ace235024519df37f3f8e173620407644d40ddca571ff0f4", + "sha256:25508739e9b44d251172145f54c084b71747b09e4d237dc2abb045f46c36a66e", + "sha256:29c80890e0a64fb0e5f71350d48da330995073881f8b8e623154aef631febfb0", + "sha256:2d71a5d818d82586ac46265ae01466e0bda0638760f18b21f1174e0dd58a9d2f", + "sha256:2ead2f87a1174963cc406d18ac93d731fbb190633d3995fa052d10cefae69ed8", + "sha256:316c82b499b6df41444db5dea26ee23ece9356e38cea43a8b2af9e6d8a3558e4", + "sha256:34736fcc9d6d7080ebbeb0998ecb91e4f14ad8f18648cf0b3099e2420a225d86", + "sha256:36b16884336c15adf79a4bf1d592e0c1ffdb036a760e36a1361565b66785ec6c", + "sha256:395ab0d8ce6d104a988da429bcbfd445e03fb4c911148dfd523f69d13f772e47", + "sha256:3a7748cd66fef49c877e59503e0cc76179caf1158d1080228e67e1db14554f08", + "sha256:3dba2ebac677184d56374fa3e452b461f5d6a03aa132745e648ae8859361eb6b", + "sha256:3f53df493ec80b76969d6e1ae6e4411a55ab1360e02b80c84bd4b33d61a567ba", + "sha256:4052dbd0c900bece330e3071c636f99dff06e4628461a29b38c6e222a427cf98", + "sha256:48ce93947554c2c85fe97fc4866646ec90840bc1162e4db349b37d692a811755", + "sha256:48f7a158f3ca67509d21cb02a96964e4798b6f133691cc0c86cf36e26e26ec8f", + "sha256:49827dfccbd59c4499605c13805e947349295466e490860a855b7c7e82ec9c75", + "sha256:49935cc51d272264358962d050d726c3e5603a616f53e52ea88e9df1728aa2ee", + "sha256:4a6fa3aeca8efabb0fbbb3b15e0956b0cb77f7d9db67c107503c30af07cd9e00", + "sha256:4db97210433366dfba55590e48285b89ad0146c52bf248dd0da492dd9f0f72cf", + "sha256:522fa3d300d898402ae4e0fa7c2c21311248ca43827dc362a667de87fdb4f1be", + "sha256:58e3f01673873b8573da3abe138debc63e4e68541b2104a55df4c10c129513a4", + "sha256:596069ddeaf72b5eb36cd714dcd2b5751d0090d05a8d65113b582ed9e1c801fb", + "sha256:5d585c7d834c13f24c7e3e0efaf1a4b7678866940802e11bd6c4d1f99c935e6b", + "sha256:5e338b6febbae6c9fe86924bac3ea9c1944e33255c249543cd82a4af6df6047b", + "sha256:60c04415b31a1611ef5989a6084dd6f6b95652c6a18378b58985667b65b2ecb6", + "sha256:60f3b5aec3146b6992640592856414870f5b20eb688c1f1d5f7ac010a7f86561", + "sha256:62440431741d0b7d410e5cbad800885e3289048140a43390ecab4f0b96dde3bb", + "sha256:628619008680a11d07243391271b46f07f13b75deb9fe92ef342305058c70722", + "sha256:62e110772330d7116f91e79cd83fef92545cb2f36414c95881477aa01971f75f", + "sha256:653597b615809f2e5f4dba6cd805608b6fd3597128361a22cc612cf7c7a4d1bf", + "sha256:65e3098969baf221bb45e3b2f60735fc2b154fc95902131ebc604bae4c629ea6", + "sha256:6639444d161c693cdabb073baaed1945c717d3982ecedf23a219bc55a242e728", + "sha256:71bb1435a84688ed831220c5305d96161beb65cac4a966374475348aa3de4575", + "sha256:71d33fd1c219b5b28ee98cd76da0c9398a4ed4792fd75c94135237db05ba5ca8", + "sha256:74d3ef5e81f81507cea04bf5ae22f18ef538607a7c754aac2b6e3029956a2842", + "sha256:78250f635f221dde97d02c57aade3313310469bc291888dfe32acd1012594441", + "sha256:78805148e780a9ca66f3123e04741e344b66cf06b4fb13223e3a209f39a6da55", + "sha256:7ab906a956d2109c6ea11e24c66592b06336e2743509290117f0f7f47d2c1dd3", + "sha256:7fc441408ed0d9c6d2d627a02e281c21f5de43eb5209c16636a17fc704f7d0f8", + "sha256:808eddabcb6f7b2cdb6929b3e021ac824a2c07dc7bc83f7618e18438b1b65781", + "sha256:8525f955a2dcc281573b6aadeb8ab9c37e2d3428b64ca6a2feec2a794a69c1da", + "sha256:867b13c1b361f9ba5d2f84dc5408082f5d744c83f66de45edc2b96793a9c5e48", + "sha256:87aa5308482f248f8c3bd9311cd6c7dfd98ea1a8e57e35fb11e4adcac3066003", + "sha256:8af0bbd4d84f8abdd9b11be9488e32c76b1501889b73c9e2292a15fb925b378b", + "sha256:8e8916b1ff7680b1f2b1608c82dc15c569b9f2cb2da100c747c291f1acf18a14", + "sha256:91567ff4fce73d2e7ac67ed5983ad26ba2343bc28cb22e1e1184a9677df98d7c", + "sha256:9163d21aa40ff8528db2aee2b0b6752efe098055b41ab8e5422b2098457199fe", + "sha256:9c2743e43183e4afbb07d5605693299b8756baff0b086c25236c761feb0e3c56", + "sha256:9d319ac113ca47352319cbea92d1925a37cb7bd61a8c2f3e3cd2e96eb33cccae", + "sha256:a48d2b9f0ae29a456fb766ae461691378ecc6cf159dd9f938507d925607591c3", + "sha256:a564155cc2194ecd9c0d8f8dc57059b822a507de5f08120063675eb9540576aa", + "sha256:a95167ae34667c5cc7d9206c024f793e8ffbadfb307d5c059de470345de58a21", + "sha256:a9552367dc440870556da47bb289a806f08ad06fbc4054072d193d9e5dd619ba", + "sha256:a99cecfb51c84d00132db909e83ae388793ca86e48df7ae57f1be0beab0dcce5", + "sha256:b1557456afce5db3d655b5f8a31cdcaae1f47e57958760525c44b76e812b4987", + "sha256:bc23d870864971c8455cfba17498ccefa53a5719ea9f5fce5e7e9c1606b5755f", + "sha256:bc9233638b07c2e4a3a14bef70f53983389bffa9e8cb90a2da3f67ac9c5e1842", + "sha256:c81c28221a85add23a0922a6aeb2cdda7f9723e03e2dfae06fee5c57fe684262", + "sha256:ca5e86be84492fa403c4dcd4dcaf8e1b1c4ffc747b5176f7c3d09878c45719b0", + "sha256:cb870907e8b86b2f32541403da9455afc1e535ce483e579bea0e6e79a0cc751c", + "sha256:cddebd096effe4be90fd378e4224cd575ac99e1c521598a6900e94959006e02e", + "sha256:cf37dd0008e5ac5c3880198976063c491b6a15b288d150d12833248cf2003acb", + "sha256:cf85599c9336b89b92c313519bcaa223d92fa5d98feb4935a47cce2e8722b4b8", + "sha256:d06d6a8f98dd87646d98f0c468be14b201e47ec6092ad569adf835810ad0dffb", + "sha256:d0aabe557446aa615693a82b4d3803c102fd0e7a6a503bf93d744d182a510184", + "sha256:d35f9cdab0ec5e20cf6d2bd46456cf599052cf49a1698ef06b9592238d1cf1b1", + "sha256:d8ad761493d5aaa7ab2a09736e62b8a220cb0b10ff8ccf6968c861cd8718b915", + "sha256:daa69a3a2204355af39f4cfe7f3870d87c53d77a597b5100b97e3faa9460428b", + "sha256:dd08da4f2d171e19bd02083c921f1bef89f8f5f87000d0ffc49aa257bc5a9802", + "sha256:df47612129e66f7ce7c9994d4cd4e6852f6e3bf97699375d86991481796eeec8", + "sha256:e649d37d04665dddb90994bbf0034331b6c14144cc6f3fbce400dc5f28dc05b7", + "sha256:e7f9cabfb8b980791b97a3ae3eab2e38b2ba5eab1af9b7495bdc44e1ce7c89e3", + "sha256:e8362c941e07fbcde851597672a5e41b21dc292b7d5a1dc439b7a93c9a1af5d9", + "sha256:eefda67ba0ba44ab781e34843c266a76f718772b348f7c5d798d8ea55b95517f", + "sha256:f28e602edeeec01fc96daf7728e8052bc2e12a672e2a138561a1ebaf30fd9df7", + "sha256:f3aaf9fa960d55bd7876d55d7ea3cc046f3660df1ff73fc1b8c520a741ed1f21", + "sha256:f5ddad20363f9f1bbedc95789c897da62f939e6bc855793c3060ef8b9f9407bf", + "sha256:f6b8bbdd425d0978311520ea99fb6c0e9e04e64aee84fac05f3157ace9f81b05", + "sha256:f87d8645a7a806ec8f66aac5e3b1dcb5014849ff53ffe2a1f0b86ca813f534c7", + "sha256:f9d715b2175dff9a49c6dafdc2ab3f04850ba2f3d4a77f69a5a1786b057a9d45", + "sha256:fcd3d94b848cba132f39a5b40d80b0847d001a91a6f35a2204505cdd46afe1b2", + "sha256:ff03f1c1ac474c66d474929ae7e4dd195592c1c7cc8c36418528ed81b1ca0a79" ], - "markers": "python_version >= '3.7'", - "version": "==1.9.4" + "markers": "python_version >= '3.8'", + "version": "==1.9.7" } } } diff --git a/parcllabs/__version__.py b/parcllabs/__version__.py index ac30235..c8a19b1 100644 --- a/parcllabs/__version__.py +++ b/parcllabs/__version__.py @@ -1 +1 @@ -VERSION = "1.6.1" +VERSION = "1.6.2" diff --git a/parcllabs/common.py b/parcllabs/common.py index 9255266..1d3a28c 100644 --- a/parcllabs/common.py +++ b/parcllabs/common.py @@ -24,6 +24,8 @@ DEFAULT_LIMIT = 12 MAX_POST_LIMIT = 1000 +DEFAULT_LIMIT_SMALL = 1000 +DEFAULT_LIMIT_LARGE = 10000 VALID_LOCATION_TYPES = [ "COUNTY", diff --git a/parcllabs/parcllabs_client.py b/parcllabs/parcllabs_client.py index 2c89f9b..5d0f376 100644 --- a/parcllabs/parcllabs_client.py +++ b/parcllabs/parcllabs_client.py @@ -9,9 +9,8 @@ class ServiceGroup: - def __init__(self, client, limit): + def __init__(self, client): self._client = client - self._limit = limit self._services = {} def add_service( @@ -23,7 +22,7 @@ def add_service( alias: Optional[str] = None, ): service = service_class( - url=url, post_url=post_url, client=self._client, limit=self._limit + url=url, post_url=post_url, client=self._client ) setattr(self, name, service) self._services[name] = service @@ -40,8 +39,8 @@ class ParclLabsClient: def __init__( self, api_key: str, - limit: int = 12, api_url: str = api_base, + limit: Optional[int] = None, turbo_mode: bool = False, num_workers: Optional[int] = None, ): @@ -52,7 +51,6 @@ def __init__( self.api_key = api_key self.api_url = api_url - self.limit = limit self.estimated_session_credit_usage = 0 self.num_workers = num_workers self.turbo_mode = turbo_mode @@ -71,7 +69,7 @@ def _initialize_services(self): self.property = self._create_property_services() def _create_service_group(self): - return ServiceGroup(self, self.limit) + return ServiceGroup(self) def _add_services_to_group( self, group: ServiceGroup, services: Dict[str, Dict[str, Any]] @@ -258,7 +256,6 @@ def _create_search_services(self): services = { "markets": { "url": "/v1/search/markets", - "post_url": "/v1/search/markets", "service_class": SearchMarkets, }, } diff --git a/parcllabs/services/data_utils.py b/parcllabs/services/data_utils.py index cc6536c..f8728a1 100644 --- a/parcllabs/services/data_utils.py +++ b/parcllabs/services/data_utils.py @@ -1,10 +1,7 @@ import pandas as pd import numpy as np -from parcllabs.common import ( - ID_COLUMNS, - DATE_COLUMNS -) +from parcllabs.common import ID_COLUMNS, DATE_COLUMNS def safe_concat_and_format_dtypes(data_container): diff --git a/parcllabs/services/metrics/portfolio_size_service.py b/parcllabs/services/metrics/portfolio_size_service.py index b825576..bc03f05 100644 --- a/parcllabs/services/metrics/portfolio_size_service.py +++ b/parcllabs/services/metrics/portfolio_size_service.py @@ -5,7 +5,6 @@ class PortfolioSizeService(ParclLabsService): - def retrieve( self, parcl_ids: List[int], diff --git a/parcllabs/services/metrics/property_type_service.py b/parcllabs/services/metrics/property_type_service.py index 260c79a..361e897 100644 --- a/parcllabs/services/metrics/property_type_service.py +++ b/parcllabs/services/metrics/property_type_service.py @@ -1,11 +1,10 @@ from typing import Any, Mapping, Optional -from parcllabs.common import DEFAULT_LIMIT + from parcllabs.services.parcllabs_service import ParclLabsService from parcllabs.services.validators import Validators class PropertyTypeService(ParclLabsService): - def retrieve( self, parcl_ids: int, diff --git a/parcllabs/services/parcllabs_service.py b/parcllabs/services/parcllabs_service.py index 75c1934..4c6b786 100644 --- a/parcllabs/services/parcllabs_service.py +++ b/parcllabs/services/parcllabs_service.py @@ -4,10 +4,9 @@ import platform from collections import deque -from concurrent.futures import ThreadPoolExecutor, as_completed from requests.exceptions import RequestException from typing import Any, Mapping, Optional, List, Dict -from parcllabs.common import DELETE_FROM_OUTPUT, DEFAULT_LIMIT +from parcllabs.common import DELETE_FROM_OUTPUT, DEFAULT_LIMIT_SMALL, DEFAULT_LIMIT_LARGE from parcllabs.exceptions import NotFoundError from parcllabs.services.validators import Validators from parcllabs.services.data_utils import safe_concat_and_format_dtypes @@ -20,14 +19,13 @@ class ParclLabsService: """ def __init__( - self, url: str, client: Any, post_url: str = None, limit: int = DEFAULT_LIMIT + self, url: str, client: Any, post_url: str = None ) -> None: self.url = url self.post_url = post_url self.client = client if client is None: raise ValueError("Missing required client object.") - self.limit = limit self.api_url = client.api_url self.full_url = self.api_url + self.url self.full_post_url = self.api_url + self.post_url if post_url else None @@ -104,19 +102,23 @@ def _make_request(self, method: str, url: str, **kwargs) -> requests.Response: raise RequestException(f"An unexpected error occurred: {str(e)}") def _post( - self, url: str, data: Optional[Dict[str, Any]] = None + self, + url: str, + params: Optional[Dict[str, Any]] = None, + data: Optional[Dict[str, Any]] = None, ) -> requests.Response: """ Send a POST request to the specified URL with the given data. Args: url (str): The URL endpoint to request. + params (dict, optional): The parameters to send in the query string. data (dict, optional): The data to send in the request body. Returns: requests.Response: The response object. """ - return self._make_request("POST", url, json=data) + return self._make_request("POST", url, params=params, json=data) def _get( self, url: str, params: Optional[Dict[str, Any]] = None @@ -156,17 +158,25 @@ def _fetch( The result of the fetch operation. The exact return type depends on the specific fetch method called (_fetch_post, _fetch_get, or _fetch_get_many_parcl_ids). """ - if params and not params.get("limit"): - params["limit"] = self.limit params = self._clean_params(params) if self.client.turbo_mode and self.full_post_url: # convert the list of parcl_ids into post body params, formatted # as strings - params = {"parcl_id": [str(pid) for pid in parcl_ids], **params} - return self._fetch_post(params, auto_paginate) + if params.get("limit"): + params["limit"] = self._validate_limit("POST", params["limit"]) + + data = {"parcl_id": [str(pid) for pid in parcl_ids], **params} + params = {"limit": params["limit"]} if params.get("limit") else {} + + print(f"data: {data}, params: {params}") + + return self._fetch_post(params, data, auto_paginate) else: + if params.get("limit"): + params["limit"] = self._validate_limit("GET", params["limit"]) + if len(parcl_ids) == 1: url = self.full_url.format(parcl_id=parcl_ids[0]) return self._fetch_get(url, params, auto_paginate) @@ -205,10 +215,16 @@ def _fetch_get_many_parcl_ids( return results - def _fetch_post(self, params: Dict[str, Any], auto_paginate: bool): - response = self._post(self.full_post_url, data=params) + def _fetch_post( + self, params: Dict[str, Any], data: Dict[str, Any], auto_paginate: bool + ): + response = self._post(self.full_post_url, params=params, data=data) return self._process_and_paginate_response( - response, auto_paginate, original_params=params, referring_method="post" + response, + auto_paginate, + original_params=params, + data=data, + referring_method="post", ) def _fetch_get(self, url: str, params: Dict[str, Any], auto_paginate: bool): @@ -219,7 +235,12 @@ def _fetch_get(self, url: str, params: Dict[str, Any], auto_paginate: bool): return result def _process_and_paginate_response( - self, response, auto_paginate, original_params, referring_method: str = "get" + self, + response, + auto_paginate, + original_params, + data=None, + referring_method: str = "get", ): if response.status_code == 404: @@ -236,7 +257,7 @@ def _process_and_paginate_response( while result["links"].get("next") is not None: next_url = result["links"]["next"] if referring_method == "post": - next_response = self._post(next_url, data=original_params) + next_response = self._post(next_url, data=data, params=original_params) else: next_response = self._get(next_url, params=original_params) next_response.raise_for_status() @@ -264,7 +285,7 @@ def retrieve( { "start_date": start_date, "end_date": end_date, - "limit": limit if limit is not None else self.limit, + "limit": limit if limit else None, **(params or {}), } ) @@ -327,34 +348,21 @@ def error_handling(self, response: requests.Response) -> None: msg = f"{response.status_code} {type_of_error} Error: {error_message}" raise requests.RequestException(msg) + @staticmethod + def _validate_limit(method, limit): + if method.upper() == "POST": + if limit > DEFAULT_LIMIT_LARGE: + print( + f"Supplied limit value is too large for requested endpoint. Setting limit to maxium value of {DEFAULT_LIMIT_LARGE}." + ) + limit = DEFAULT_LIMIT_LARGE + elif method.upper() == "GET": + if limit > DEFAULT_LIMIT_SMALL: + print( + f"Supplied limit value is too large for requested endpoint. Setting limit to maxium value of {DEFAULT_LIMIT_SMALL}." + ) + limit = DEFAULT_LIMIT_SMALL + else: + raise ValueError("Invalid method. Must be either 'GET' or 'POST'.") -class ParclLabsStreamingService(ParclLabsService): - - def _convert_text_to_json(self, chunk): - try: - return json.loads(chunk) - except json.JSONDecodeError as e: - print(f"Error decoding JSON: {e}") - return None - - def _process_streaming_data(self, data, batch_size=10000, num_workers=None): - with ThreadPoolExecutor(max_workers=num_workers) as executor: - chunks = deque(data.strip().split("\n")) - futures = [ - executor.submit(self._convert_text_to_json, chunk) - for chunk in chunks - if chunk - ] - - buffer = deque() - for future in as_completed(futures): - result = future.result() - if result: - buffer.append(result) - - if len(buffer) >= batch_size: - yield pd.DataFrame(buffer) - buffer.clear() - - if buffer: - yield pd.DataFrame(buffer) + return limit diff --git a/parcllabs/services/properties/property_events_service.py b/parcllabs/services/properties/property_events_service.py index 60dd20c..2559821 100644 --- a/parcllabs/services/properties/property_events_service.py +++ b/parcllabs/services/properties/property_events_service.py @@ -12,7 +12,9 @@ safe_concat_and_format_dtypes, ) from parcllabs.services.validators import Validators -from parcllabs.services.parcllabs_service import ParclLabsStreamingService +from parcllabs.services.streaming.parcl_labs_streaming_service import ( + ParclLabsStreamingService, +) from concurrent.futures import ThreadPoolExecutor, as_completed from parcllabs.exceptions import ( NotFoundError, @@ -24,8 +26,8 @@ class PropertyEventsService(ParclLabsStreamingService): Retrieve parcl_property_id event history. """ - def __init__(self, limit: int = DEFAULT_LIMIT, *args, **kwargs): - super().__init__(limit=limit, *args, **kwargs) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) def retrieve( self, diff --git a/parcllabs/services/properties/property_search.py b/parcllabs/services/properties/property_search.py index ece271e..d76f49c 100644 --- a/parcllabs/services/properties/property_search.py +++ b/parcllabs/services/properties/property_search.py @@ -4,7 +4,9 @@ from typing import List from parcllabs.services.validators import Validators from parcllabs.common import VALID_PROPERTY_TYPES_UNIT_SEARCH, VALID_ENTITY_NAMES -from parcllabs.services.parcllabs_service import ParclLabsStreamingService +from parcllabs.services.streaming.parcl_labs_streaming_service import ( + ParclLabsStreamingService, +) class PropertySearch(ParclLabsStreamingService): diff --git a/parcllabs/services/search.py b/parcllabs/services/search.py index fd6ecab..1602bcf 100644 --- a/parcllabs/services/search.py +++ b/parcllabs/services/search.py @@ -1,7 +1,6 @@ import pandas as pd from typing import Any, Mapping, Optional, List from parcllabs.common import ( - DEFAULT_LIMIT, VALID_LOCATION_TYPES, VALID_US_REGIONS, VALID_US_STATE_ABBREV, @@ -18,8 +17,8 @@ class SearchMarkets(ParclLabsService): Retrieve parcl_id and metadata for geographic markets in the Parcl Labs API. """ - def __init__(self, limit: int = DEFAULT_LIMIT, *args, **kwargs): - super().__init__(limit=limit, *args, **kwargs) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) def _as_pd_dataframe(self, data: List[Mapping[str, Any]]) -> Any: return pd.DataFrame(data) @@ -115,7 +114,8 @@ def retrieve( if geoid: params["geoid"] = geoid - params["limit"] = limit if limit is not None else self.limit + if limit: + params["limit"] = self._validate_limit("GET", limit) results = self._fetch_get( url=self.full_url, params=params, auto_paginate=auto_paginate diff --git a/parcllabs/services/streaming/parcl_labs_streaming_service.py b/parcllabs/services/streaming/parcl_labs_streaming_service.py new file mode 100644 index 0000000..9e7cb3f --- /dev/null +++ b/parcllabs/services/streaming/parcl_labs_streaming_service.py @@ -0,0 +1,38 @@ +from parcllabs.services.parcllabs_service import ParclLabsService + +import json +from collections import deque +from concurrent.futures import ThreadPoolExecutor, as_completed + +import pandas as pd + + +class ParclLabsStreamingService(ParclLabsService): + def _convert_text_to_json(self, chunk): + try: + return json.loads(chunk) + except json.JSONDecodeError as e: + print(f"Error decoding JSON: {e}") + return None + + def _process_streaming_data(self, data, batch_size=10000, num_workers=None): + with ThreadPoolExecutor(max_workers=num_workers) as executor: + chunks = deque(data.strip().split("\n")) + futures = [ + executor.submit(self._convert_text_to_json, chunk) + for chunk in chunks + if chunk + ] + + buffer = deque() + for future in as_completed(futures): + result = future.result() + if result: + buffer.append(result) + + if len(buffer) >= batch_size: + yield pd.DataFrame(buffer) + buffer.clear() + + if buffer: + yield pd.DataFrame(buffer) diff --git a/parcllabs/services/validators.py b/parcllabs/services/validators.py index 355ec4b..3f7664f 100644 --- a/parcllabs/services/validators.py +++ b/parcllabs/services/validators.py @@ -79,7 +79,7 @@ def validate_input_bool_param(param, param_name: str, params_dict: dict = None): params_dict[param_name] = "true" if param else "false" return params_dict - + @staticmethod def validate_parcl_ids(parcl_ids): if isinstance(parcl_ids, int): diff --git a/tests/integration/test_api.py b/tests/integration/test_api.py index f3d2591..8999c87 100644 --- a/tests/integration/test_api.py +++ b/tests/integration/test_api.py @@ -5,37 +5,41 @@ from pathlib import Path from parcllabs import ParclLabsClient + def get_test_data_path(filename): """Return the path to a test data file.""" - return Path(__file__).parent.parent / 'data' / filename + return Path(__file__).parent.parent / "data" / filename + # Load test data -with open(get_test_data_path('test_pids.json'), 'r') as f: +with open(get_test_data_path("test_pids.json"), "r") as f: TEST_PIDS = json.load(f) -with open(get_test_data_path('pricefeed_markets.json'), 'r') as f: +with open(get_test_data_path("pricefeed_markets.json"), "r") as f: PRICEFEED_MARKETS = json.load(f) -API_KEY = os.getenv('PARCL_LABS_API_KEY') +API_KEY = os.getenv("PARCL_LABS_API_KEY") + @pytest.fixture def client(): return ParclLabsClient(api_key=API_KEY) + @pytest.fixture def turbo_client(): return ParclLabsClient(api_key=API_KEY, turbo_mode=True) + def test_singular_get_request_with_limit(client): singular_pid = [5821868] test_limit = 12 results = client.market_metrics.housing_event_prices.retrieve( - parcl_ids=singular_pid, - limit=test_limit, - auto_paginate=False + parcl_ids=singular_pid, limit=test_limit, auto_paginate=False ) assert results.shape[0] == test_limit - assert results['parcl_id'].unique() == singular_pid[0] + assert results["parcl_id"].unique() == singular_pid[0] + def test_property_filter(client): singular_pid = [5821868] @@ -44,14 +48,15 @@ def test_property_filter(client): parcl_ids=singular_pid, limit=test_limit, auto_paginate=False, - property_type='single_family' + property_type="single_family", ) - assert results['property_type'].unique() == 'SINGLE_FAMILY' + assert results["property_type"].unique() == "SINGLE_FAMILY" + def test_singular_get_request_with_pagination(client): test_pid = [5826765] # US parcl id, longest hist - start_date = '2010-01-01' - end_date = '2023-12-31' + start_date = "2010-01-01" + end_date = "2023-12-31" days = (pd.to_datetime(end_date) - pd.to_datetime(start_date)).days + 1 results = client.price_feed.price_feed.retrieve( @@ -59,16 +64,17 @@ def test_singular_get_request_with_pagination(client): limit=1000, start_date=start_date, end_date=end_date, - auto_paginate=True + auto_paginate=True, ) assert results.shape[0] == days - assert results['date'].min().date() == pd.to_datetime(start_date).date() - assert results['date'].max().date() == pd.to_datetime(end_date).date() + assert results["date"].min().date() == pd.to_datetime(start_date).date() + assert results["date"].max().date() == pd.to_datetime(end_date).date() + def test_multiple_get_requests(client): - start_date = '2010-01-01' - end_date = '2023-12-31' + start_date = "2010-01-01" + end_date = "2023-12-31" limit = 1000 test_pricefeed_markets = PRICEFEED_MARKETS[0:3] @@ -76,14 +82,15 @@ def test_multiple_get_requests(client): parcl_ids=test_pricefeed_markets, limit=limit, start_date=start_date, - end_date=end_date + end_date=end_date, ) assert results.shape[0] == len(test_pricefeed_markets) * limit + def test_multiple_get_requests_with_bad_parcl_id(client): - start_date = '2010-01-01' - end_date = '2023-12-31' + start_date = "2010-01-01" + end_date = "2023-12-31" limit = 1000 test_pricefeed_markets = PRICEFEED_MARKETS[0:3] + [123] @@ -91,14 +98,15 @@ def test_multiple_get_requests_with_bad_parcl_id(client): parcl_ids=test_pricefeed_markets, limit=limit, start_date=start_date, - end_date=end_date + end_date=end_date, ) assert results.shape[0] == (len(test_pricefeed_markets) - 1) * limit + def test_multiple_get_requests_with_bad_parcl_id_and_auto_pagination(client): - start_date = '2010-01-01' - end_date = '2023-12-31' + start_date = "2010-01-01" + end_date = "2023-12-31" days = (pd.to_datetime(end_date) - pd.to_datetime(start_date)).days + 1 test_pricefeed_markets = PRICEFEED_MARKETS[0:3] + [123] @@ -107,41 +115,44 @@ def test_multiple_get_requests_with_bad_parcl_id_and_auto_pagination(client): limit=1000, start_date=start_date, end_date=end_date, - auto_paginate=True + auto_paginate=True, ) assert results.shape[0] == (len(test_pricefeed_markets) - 1) * days + def test_singular_post_request(turbo_client): results = turbo_client.rental_market_metrics.gross_yield.retrieve( parcl_ids=[TEST_PIDS[100]], - start_date='2023-01-01', - end_date='2023-12-31', - limit=52 + start_date="2023-01-01", + end_date="2023-12-31", + limit=52, ) - assert results['parcl_id'].unique() == TEST_PIDS[100] + assert results["parcl_id"].unique() == TEST_PIDS[100] assert results.shape[0] == 12 # 12 months in a year + def test_multiple_post_requests(turbo_client): results = turbo_client.rental_market_metrics.gross_yield.retrieve( parcl_ids=TEST_PIDS, - start_date='2023-01-01', - end_date='2023-12-31', - auto_paginate=True + start_date="2023-01-01", + end_date="2023-12-31", + auto_paginate=True, ) assert results.shape[0] == len(TEST_PIDS) * 12 - assert results.groupby('parcl_id').size().unique() == 12 + assert results.groupby("parcl_id").size().unique() == 12 + def test_multiple_post_requests_with_bad_parcl_ids(turbo_client): bad_pids = list(range(1, 1001)) results = turbo_client.rental_market_metrics.gross_yield.retrieve( parcl_ids=TEST_PIDS + bad_pids, - start_date='2023-01-01', - end_date='2023-12-31', - auto_paginate=True + start_date="2023-01-01", + end_date="2023-12-31", + auto_paginate=True, ) assert results.shape[0] == len(TEST_PIDS) * 12 - assert results.groupby('parcl_id').size().unique() == 12 \ No newline at end of file + assert results.groupby("parcl_id").size().unique() == 12 diff --git a/tests/test_parcl_labs_service.py b/tests/test_parcl_labs_service.py index 7a182fd..c6d2ba6 100644 --- a/tests/test_parcl_labs_service.py +++ b/tests/test_parcl_labs_service.py @@ -14,7 +14,7 @@ class MockClient: def parcl_labs_service(): client = MockClient() return ParclLabsService( - url="https://api.example.com/{parcl_id}", client=client, limit=10 + url="https://api.example.com/{parcl_id}", client=client ) diff --git a/tests/test_price_feed_service.py b/tests/test_price_feed_service.py index 7cde339..a83ae58 100644 --- a/tests/test_price_feed_service.py +++ b/tests/test_price_feed_service.py @@ -1,3 +1,6 @@ +from parcllabs.services.streaming.parcl_labs_streaming_service import ( + ParclLabsStreamingService, +) import pytest import pandas as pd import requests @@ -5,14 +8,12 @@ from unittest.mock import Mock, patch from parcllabs.services.parcllabs_service import ( ParclLabsService, - ParclLabsStreamingService, ) from parcllabs.exceptions import NotFoundError from requests.exceptions import RequestException class TestParclLabsService: - @pytest.fixture def service(self): mock_client = Mock() @@ -86,9 +87,9 @@ def test_make_request_http_error(self, mock_request, service): def test_post(self, service): with patch.object(service, "_make_request") as mock_make_request: - service._post("https://api.example.com/test", {"data": "test"}) + service._post("https://api.example.com/test", params={}, data={"data": "test"}) mock_make_request.assert_called_once_with( - "POST", "https://api.example.com/test", json={"data": "test"} + "POST", "https://api.example.com/test", params={}, json={"data": "test"} ) def test_get(self, service): @@ -115,7 +116,7 @@ def test_fetch_get_many_parcl_ids(self, service): service._fetch_get_many_parcl_ids([1, 2], {"param": "test"}, False) assert mock_fetch_get.call_count == 2 - @patch('parcllabs.services.parcllabs_service.ParclLabsService._post') + @patch("parcllabs.services.parcllabs_service.ParclLabsService._post") def test_process_and_paginate_response_post(self, mock_post, service): mock_response = Mock() mock_response.json.return_value = { @@ -130,12 +131,12 @@ def test_process_and_paginate_response_post(self, mock_post, service): mock_post.return_value = mock_next_response - result = service._process_and_paginate_response(mock_response, True, {}, "post") + result = service._process_and_paginate_response(mock_response, True, {}, {}, "post") assert result["items"] == [1, 2, 3, 4] assert service.client.estimated_session_credit_usage == 4 - mock_post.assert_called_once_with("https://api.example.com/next", data={}) + mock_post.assert_called_once_with("https://api.example.com/next", data={}, params={}) - @patch('parcllabs.services.parcllabs_service.ParclLabsService._get') + @patch("parcllabs.services.parcllabs_service.ParclLabsService._get") def test_process_and_paginate_response_get(self, mock_get, service): mock_response = Mock() mock_response.json.return_value = { @@ -195,7 +196,7 @@ def test_error_handling_422(self, service): response = Mock() response.status_code = 422 response.json.return_value = { - "detail": [{'msg': 'Invalid input'}], + "detail": [{"msg": "Invalid input"}], } with pytest.raises(RequestException, match="422 Client Error"): service.error_handling(response) @@ -209,7 +210,6 @@ def test_error_handling_429(self, service): class TestParclLabsStreamingService: - @pytest.fixture def streaming_service(self): mock_client = Mock()