From 8d1db24d5d5c39b2f560789e8034ce5140e962f8 Mon Sep 17 00:00:00 2001 From: Graham Hukill Date: Tue, 9 Dec 2025 10:47:42 -0500 Subject: [PATCH 1/5] Join embeddings queries on record metadata Why these changes are being introduced: Two nice-to-have functionalities were missing from the first pass of embeddings reading: 1. filter by record metadata columns now in embeddings schema 2. retrieve record metadata columns in embeddings read methods There was a deliberate choice to keep embeddings read methods simple in the first pass. This builds on that work. How this addresses that need: For TIMDEXEmbeddings.read_batches_iter(), the base read method for all embeddings read methods, perform a join to record metadata via the composite key (timdex_record_id, run_id, run_record_offset). Given that record metadata is very fast and memory safe, this join is too. By performing this join, we can expose record metadata columns that intentionally don't exist in the embeddings schema -- e.g. 'source' or 'run_timestamp' -- for filtering and selecting. Side effects of this change: * Read methods for TIMDEXEmbeddings can filter and return columns only found in records metadata tables/views. Relevant ticket(s): * https://mitlibraries.atlassian.net/browse/USE-143 --- Pipfile.lock | 603 +++++++++++++++---------------- tests/conftest.py | 118 +++++- tests/test_embeddings.py | 233 +++++++++++- tests/utils.py | 41 ++- timdex_dataset_api/embeddings.py | 97 ++++- 5 files changed, 752 insertions(+), 340 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index d982869..864a3a0 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "467c9e3ec6f2d8648123c1f636a7fc60608564040818ff632f4028e122b30f7f" + "sha256": "8ceaf69ba4b1d7e2e7ae78466ae19a5df32ad41ae00ae35f50fa61ee2ddf0437" }, "pipfile-spec": 6, "requires": { @@ -22,73 +22,66 @@ "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==25.4.0" }, "boto3": { "hashes": [ - "sha256:c5cb2ada690c14e2dfa1e1c59ef7ef399c5e381f5514f1541d28310e35192300", - "sha256:eda49046c0f6a21ac159f9b2d609e5cc70d1dd019b7ac9618eec99285282b3db" + "sha256:0f4089e230d55f981d67376e48cefd41c3d58c7f694480f13288e6ff7b1fefbc", + "sha256:65f0d98a3786ec729ba9b5f70448895b2d1d1f27949aa7af5cb4f39da341bbc4" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==1.42.7" + "version": "==1.42.4" }, "botocore": { "hashes": [ - "sha256:92128d56654342f026d5c20a92bf0e8b546be1eb38df2c0efc7433e8bbc39045", - "sha256:cc401b4836eae2a781efa1d1df88b2e92f9245885a6ae1bf9a6b26bc97b3efd2" + "sha256:c3b091fd33809f187824b6434e518b889514ded5164cb379358367c18e8b0d7d", + "sha256:d4816023492b987a804f693c2d76fb751fdc8755d49933106d69e2489c4c0f98" ], "markers": "python_version >= '3.9'", - "version": "==1.42.7" + "version": "==1.42.4" }, "duckdb": { "hashes": [ - "sha256:006aca6a6d6736c441b02ff5c7600b099bb8b7f4de094b8b062137efddce42df", - "sha256:130c6760f6c573f9c9fe9aba56adba0fab48811a4871b7b8fd667318b4a3e8da", - "sha256:16952ac05bd7e7b39946695452bf450db1ebbe387e1e7178e10f593f2ea7b9a8", - "sha256:1b35491db98ccd11d151165497c084a9d29d3dc42fc80abea2715a6c861ca43d", - "sha256:1b9b445970fd18274d5ac07a0b24c032e228f967332fb5ebab3d7db27738c0e4", - "sha256:1bb8bd5a3dd205983726185b280a211eacc9f5bc0c4d4505bec8c87ac33a8ccb", - "sha256:1e5457dda91b67258aae30fb1a0df84183a9f6cd27abac1d5536c0d876c6dfa1", - "sha256:20c88effaa557a11267706b01419c542fe42f893dee66e5a6daa5974ea2d4a46", - "sha256:23a3a077821bed1768a84ac9cbf6b6487ead33e28e62cb118bda5fb8f9e53dea", - "sha256:23b12854032c1a58d0452e2b212afa908d4ce64171862f3792ba9a596ba7c765", - "sha256:274d4a31aba63115f23e7e7b401e3e3a937f3626dc9dea820a9c7d3073f450d2", - "sha256:2b195270ff1a661f22cbd547a215baff265b7d4469a76a215c8992b5994107c3", - "sha256:2b30245375ea94ab528c87c61fc3ab3e36331180b16af92ee3a37b810a745d24", - "sha256:316711a9e852bcfe1ed6241a5f654983f67e909e290495f3562cccdf43be8180", - "sha256:366bf607088053dce845c9d24c202c04d78022436cc5d8e4c9f0492de04afbe7", - "sha256:4f868a7e6d9b37274a1aa34849ea92aa964e9bd59a5237d6c17e8540533a1e4f", - "sha256:4fef6a053a1c485292000bf0c338bba60f89d334f6a06fc76ba4085a5a322b76", - "sha256:5634e40e1e2d972e4f75bced1fbdd9e9e90faa26445c1052b27de97ee546944a", - "sha256:6302452e57aef29aae3977063810ed7b2927967b97912947b9cca45c1c21955f", - "sha256:6db124f53a3edcb32b0a896ad3519e37477f7e67bf4811cb41ab60c1ef74e4c8", - "sha256:702dabbc22b27dc5b73e7599c60deef3d8c59968527c36b391773efddd8f4cf1", - "sha256:813f189039b46877b5517f1909c7b94a8fe01b4bde2640ab217537ea0fe9b59b", - "sha256:854b79375fa618f6ffa8d84fb45cbc9db887f6c4834076ea10d20bc106f1fd90", - "sha256:8afba22c370f06b7314aa46bfed052509269e482bcfb3f7b1ea0fa17ae49ce42", - "sha256:8d080e8d1bf2d226423ec781f539c8f6b6ef3fd42a9a58a7160de0a00877a21f", - "sha256:8d53b217698a76c4957e2c807dd9295d409146f9d3d7932f372883201ba9d25a", - "sha256:90f241f25cffe7241bf9f376754a5845c74775e00e1c5731119dc88cd71e0cb2", - "sha256:9dc049ba7e906cb49ca2b6d4fbf7b6615ec3883193e8abb93f0bef2652e42dda", - "sha256:9e625b2b4d52bafa1fd0ebdb0990c3961dac8bb00e30d327185de95b68202131", - "sha256:a2813f4635f4d6681cc3304020374c46aca82758c6740d7edbc237fe3aae2744", - "sha256:a7c864df027da1ee95f0c32def67e15d02cd4a906c9c1cbae82c09c5112f526b", - "sha256:a8b0a8764e1b5dd043d168c8f749314f7a1252b5a260fa415adaa26fa3b958fd", - "sha256:aa26a7406205bc1426cee28bdfdf084f669a5686977dafa4c3ec65873989593c", - "sha256:caa2164c91f7e91befb1ffb081b3cd97a137117533aef7abe1538b03ad72e3a9", - "sha256:d0ff08388ef8b1d1a4c95c321d6c5fa11201b241036b1ee740f9d841df3d6ba2", - "sha256:de984cd24a6cbefdd6d4a349f7b9a46e583ca3e58ce10d8def0b20a6e5fcbe78", - "sha256:deab351ac43b6282a3270e3d40e3d57b3b50f472d9fd8c30975d88a31be41231", - "sha256:ef7ef15347ce97201b1b5182a5697682679b04c3374d5a01ac10ba31cf791b95", - "sha256:efa7f1191c59e34b688fcd4e588c1b903a4e4e1f4804945902cf0b20e08a9001", - "sha256:fbc63ffdd03835f660155b37a1b6db2005bcd46e5ad398b8cac141eb305d2a3d", - "sha256:fea43e03604c713e25a25211ada87d30cd2a044d8f27afab5deba26ac49e5268" + "sha256:0c2315b693f201787c9892f31eb9a0484d3c648edb3578a86dc8c1284dd2873a", + "sha256:125cd89dbfd40846f216032b11e5eeaf2be13ee4d6745b82413ddd213ddc4d99", + "sha256:128c97dab574a438d7c8d020670b21c68792267d88e65a7773667b556541fa9b", + "sha256:19d2c2f3cdf0242cad42e803602bbc2636706fc1d2d260ffac815ea2e3a018e8", + "sha256:20c45b4ead1ea4d23a1be1cd4f1dfc635e58b55f0dd11e38781369be6c549903", + "sha256:2d3c39429b3ce1ee33d86daa94bed75a1f5b0fcf4d66d0839a6fcee398894548", + "sha256:2e552451054534970dc999e69ca5ae5c606458548c43fb66d772117760485096", + "sha256:2f7c61617d2b1da3da5d7e215be616ad45aa3221c4b9e2c4d1c28ed09bc3c1c4", + "sha256:389fa9abe4ca37d091332a2f8c3ebd713f18e87dc4cb5e8efd3e5aa8ddf8885f", + "sha256:422be8c6bdc98366c97f464b204b81b892bf962abeae6b0184104b8233da4f19", + "sha256:43ac632f40ab1aede9b4ce3c09ea043f26f3db97b83c07c632c84ebd7f7c0f4a", + "sha256:449fa37cdefa85bf925681e551157f3cb6434ee85c8329d2f72d52e432e8810f", + "sha256:459b1855bd06a226a2838da4f14c8863fd87a62e63d414a7f7f682a7c616511a", + "sha256:4d757dae8c63eeb001517ce4cfba768f87f90628c5d22f230773c1fe0b430c5c", + "sha256:4da7aafa94800f475d287814ad91993cf1f912c16f76ff4b411769da40c4b7da", + "sha256:769440f4507c20542ae2e5b87f6c6c6d3f148c0aa8f912528f6c97e9aedf6a21", + "sha256:77db030b48321bf785767b7b1800bf657dd2584f6df0a77e05201ecd22017da2", + "sha256:7a496a04458590dcec8e928122ebe2ecbb42c3e1de4119f5461f7bf547acbe79", + "sha256:7be8c0c40f2264b91500b89c688f743e1c7764966e988f680b1f19416b00052e", + "sha256:85f0c36c1b5f378d96dd7d8c6d312317f4f547a567e8b76cacb2590a31d931f3", + "sha256:9106c7292cff824e9497233bb16867ab3bca82885a11f1b533e7ecabf8073b34", + "sha256:9356fe17af2711e0a5ace4b20a0373e03163545fd7516e0c3c40428f44597052", + "sha256:946a8374c0252db3fa41165ab9952b48adc8de06561a6b5fd62025ac700e492f", + "sha256:995ec9c1fc3ce5fbfe5950b980ede2a9d51b35fdf2e3f873ce94c22fc3355fdc", + "sha256:a456adbc3459c9dcd99052fad20bd5f8ef642be5b04d09590376b2eb3eb84f5c", + "sha256:b2d882672b61bc6117a2c524cf64ea519d2e829295951d214f04e126f1549b09", + "sha256:bdd2d808806ceeeec33ba89665a0bb707af8815f2ca40e6c4c581966c0628ba1", + "sha256:c45e0e682ee9073c36dc34d7ad8033210bfea0cab80cc98d1eca516227b35fdf", + "sha256:c5feb658ed728cfc42d6fe5ff4e2035faf438a3f10c875f3cfa39ef9e2a2c004", + "sha256:c6a21732dd52a76f1e61484c06d65800b18f57fe29e8102a7466c201a2221604", + "sha256:c6d41fea4f9038663e6b9c325075a843fd105eaff0ec3d5fe31dfa9014114c3e", + "sha256:d4af73198e56ba3bc1b2a05eaaf93d162615c225c031685f2a20ef6b2798ed33", + "sha256:de646227fc2c53101ac84e86e444e7561aa077387aca8b37052f3803ee690a17", + "sha256:df81acee3b15ecb2c72eb8f8579fb5922f6f56c71f5c8892ea3bc6fab39aa2c4", + "sha256:dfcc56a83420c0dec0b83e97a6b33addac1b7554b8828894f9d203955591218c", + "sha256:e1c80934cb15879844a752776a1ea3d1405635f307f5bb8b87c99f5a5564d33a", + "sha256:f1fac31babda2045d4cdefe6d0fd2ebdd8d4c2a333fbcc11607cfeaec202d18d" ], "index": "pypi", - "markers": "python_full_version >= '3.9.0'", - "version": "==1.4.3" + "version": "==1.4.2" }, "duckdb-engine": { "hashes": [ @@ -96,7 +89,6 @@ "sha256:3aa72085e536b43faab635f487baf77ddc5750069c16a2f8d9c6c3cb6083e979" ], "index": "pypi", - "markers": "python_version >= '3.9' and python_version < '4'", "version": "==0.17.0" }, "jmespath": { @@ -184,7 +176,7 @@ "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520" ], - "markers": "python_version >= '3.11'", + "markers": "python_version >= '3.12'", "version": "==2.3.5" }, "packaging": { @@ -254,7 +246,6 @@ "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==2.3.3" }, "pyarrow": { @@ -311,7 +302,6 @@ "sha256:f963ba8c3b0199f9d6b794c90ec77545e05eadc83973897a4523c9e8d84e9340" ], "index": "pypi", - "markers": "python_version >= '3.10'", "version": "==22.0.0" }, "python-dateutil": { @@ -319,7 +309,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "pytz": { @@ -342,7 +332,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.17.0" }, "sqlalchemy": { @@ -406,7 +396,6 @@ "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==2.0.44" }, "typing-extensions": { @@ -427,11 +416,11 @@ }, "urllib3": { "hashes": [ - "sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f", - "sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b" + "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f", + "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1" ], - "markers": "python_version >= '3.9'", - "version": "==2.6.1" + "markers": "python_version >= '3.10'", + "version": "==2.6.0" } }, "develop": { @@ -445,37 +434,35 @@ }, "black": { "hashes": [ - "sha256:05dd459a19e218078a1f98178c13f861fe6a9a5f88fc969ca4d9b49eb1809783", - "sha256:09524b0e6af8ba7a3ffabdfc7a9922fb9adef60fed008c7cd2fc01f3048e6e6f", - "sha256:0a0953b134f9335c2434864a643c842c44fba562155c738a2a37a4d61f00cad5", - "sha256:0e509c858adf63aa61d908061b52e580c40eae0dfa72415fa47ac01b12e29baf", - "sha256:169506ba91ef21e2e0591563deda7f00030cb466e747c4b09cb0a9dae5db2f43", - "sha256:17dcc893da8d73d8f74a596f64b7c98ef5239c2cd2b053c0f25912c4494bf9ea", - "sha256:1a2f578ae20c19c50a382286ba78bfbeafdf788579b053d8e4980afb079ab9be", - "sha256:2355bbb6c3b76062870942d8cc450d4f8ac71f9c93c40122762c8784df49543f", - "sha256:252678f07f5bac4ff0d0e9b261fbb029fa530cfa206d0a636a34ab445ef8ca9d", - "sha256:274f940c147ddab4442d316b27f9e332ca586d39c85ecf59ebdea82cc9ee8892", - "sha256:31f96b7c98c1ddaeb07dc0f56c652e25bdedaac76d5b68a059d998b57c55594a", - "sha256:48ceb36c16dbc84062740049eef990bb2ce07598272e673c17d1a7720c71c828", - "sha256:51e267458f7e650afed8445dc7edb3187143003d52a1b710c7321aef22aa9655", - "sha256:546eecfe9a3a6b46f9d69d8a642585a6eaf348bcbbc4d87a19635570e02d9f4a", - "sha256:778285d9ea197f34704e3791ea9404cd6d07595745907dd2ce3da7a13627b29b", - "sha256:8d3dd9cea14bff7ddc0eb243c811cdb1a011ebb4800a5f0335a01a68654796a7", - "sha256:9678bd991cc793e81d19aeeae57966ee02909877cb65838ccffef24c3ebac08f", - "sha256:97596189949a8aad13ad12fcbb4ae89330039b96ad6742e6f6b45e75ad5cfd83", - "sha256:9ec77439ef3e34896995503865a85732c94396edcc739f302c5673a2315e1e7f", - "sha256:a05ddeb656534c3e27a05a29196c962877c83fa5503db89e68857d1161ad08a5", - "sha256:a3fa71e3b8dd9f7c6ac4d818345237dfb4175ed3bf37cd5a581dbc4c034f1ec5", - "sha256:b162653ed89eb942758efeb29d5e333ca5bb90e5130216f8369857db5955a7da", - "sha256:bc5b1c09fe3c931ddd20ee548511c64ebf964ada7e6f0763d443947fd1c603ce", - "sha256:c1f68c5eff61f226934be6b5b80296cf6939e5d2f0c2f7d543ea08b204bfaf59", - "sha256:d0cfa263e85caea2cff57d8f917f9f51adae8e20b610e2b23de35b5b11ce691a", - "sha256:d3e1b65634b0e471d07ff86ec338819e2ef860689859ef4501ab7ac290431f9b", - "sha256:f85ba1ad15d446756b4ab5f3044731bf68b777f8f9ac9cdabd2425b97cd9c4e8" + "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", + "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", + "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", + "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", + "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc", + "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", + "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", + "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", + "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", + "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", + "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", + "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", + "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc", + "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", + "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2", + "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", + "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06", + "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", + "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", + "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", + "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", + "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", + "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", + "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", + "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", + "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03" ], "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==25.12.0" + "version": "==25.11.0" }, "boolean.py": { "hashes": [ @@ -486,38 +473,38 @@ }, "boto3": { "hashes": [ - "sha256:c5cb2ada690c14e2dfa1e1c59ef7ef399c5e381f5514f1541d28310e35192300", - "sha256:eda49046c0f6a21ac159f9b2d609e5cc70d1dd019b7ac9618eec99285282b3db" + "sha256:0f4089e230d55f981d67376e48cefd41c3d58c7f694480f13288e6ff7b1fefbc", + "sha256:65f0d98a3786ec729ba9b5f70448895b2d1d1f27949aa7af5cb4f39da341bbc4" ], - "markers": "python_version >= '3.9'", - "version": "==1.42.7" + "index": "pypi", + "version": "==1.42.4" }, "boto3-stubs": { "extras": [ "essential" ], "hashes": [ - "sha256:2d3f9e10686ca7ca054b788450fcc3d505b9f74954817afd994f71742df6d883", - "sha256:e4f153103a3e67a50aa98b9141382a16d37e943aef957319fe3a48e9b4a33a5a" + "sha256:b489ed82a55e71d72d2ae7aee7fedd05e22bc8836360ef9c6d55b610f3bf45d2", + "sha256:c6c2853e51b3d330fe9862ffaa38e004bede8247e79d97a89bea09df8d0c3608" ], - "markers": "python_version >= '3.9'", - "version": "==1.42.7" + "index": "pypi", + "version": "==1.42.4" }, "botocore": { "hashes": [ - "sha256:92128d56654342f026d5c20a92bf0e8b546be1eb38df2c0efc7433e8bbc39045", - "sha256:cc401b4836eae2a781efa1d1df88b2e92f9245885a6ae1bf9a6b26bc97b3efd2" + "sha256:c3b091fd33809f187824b6434e518b889514ded5164cb379358367c18e8b0d7d", + "sha256:d4816023492b987a804f693c2d76fb751fdc8755d49933106d69e2489c4c0f98" ], "markers": "python_version >= '3.9'", - "version": "==1.42.7" + "version": "==1.42.4" }, "botocore-stubs": { "hashes": [ - "sha256:951fc41e78e1a53b49bfe8511bc24e430eda4c689ca6033c643693e56485e69c", - "sha256:d5c9ac851e8d7ce30d25204add0e2448cb23cb5f8fbe6b5c768ea1e4471b4455" + "sha256:0b6711abe0ceffe32fa572c0c683e93d9a17b2c4cff1b47a7b48bb784fe2dbcc", + "sha256:5b8e63a1f62800945dcc824514fa0465f78ad2c8fe7a592b59f77ca19f1aa10b" ], "markers": "python_version >= '3.9'", - "version": "==1.42.7" + "version": "==1.42.4" }, "cachecontrol": { "extras": [ @@ -625,7 +612,7 @@ "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf" ], - "markers": "python_version >= '3.9'", + "markers": "python_full_version >= '3.9' and platform_python_implementation != 'PyPy'", "version": "==2.0.0" }, "cfgv": { @@ -768,101 +755,101 @@ "toml" ], "hashes": [ - "sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe", - "sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b", - "sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070", - "sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e", - "sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053", - "sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080", - "sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc", - "sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb", - "sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf", - "sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820", - "sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b", - "sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232", - "sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657", - "sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef", - "sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd", - "sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259", - "sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833", - "sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d", - "sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f", - "sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493", - "sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8", - "sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf", - "sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9", - "sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19", - "sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98", - "sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f", - "sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b", - "sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9", - "sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b", - "sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e", - "sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc", - "sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256", - "sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8", - "sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927", - "sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae", - "sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f", - "sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe", - "sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f", - "sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621", - "sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1", - "sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137", - "sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9", - "sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74", - "sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46", - "sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8", - "sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940", - "sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39", - "sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a", - "sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d", - "sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b", - "sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0", - "sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a", - "sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2", - "sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb", - "sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303", - "sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971", - "sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030", - "sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96", - "sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb", - "sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33", - "sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8", - "sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904", - "sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d", - "sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28", - "sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e", - "sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e", - "sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9", - "sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74", - "sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8", - "sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032", - "sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57", - "sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be", - "sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936", - "sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f", - "sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c", - "sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a", - "sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791", - "sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5", - "sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e", - "sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a", - "sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7", - "sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a", - "sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753", - "sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3", - "sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6", - "sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e", - "sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071", - "sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b", - "sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511", - "sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff", - "sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7", - "sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6" + "sha256:01d24af36fedda51c2b1aca56e4330a3710f83b02a5ff3743a6b015ffa7c9384", + "sha256:04a79245ab2b7a61688958f7a855275997134bc84f4a03bc240cf64ff132abf6", + "sha256:083631eeff5eb9992c923e14b810a179798bb598e6a0dd60586819fc23be6e60", + "sha256:099d11698385d572ceafb3288a5b80fe1fc58bf665b3f9d362389de488361d3d", + "sha256:09a86acaaa8455f13d6a99221d9654df249b33937b4e212b4e5a822065f12aa7", + "sha256:159d50c0b12e060b15ed3d39f87ed43d4f7f7ad40b8a534f4dd331adbb51104a", + "sha256:172cf3a34bfef42611963e2b661302a8931f44df31629e5b1050567d6b90287d", + "sha256:22a7aade354a72dff3b59c577bfd18d6945c61f97393bc5fb7bd293a4237024b", + "sha256:24cff9d1f5743f67db7ba46ff284018a6e9aeb649b67aa1e70c396aa1b7cb23c", + "sha256:29644c928772c78512b48e14156b81255000dcfd4817574ff69def189bcb3647", + "sha256:297bc2da28440f5ae51c845a47c8175a4db0553a53827886e4fb25c66633000c", + "sha256:2fd8354ed5d69775ac42986a691fbf68b4084278710cee9d7c3eaa0c28fa982a", + "sha256:313672140638b6ddb2c6455ddeda41c6a0b208298034544cfca138978c6baed6", + "sha256:31b8b2e38391a56e3cea39d22a23faaa7c3fc911751756ef6d2621d2a9daf742", + "sha256:32b75c2ba3f324ee37af3ccee5b30458038c50b349ad9b88cee85096132a575b", + "sha256:33baadc0efd5c7294f436a632566ccc1f72c867f82833eb59820ee37dc811c6f", + "sha256:3ff651dcd36d2fea66877cd4a82de478004c59b849945446acb5baf9379a1b64", + "sha256:40c867af715f22592e0d0fb533a33a71ec9e0f73a6945f722a0c85c8c1cbe3a2", + "sha256:42435d46d6461a3b305cdfcad7cdd3248787771f53fe18305548cba474e6523b", + "sha256:459443346509476170d553035e4a3eed7b860f4fe5242f02de1010501956ce87", + "sha256:4648158fd8dd9381b5847622df1c90ff314efbfc1df4550092ab6013c238a5fc", + "sha256:47324fffca8d8eae7e185b5bb20c14645f23350f870c1649003618ea91a78941", + "sha256:473dc45d69694069adb7680c405fb1e81f60b2aff42c81e2f2c3feaf544d878c", + "sha256:4b59b501455535e2e5dde5881739897967b272ba25988c89145c12d772810ccb", + "sha256:4c589361263ab2953e3c4cd2a94db94c4ad4a8e572776ecfbad2389c626e4507", + "sha256:51777647a749abdf6f6fd8c7cffab12de68ab93aab15efc72fbbb83036c2a068", + "sha256:52ca620260bd8cd6027317bdd8b8ba929be1d741764ee765b42c4d79a408601e", + "sha256:5560c7e0d82b42eb1951e4f68f071f8017c824ebfd5a6ebe42c60ac16c6c2434", + "sha256:5734b5d913c3755e72f70bf6cc37a0518d4f4745cde760c5d8e12005e62f9832", + "sha256:583f9adbefd278e9de33c33d6846aa8f5d164fa49b47144180a0e037f0688bb9", + "sha256:58c1c6aa677f3a1411fe6fb28ec3a942e4f665df036a3608816e0847fad23296", + "sha256:5b3c889c0b8b283a24d721a9eabc8ccafcfc3aebf167e4cd0d0e23bf8ec4e339", + "sha256:5bcead88c8423e1855e64b8057d0544e33e4080b95b240c2a355334bb7ced937", + "sha256:5ea5a9f7dc8877455b13dd1effd3202e0bca72f6f3ab09f9036b1bcf728f69ac", + "sha256:5f3738279524e988d9da2893f307c2093815c623f8d05a8f79e3eff3a7a9e553", + "sha256:68b0d0a2d84f333de875666259dadf28cc67858bc8fd8b3f1eae84d3c2bec455", + "sha256:6d907ddccbca819afa2cd014bc69983b146cca2735a0b1e6259b2a6c10be1e70", + "sha256:6e1a8c066dabcde56d5d9fed6a66bc19a2883a3fe051f0c397a41fc42aedd4cc", + "sha256:6ff7651cc01a246908eac162a6a86fc0dbab6de1ad165dfb9a1e2ec660b44984", + "sha256:737c3814903be30695b2de20d22bcc5428fdae305c61ba44cdc8b3252984c49c", + "sha256:73f9e7fbd51a221818fd11b7090eaa835a353ddd59c236c57b2199486b116c6d", + "sha256:76336c19a9ef4a94b2f8dc79f8ac2da3f193f625bb5d6f51a328cd19bfc19933", + "sha256:7670d860e18b1e3ee5930b17a7d55ae6287ec6e55d9799982aa103a2cc1fa2ef", + "sha256:79a44421cd5fba96aa57b5e3b5a4d3274c449d4c622e8f76882d76635501fd13", + "sha256:7c1059b600aec6ef090721f8f633f60ed70afaffe8ecab85b59df748f24b31fe", + "sha256:8638cbb002eaa5d7c8d04da667813ce1067080b9a91099801a0053086e52b736", + "sha256:874fe69a0785d96bd066059cd4368022cebbec1a8958f224f0016979183916e6", + "sha256:8787b0f982e020adb732b9f051f3e49dd5054cebbc3f3432061278512a2b1360", + "sha256:8bb5b894b3ec09dcd6d3743229dc7f2c42ef7787dc40596ae04c0edda487371e", + "sha256:907e0df1b71ba77463687a74149c6122c3f6aac56c2510a5d906b2f368208560", + "sha256:90d58ac63bc85e0fb919f14d09d6caa63f35a5512a2205284b7816cafd21bb03", + "sha256:9157a5e233c40ce6613dead4c131a006adfda70e557b6856b97aceed01b0e27a", + "sha256:91b810a163ccad2e43b1faa11d70d3cf4b6f3d83f9fd5f2df82a32d47b648e0d", + "sha256:950411f1eb5d579999c5f66c62a40961f126fc71e5e14419f004471957b51508", + "sha256:99d5415c73ca12d558e07776bd957c4222c687b9f1d26fa0e1b57e3598bdcde8", + "sha256:9b57e2d0ddd5f0582bae5437c04ee71c46cd908e7bc5d4d0391f9a41e812dd12", + "sha256:9bb44c889fb68004e94cab71f6a021ec83eac9aeabdbb5a5a88821ec46e1da73", + "sha256:a00594770eb715854fb1c57e0dea08cce6720cfbc531accdb9850d7c7770396c", + "sha256:a1783ed5bd0d5938d4435014626568dc7f93e3cb99bc59188cc18857c47aa3c4", + "sha256:a1c59b7dc169809a88b21a936eccf71c3895a78f5592051b1af8f4d59c2b4f92", + "sha256:aa124a3683d2af98bd9d9c2bfa7a5076ca7e5ab09fdb96b81fa7d89376ae928f", + "sha256:aa7d48520a32cb21c7a9b31f81799e8eaec7239db36c3b670be0fa2403828d1d", + "sha256:b1518ecbad4e6173f4c6e6c4a46e49555ea5679bf3feda5edb1b935c7c44e8a0", + "sha256:b1aab7302a87bafebfe76b12af681b56ff446dc6f32ed178ff9c092ca776e6bc", + "sha256:b2089cc445f2dc0af6f801f0d1355c025b76c24481935303cf1af28f636688f0", + "sha256:b365adc70a6936c6b0582dc38746b33b2454148c02349345412c6e743efb646d", + "sha256:b527a08cdf15753279b7afb2339a12073620b761d79b81cbe2cdebdb43d90daa", + "sha256:bc13baf85cd8a4cfcf4a35c7bc9d795837ad809775f782f697bf630b7e200211", + "sha256:bcec6f47e4cb8a4c2dc91ce507f6eefc6a1b10f58df32cdc61dff65455031dfc", + "sha256:c406a71f544800ef7e9e0000af706b88465f3573ae8b8de37e5f96c59f689ad1", + "sha256:c5a6f20bf48b8866095c6820641e7ffbe23f2ac84a2efc218d91235e404c7777", + "sha256:c87395744f5c77c866d0f5a43d97cc39e17c7f1cb0115e54a2fe67ca75c5d14d", + "sha256:ca8ecfa283764fdda3eae1bdb6afe58bf78c2c3ec2b2edcb05a671f0bba7b3f9", + "sha256:cb2a1b6ab9fe833714a483a915de350abc624a37149649297624c8d57add089c", + "sha256:ccf3b2ede91decd2fb53ec73c1f949c3e034129d1e0b07798ff1d02ea0c8fa4a", + "sha256:ce61969812d6a98a981d147d9ac583a36ac7db7766f2e64a9d4d059c2fe29d07", + "sha256:d6c2e26b481c9159c2773a37947a9718cfdc58893029cdfb177531793e375cfc", + "sha256:d7e0d0303c13b54db495eb636bc2465b2fb8475d4c8bcec8fe4b5ca454dfbae8", + "sha256:d8842f17095b9868a05837b7b1b73495293091bed870e099521ada176aa3e00e", + "sha256:d93fbf446c31c0140208dcd07c5d882029832e8ed7891a39d6d44bd65f2316c3", + "sha256:dcbb630ab034e86d2a0f79aefd2be07e583202f41e037602d438c80044957baa", + "sha256:e0d68c1f7eabbc8abe582d11fa393ea483caf4f44b0af86881174769f185c94d", + "sha256:e0f483ab4f749039894abaf80c2f9e7ed77bbf3c737517fb88c8e8e305896a17", + "sha256:e71bba6a40883b00c6d571599b4627f50c360b3d0d02bfc658168936be74027b", + "sha256:e84da3a0fd233aeec797b981c51af1cabac74f9bd67be42458365b30d11b5291", + "sha256:e949ebf60c717c3df63adb4a1a366c096c8d7fd8472608cd09359e1bd48ef59f", + "sha256:f3433ffd541380f3a0e423cff0f4926d55b0cc8c1d160fdc3be24a4c03aa65f7", + "sha256:f7ba9da4726e446d8dd8aae5a6cd872511184a5d861de80a86ef970b5dacce3e", + "sha256:f7bbb321d4adc9f65e402c677cd1c8e4c2d0105d3ce285b51b4d87f1d5db5245", + "sha256:f999813dddeb2a56aab5841e687b68169da0d3f6fc78ccf50952fa2463746022", + "sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c", + "sha256:fdba9f15849534594f60b47c9a30bc70409b54947319a7c4fd0e8e3d8d2f355d" ], "markers": "python_version >= '3.10'", - "version": "==7.13.0" + "version": "==7.12.0" }, "coveralls": { "hashes": [ @@ -870,7 +857,6 @@ "sha256:7c21ffa2808d3052fa0cfca3842a9f3d21cc8eada02538c192d932199e5f07d4" ], "index": "pypi", - "markers": "python_version >= '3.10' and python_version < '4.0'", "version": "==4.0.2" }, "cryptography": { @@ -1016,7 +1002,6 @@ "sha256:ebe6d1d58d7d988fbf23ff8ff6d8e1622cfdb194daf4b7b73b792c4ec3b85385" ], "index": "pypi", - "markers": "python_version >= '3.11'", "version": "==9.8.0" }, "ipython-pygments-lexers": { @@ -1053,85 +1038,85 @@ }, "librt": { "hashes": [ - "sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a", - "sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3", - "sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678", - "sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93", - "sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc", - "sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e", - "sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec", - "sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7", - "sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712", - "sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5", - "sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71", - "sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f", - "sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a", - "sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2", - "sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809", - "sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18", - "sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093", - "sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e", - "sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a", - "sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292", - "sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798", - "sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65", - "sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec", - "sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe", - "sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806", - "sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42", - "sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0", - "sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed", - "sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b", - "sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70", - "sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e", - "sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720", - "sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af", - "sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0", - "sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218", - "sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b", - "sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea", - "sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c", - "sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e", - "sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f", - "sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a", - "sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90", - "sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055", - "sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e", - "sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910", - "sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207", - "sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a", - "sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b", - "sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b", - "sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a", - "sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed", - "sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7", - "sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d", - "sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b", - "sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7", - "sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e", - "sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258", - "sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e", - "sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0", - "sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd", - "sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010", - "sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5", - "sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620", - "sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f", - "sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e", - "sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60", - "sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b", - "sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445", - "sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a", - "sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a", - "sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f", - "sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135", - "sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51", - "sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3", - "sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c", - "sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc" + "sha256:02b98cb2558b32d10489abcdf5119f08b27d6cf4e587159d3fcb0a1609d98d4c", + "sha256:0a0d0c70418e0c37c040a3acace252a21e25751f3fa96084facf24783d24fd5d", + "sha256:0ce1f5863839c85c8e7e1467dd939d4af5e59bab8852852a9d8b7a9dbcdcaf2a", + "sha256:0e7a4dcb2419b766a034a62d28708a11e92d790aa6faa74913e587ccc4c2fc55", + "sha256:0fee181b2f73c14d1f80380b91945305919e409748bc386008fe56e23e9b0652", + "sha256:12753c83c2e29c7bb28627bbada0cfcf19e8225c6da98eb7c590b27743115298", + "sha256:15875129cce2377bd703557314b81c4e7bfc63fdcd8247b0c5bf7dc34a8d61b5", + "sha256:1aa6eb96952cadb861b8fc5a41832349935a5a4bd1478b8425c023ece98af72c", + "sha256:1c16a988ef540b6dba0be057c343ff7489c95080348b70b6a1fa527128cf386b", + "sha256:1d156fce27e92ebd5094ff8e9fb622d945026fd552e8eda4f0acbb58164e67b6", + "sha256:1e3f975f62352ee20a0b1071532bf91e77097a541ab6f68e8cdfc56e708bed11", + "sha256:211a312a9ab2226ecdb509087bc6a0d0f9d8550565a0d1b848576b9119c69cda", + "sha256:2471e23a12599761e2f052a84dd359ba1d2b34d018d2d8039aa0f8865ee7a563", + "sha256:263cc4beae054d088292471434af6fc710eed357161f0d45c1783830cb5332b2", + "sha256:2bdf11b510877003330fff88b71985c1d73f8710527256bada5c78d4c8c341ef", + "sha256:2c23b7ab197ee9ed29cd0b61ac1e24e4483f24612f4626833877e19b28f95935", + "sha256:350385b5f8d3f71686b4aa2181d654f01de50a0e4b11eb20fa36f5b00dc5c440", + "sha256:369cf96ba818af4d14a95ce4d00f163cfa64d800ebb5a0f54556b9cb4346d97b", + "sha256:37c9133c69adcf6229e3aecea56d1c77a79dd00f5d65e7f28c500590b4edcf4b", + "sha256:388f794cd52ed4692ec0e3b00a07a502ef879bac90fa21f6e0035422c7b117c8", + "sha256:3cd85f9b52300cc0a748a72d8eba2f7998f03e1dfb44b8db6e2ca344f175e1a9", + "sha256:43028b50350caf3f27168d7a5f824d23e3300f20eb2bcb99fe03f14568dad0fc", + "sha256:46293b0541a04909581084781aaa0c0c56d2b430a551717de2535e564f569127", + "sha256:49bf5cb376e120db09c2ab56fde3ce4d3933f496d74c749948964e11d1c7ada6", + "sha256:4ce4baf7f74a5eb676a9688cf31ec8f25835cf84a3f129b781bde55daf267cf1", + "sha256:4d601771f291cd28aaefe115b0c3105d36fdd7d0d0abcc23bb17714c17b370bb", + "sha256:4e5b64996f1f116b6ba9597a8ff9f098c240926abbd024d1bc8e2605b46f7590", + "sha256:506fd319530866802f9e63f28e3822e24a38dcf1814b5b6f54690bfdb55ee947", + "sha256:51d899c7460cb30e68f7e83f4d68915127a8c7eaada7657702287e4c542f88d4", + "sha256:645721c2462136ed2783d6ba1edeafbc8f229f7229967fdaacf5f826fba99cf9", + "sha256:654a2a2e6325fc4906200156c98e5ef898011d4ee998f8b4277d96356920703a", + "sha256:6b70ae76272f107b6492e0a135a5af150efec29abd20f7a299aa4193e74bb9a9", + "sha256:6ef7654f79590bef5cc2256ffc2e9d8fccf55752f70a45e26aaac74237ab8552", + "sha256:75c787db17786f5a732a1eaf09b04d2c43f8931efe0876e594b8be77e603a2e1", + "sha256:810d09701fc9615943a7d510b50d450fdf1e54a8917e268cf6fa907bc61cd8df", + "sha256:867c904b6748dfa212f9de8f27537f1e51f9cc7a51474a3bdafe136d00608e45", + "sha256:88011c66ef4053807e45158cce6c79f8f1a12d533b9a918a062273c57f8846b6", + "sha256:89563b5aaada1750e106d0b04953b147c07ac07507e79252413a7e2d59153990", + "sha256:90119009b757b3a611aba38e9ee163b49864825572325e2eec0080c42fc8bb69", + "sha256:912f87f7059bd07644c675a499fff1bc3d39aea324dc4a818bf1fb163ac11fe6", + "sha256:92d7d9a4ab2ac35cf3202d555125dcfa29ec55ecee10cd5b8c9de412b0ad4ce1", + "sha256:938050cb83c54cbd636e3b68df8dee488740f7de557b6d3dc77998b825d544b1", + "sha256:96715093db6f983ca9c7d8a4e36b450d7c989c3b07839bb7bc3b8be12cf601af", + "sha256:97d3b787e78e8cc1b14513747cc677d3390493871394e3da9ac50dec99e2dc43", + "sha256:99d86939d3f5be4734ff3d87923002b816e047fbe35eca731ada5ec1871afc01", + "sha256:a531d4ae278713495768030ff02fc687cc174be1bf55f5084303d470e170ba7e", + "sha256:a914759833137621c8fab73ecc0701921689f7bd29bbc34fd9cadbc6057a5261", + "sha256:af5ab2c4cf132cedba4359551c4f05ef2da00229aaae13e3f8a337171bb700d9", + "sha256:b1ed0aa6c0d97697559200f64bbf1c5f04767631d8494b2ace593f0a9353d63b", + "sha256:ba50f3f01eac1066409988a7b5dcf741a474917bdef0a645ed21525f2dae0fca", + "sha256:bbe9364d5b25f1fce27acaf695205a89ba2f3d79c668b03bde7315ba4b088b60", + "sha256:bcd71a7ab212ca325013f968d06b72bb5ff83fb190dd582aa010e9c939a67050", + "sha256:c18415a23b465fc379a4a3e6e71c28f3263a111d6a0811c53b1d50ca9e1d7642", + "sha256:c3c10fad1468457b2d13d824b7cde8946a4caa76f18fe127c7e549d1730ab271", + "sha256:ca62bc77d6e2f1ece0e141c28e2778ff79f1ca50f7824a2d6237abe9397997f5", + "sha256:ce9fabcda1b5015dd2ff368a9d2f36586eb9fee375e3ee407f18045f4c032516", + "sha256:d2af9c598b2cb88e3d0afcd5caca0fdbb322a93c9043d7c7fad758b0375a5263", + "sha256:d7884f93a210e465c793023185672816d0e94a748fd8728fb7f5cb4a7e457da7", + "sha256:d89460a3a0dc0a6621c17be4eb84747b80a2e68e8da1b8cc6c2d8fc0a642b50e", + "sha256:da5edaf3c650fa9955d7343d1e057fdfc1adb3484621847331d8f01c84de70cc", + "sha256:e20cb95262897eea692eced3398f7be6647d38244c1fa8480c0e48337aac0080", + "sha256:e565e20cb349f93a4eac2509118ed75a9520dc7d757e84035a50a3307d97e3cc", + "sha256:e92323133242ff29eec97538f5d1421e8b96abb3212a07b9c6cea514dd58ddba", + "sha256:e95d45bfa4f207a9117ae7fb60c5cb0308eb77a924151a0b9a7d2fb70d8aec14", + "sha256:eab63367bdb304e87d108cfd078b0d9bfa62f4fe3e5daf9afc5e159676cac15b", + "sha256:ec5235ce0f0ab7f3006c5ea9b673d2168030911b7d3a73f751a809e12c5ae54f", + "sha256:ed2f2d991efb60218502b1a32f666cebb33deb904a176e8c36fcc8f7061f49b9", + "sha256:ee41eff32c0d1c08f50c32cdd2c2314366cea3912074b68db95df8cc4015eab3", + "sha256:f312a192534cf162306a9f00f6d5d6f432f9f8d07f9f726111de477cec8d3ddf", + "sha256:f32955c82ac5372f8d841fbe4d828f3538ef26f86ab7a275041100122513e5bf", + "sha256:f5771fd63fe30dfbc94ac08eb6f590fb74964d90aba14c06ac94ed40cbff9f99", + "sha256:f7ab208a759db0b607c785b8970d51ad101ebec7de4b13fbedafc4207508df85", + "sha256:f8054546544f70cd27cb5e0a73c8de271c9dcc664741399acd584134310e312a", + "sha256:f86024966f5bd4f962cbd54a4ad5d0e435fd3686f7edcd78c5aa84bb9427fa16", + "sha256:fcfe89d3bb67df63e2cb1e00a379bbc73720b43a4b8dd94ac4ca87ef32ec0f4d", + "sha256:fffb19b11f49c516b9cc4935e5ae01b07dfaf77b61f951c55ac9f51d3e9304aa" ], "markers": "python_version >= '3.9'", - "version": "==0.7.3" + "version": "==0.7.0" }, "license-expression": { "hashes": [ @@ -1266,7 +1251,6 @@ "sha256:b65aa8fc9032c5c574415451e14fd7da4e43fd50b8bdcb5f10289ad382c25bcf" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==5.1.18" }, "msgpack": { @@ -1379,7 +1363,6 @@ "sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==1.19.0" }, "mypy-boto3-cloudformation": { @@ -1400,11 +1383,11 @@ }, "mypy-boto3-ec2": { "hashes": [ - "sha256:1b54eaa6403c10677496f7dccdd0c2911533b1f26e4a5732af56fbd31141796f", - "sha256:bc89dcbd7057bd58fd4dc9956ae4d581c35c908c4920318d954ec41fe507ee37" + "sha256:4a9844dae662696979870a4ac5d9d26de30c635eeadb5795ec04c18475b05ae3", + "sha256:e19da3e0b316024d5d74db4ceab5cf529678e863f1986f936e04d58b67c40b34" ], "markers": "python_version >= '3.9'", - "version": "==1.42.5" + "version": "==1.42.3" }, "mypy-boto3-lambda": { "hashes": [ @@ -1416,11 +1399,11 @@ }, "mypy-boto3-rds": { "hashes": [ - "sha256:4cea697b63f7615a741dc9928acfbb5d956018e5ca73959b4031adfaf31921e7", - "sha256:e9a8679d1a61424d31327ee0b1f989571e21ecd6de3cbe7f9dd39174d528abdc" + "sha256:0a15bbea23e22cb016fa6fa49d5913b398584aba49d83f11f555a295aac3faf0", + "sha256:656e95c307b82cff92d6ece722aa3960ea82f33053e043aa0bb7929609843636" ], "markers": "python_version >= '3.9'", - "version": "==1.42.5" + "version": "==1.42.3" }, "mypy-boto3-s3": { "hashes": [ @@ -1531,7 +1514,7 @@ "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520" ], - "markers": "python_version >= '3.11'", + "markers": "python_version >= '3.12'", "version": "==2.3.5" }, "packageurl-python": { @@ -1556,7 +1539,6 @@ "sha256:eb5c9b6138bd8492fd74a47b09c9497341a278fcfbc8633ea4b35b230ebf4be5" ], "index": "pypi", - "markers": "python_version >= '3.10'", "version": "==2.3.3.251201" }, "parso": { @@ -1605,7 +1587,6 @@ "sha256:427ea5bf61d1d06b98b1ae29b7feacc00288a2eced52c9c58ceed5253ef6c2a4" ], "index": "pypi", - "markers": "python_version >= '3.10'", "version": "==2.10.0" }, "pip-requirements-parser": { @@ -1638,7 +1619,6 @@ "sha256:dc5a065e932b19fc1d4c653c6939068fe54325af8e741e74e88db4d28a4dd66b" ], "index": "pypi", - "markers": "python_version >= '3.10'", "version": "==4.5.0" }, "prompt-toolkit": { @@ -1724,24 +1704,23 @@ "sha256:f7fe3dbe871294ba70d789be16b6e7e52b418311e166e0e3cba9522f0f437fb1", "sha256:f963ba8c3b0199f9d6b794c90ec77545e05eadc83973897a4523c9e8d84e9340" ], - "markers": "python_version >= '3.10'", + "index": "pypi", "version": "==22.0.0" }, "pyarrow-stubs": { "hashes": [ - "sha256:a53793149bcbf41670acb8cd843645e3bf0469e4aa035824adda61c48fa900c6", - "sha256:eab02b02d4d74d86619b7f7b9fe6e7ddfe425cedf8c31aa4c7fd33cdb3b189be" + "sha256:09da6809f37cc6dbbbf59c9c8e42269290d19ac09f65d2b3456c671f1c3a8765", + "sha256:c0885c09f63e2be51bacb6b0e20b39083f43da1cb214d31e406f982e874bcb5a" ], "index": "pypi", - "markers": "python_version >= '3.9' and python_version < '4'", - "version": "==20.0.0.20251209" + "version": "==20.0.0.20251107" }, "pycparser": { "hashes": [ "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934" ], - "markers": "python_version >= '3.8'", + "markers": "implementation_name != 'PyPy'", "version": "==2.23" }, "pygments": { @@ -1762,12 +1741,11 @@ }, "pytest": { "hashes": [ - "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", - "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11" + "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", + "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad" ], "index": "pypi", - "markers": "python_version >= '3.10'", - "version": "==9.0.2" + "version": "==9.0.1" }, "pytest-mock": { "hashes": [ @@ -1775,7 +1753,6 @@ "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==3.15.1" }, "python-dateutil": { @@ -1783,7 +1760,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "pytokens": { @@ -1920,7 +1897,6 @@ "sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.14.8" }, "s3transfer": { @@ -1937,7 +1913,6 @@ "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==80.9.0" }, "six": { @@ -1945,7 +1920,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.17.0" }, "sortedcontainers": { @@ -2044,11 +2019,11 @@ }, "types-s3transfer": { "hashes": [ - "sha256:1c0cd111ecf6e21437cb410f5cddb631bfb2263b77ad973e79b9c6d0cb24e0ef", - "sha256:b4636472024c5e2b62278c5b759661efeb52a81851cde5f092f24100b1ecb443" + "sha256:1e617b14a9d3ce5be565f4b187fafa1d96075546b52072121f8fda8e0a444aed", + "sha256:43a523e0c43a88e447dfda5f4f6b63bf3da85316fdd2625f650817f2b170b5f7" ], - "markers": "python_version >= '3.9'", - "version": "==0.16.0" + "markers": "python_version >= '3.8'", + "version": "==0.15.0" }, "typing-extensions": { "hashes": [ @@ -2060,11 +2035,11 @@ }, "urllib3": { "hashes": [ - "sha256:5379eb6e1aba4088bae84f8242960017ec8d8e3decf30480b3a1abdaa9671a3f", - "sha256:e67d06fe947c36a7ca39f4994b08d73922d40e6cca949907be05efa6fd75110b" + "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f", + "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1" ], - "markers": "python_version >= '3.9'", - "version": "==2.6.1" + "markers": "python_version >= '3.10'", + "version": "==2.6.0" }, "virtualenv": { "hashes": [ diff --git a/tests/conftest.py b/tests/conftest.py index a193f39..ae8dcd3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,7 +7,11 @@ import moto import pytest -from tests.utils import generate_sample_embeddings, generate_sample_records +from tests.utils import ( + generate_sample_embeddings, + generate_sample_embeddings_for_run, + generate_sample_records, +) from timdex_dataset_api import TIMDEXDataset, TIMDEXDatasetMetadata from timdex_dataset_api.dataset import TIMDEXDatasetConfig from timdex_dataset_api.embeddings import ( @@ -294,12 +298,112 @@ def timdex_metadata_merged_deltas( # Dataset Embeddings Fixtures # ================================================================================ @pytest.fixture -def timdex_embeddings_with_runs(timdex_dataset_empty): - """TIMDEXEmbeddings with multiple runs for single strategy.""" - embeddings = TIMDEXEmbeddings(timdex_dataset_empty) - embeddings.write(generate_sample_embeddings(100, run_id="abc123")) # run 1 - embeddings.write(generate_sample_embeddings(50, run_id="def456")) # run 2 - return TIMDEXEmbeddings(timdex_dataset_empty) +def timdex_embeddings_with_runs(timdex_dataset_empty) -> TIMDEXEmbeddings: + """TIMDEXEmbeddings with multiple runs for single strategy. + + Also writes matching records and rebuilds metadata so embeddings queries + can join to metadata.records. + """ + timdex_dataset = timdex_dataset_empty + + # write matching records for embeddings + timdex_dataset.write( + generate_sample_records(100, source="alma", run_id="abc123"), + write_append_deltas=False, + ) + timdex_dataset.write( + generate_sample_records(50, source="alma", run_id="def456"), + write_append_deltas=False, + ) + + # reload TIMDEXDataset instance and build metadata + timdex_dataset.metadata.rebuild_dataset_metadata() + timdex_dataset = TIMDEXDataset(timdex_dataset.location) + + # write embeddings + timdex_dataset.embeddings.write( + generate_sample_embeddings_for_run(timdex_dataset, run_id="abc123") + ) + timdex_dataset.embeddings.write( + generate_sample_embeddings_for_run(timdex_dataset, run_id="def456") + ) + + # reload TIMDEXDataset instance once more + return TIMDEXDataset(timdex_dataset_empty.location).embeddings + + +@pytest.fixture +def timdex_dataset_for_embeddings_views(timdex_dataset_empty) -> TIMDEXDataset: + """TIMDEXDataset with records for testing embeddings views. + + Creates three scenarios to test DuckDB views: + - apple: single full run with 10 records + - orange: full run with 10 records + daily run with 5 records + - lemon: full run with 10 records + daily run with 5 records + """ + timdex_dataset_dataset = timdex_dataset_empty + + # scenario 1: apple - single full run + timdex_dataset_dataset.write( + generate_sample_records( + num_records=10, + source="apple", + run_date="2025-06-01", + run_type="full", + run_id="apple-1", + ), + write_append_deltas=False, + ) + + # scenario 2: orange - full run + daily run + timdex_dataset_dataset.write( + generate_sample_records( + num_records=10, + source="orange", + run_date="2025-07-01", + run_type="full", + run_id="orange-1", + ), + write_append_deltas=False, + ) + timdex_dataset_dataset.write( + generate_sample_records( + num_records=5, + source="orange", + run_date="2025-07-02", + run_type="daily", + run_id="orange-2", + ), + write_append_deltas=False, + ) + + # scenario 3: lemon - full run + daily run (daily will be embedded twice) + timdex_dataset_dataset.write( + generate_sample_records( + num_records=10, + source="lemon", + run_date="2025-08-01", + run_type="full", + run_id="lemon-1", + ), + write_append_deltas=False, + ) + timdex_dataset_dataset.write( + generate_sample_records( + num_records=5, + source="lemon", + run_date="2025-08-02", + run_type="daily", + run_id="lemon-2", + ), + write_append_deltas=False, + ) + + # rebuild metadata so records can be queried + timdex_dataset_dataset.metadata.rebuild_dataset_metadata() + + # reload dataset to work around bug + return TIMDEXDataset(timdex_dataset_dataset.location) # ================================================================================ diff --git a/tests/test_embeddings.py b/tests/test_embeddings.py index 5847514..78a5bf4 100644 --- a/tests/test_embeddings.py +++ b/tests/test_embeddings.py @@ -2,19 +2,26 @@ import json import math import os -from datetime import UTC, datetime +from datetime import UTC, date, datetime import pandas as pd import pyarrow as pa import pyarrow.dataset as ds +import pytest +from tests.utils import generate_sample_embeddings_for_run +from timdex_dataset_api import TIMDEXDataset from timdex_dataset_api.embeddings import ( + METADATA_SELECT_FILTER_COLUMNS, TIMDEX_DATASET_EMBEDDINGS_SCHEMA, DatasetEmbedding, TIMDEXEmbeddings, ) EMBEDDINGS_COLUMNS_SET = set(TIMDEX_DATASET_EMBEDDINGS_SCHEMA.names) +EMBEDDINGS_WITH_METADATA_COLUMNS_SET = EMBEDDINGS_COLUMNS_SET | set( + METADATA_SELECT_FILTER_COLUMNS +) def test_dataset_embedding_init(): @@ -135,10 +142,19 @@ def test_embeddings_create_batches(timdex_dataset_empty, sample_embeddings_gener def test_embeddings_read_batches_yields_pyarrow_record_batches( - timdex_dataset_empty, sample_embeddings_generator + timdex_dataset_empty, sample_embeddings_generator, sample_records_generator ): + # write matching records and rebuild metadata + timdex_dataset_empty.write( + sample_records_generator(100, source="alma", run_id="test-run"), + write_append_deltas=False, + ) + timdex_dataset_empty.metadata.rebuild_dataset_metadata() + timdex_dataset_empty.refresh() + + # write embeddings timdex_embeddings = TIMDEXEmbeddings(timdex_dataset_empty) - timdex_embeddings.write(sample_embeddings_generator(100)) + timdex_embeddings.write(sample_embeddings_generator(100, run_id="test-run")) timdex_embeddings = TIMDEXEmbeddings(timdex_dataset_empty) batches = timdex_embeddings.read_batches_iter() @@ -149,7 +165,7 @@ def test_embeddings_read_batches_yields_pyarrow_record_batches( def test_embeddings_read_batches_all_columns_by_default(timdex_embeddings_with_runs): batches = timdex_embeddings_with_runs.read_batches_iter() batch = next(batches) - assert set(batch.column_names) == EMBEDDINGS_COLUMNS_SET + assert set(batch.column_names) == EMBEDDINGS_WITH_METADATA_COLUMNS_SET def test_embeddings_read_batches_filter_columns(timdex_embeddings_with_runs): @@ -159,6 +175,44 @@ def test_embeddings_read_batches_filter_columns(timdex_embeddings_with_runs): assert set(batch.column_names) == set(columns_subset) +def test_embeddings_read_batches_explicit_columns_excludes_metadata( + timdex_embeddings_with_runs, +): + """Explicit column selection excludes metadata columns.""" + columns_subset = ["timdex_record_id", "embedding_vector"] + batches = timdex_embeddings_with_runs.read_batches_iter(columns=columns_subset) + batch = next(batches) + # only requested columns returned, no metadata columns + assert set(batch.column_names) == set(columns_subset) + assert "source" not in batch.column_names + assert "run_date" not in batch.column_names + + +def test_embeddings_read_batches_mixed_columns(timdex_embeddings_with_runs): + """Select both embeddings and metadata columns explicitly.""" + columns = ["timdex_record_id", "source", "embedding_vector", "run_date"] + batches = timdex_embeddings_with_runs.read_batches_iter(columns=columns) + batch = next(batches) + assert set(batch.column_names) == set(columns) + + +def test_embeddings_read_batches_metadata_only_columns(timdex_embeddings_with_runs): + """Select only metadata columns explicitly.""" + columns = ["source", "run_date", "run_type"] + batches = timdex_embeddings_with_runs.read_batches_iter(columns=columns) + batch = next(batches) + assert set(batch.column_names) == set(columns) + + +def test_embeddings_read_batches_invalid_columns_raises_error( + timdex_embeddings_with_runs, +): + """Invalid column names raise ValueError with helpful message.""" + columns = ["timdex_record_id", "invalid_column", "source"] + with pytest.raises(ValueError, match=r"Invalid column.*invalid_column"): + list(timdex_embeddings_with_runs.read_batches_iter(columns=columns)) + + def test_embeddings_read_batches_gets_full_dataset(timdex_embeddings_with_runs): batches = timdex_embeddings_with_runs.read_batches_iter() table = pa.Table.from_batches(batches) @@ -186,6 +240,35 @@ def test_embeddings_read_batches_with_filters_gets_subset_of_dataset( assert len(table) < dataset.count_rows() +def test_embeddings_read_batches_with_metadata_filter_source( + timdex_embeddings_with_runs, +): + """Filter embeddings by 'source' column from metadata.records via join.""" + batches = timdex_embeddings_with_runs.read_batches_iter(source="alma") + table = pa.Table.from_batches(batches) + assert len(table) == 150 + + +def test_embeddings_read_batches_with_metadata_filter_run_date( + timdex_embeddings_with_runs, +): + """Filter embeddings by 'run_date' column from metadata.records via join.""" + batches = timdex_embeddings_with_runs.read_batches_iter(run_date="2024-12-01") + table = pa.Table.from_batches(batches) + assert len(table) == 150 + + +def test_embeddings_read_batches_with_combined_filters( + timdex_embeddings_with_runs, +): + """Combine embeddings filter and metadata filter.""" + batches = timdex_embeddings_with_runs.read_batches_iter( + source="alma", run_id="abc123" + ) + table = pa.Table.from_batches(batches) + assert len(table) == 100 + + def test_embeddings_read_dataframes_yields_dataframes(timdex_embeddings_with_runs): df_iter = timdex_embeddings_with_runs.read_dataframes_iter() df_batch = next(df_iter) @@ -210,4 +293,144 @@ def test_embeddings_read_dicts_yields_dictionary_for_each_embeddings_record( dict_iter = timdex_embeddings_with_runs.read_dicts_iter() record = next(dict_iter) assert isinstance(record, dict) - assert set(record.keys()) == EMBEDDINGS_COLUMNS_SET + assert set(record.keys()) == EMBEDDINGS_WITH_METADATA_COLUMNS_SET + + +def test_current_embeddings_view_single_run(timdex_dataset_for_embeddings_views): + td = timdex_dataset_for_embeddings_views + + # write embeddings for run "apple-1" + td.embeddings.write(generate_sample_embeddings_for_run(td, run_id="apple-1")) + + # NOTE: at time of test creation, this manual reload is required + td = TIMDEXDataset(td.location) + + # query current_embeddings for apple source using read_dataframe + result = td.embeddings.read_dataframe(table="current_embeddings", source="apple") + + assert len(result) == 10 + assert (result["run_id"] == "apple-1").all() + assert (result["run_date"] == date(2025, 6, 1)).all() + + +def test_current_embeddings_view_multiple_runs(timdex_dataset_for_embeddings_views): + td = timdex_dataset_for_embeddings_views + + # write embeddings for runs "orange-1" and "orange-2" + td.embeddings.write(generate_sample_embeddings_for_run(td, run_id="orange-1")) + td.embeddings.write(generate_sample_embeddings_for_run(td, run_id="orange-2")) + + # NOTE: at time of test creation, this manual reload is required + td = TIMDEXDataset(td.location) + + # query current_embeddings for orange source using read_dataframe + result = td.embeddings.read_dataframe(table="current_embeddings", source="orange") + + # 10 total current embeddings: + # 5 from orange-1 (offsets 5-9), 5 from orange-2 (offsets 0-4) + assert len(result) == 10 + + # verify 5 from orange-1 (records not in orange-2, run_date 2025-07-01) + orange_1_records = result[result["run_id"] == "orange-1"] + assert len(orange_1_records) == 5 + assert (orange_1_records["run_date"] == date(2025, 7, 1)).all() + + # verify 5 from orange-2 (newer records, run_date 2025-07-02) + orange_2_records = result[result["run_id"] == "orange-2"] + assert len(orange_2_records) == 5 + assert (orange_2_records["run_date"] == date(2025, 7, 2)).all() + + +def test_current_embeddings_view_handles_duplicate_run_embeddings( + timdex_dataset_for_embeddings_views, +): + td = timdex_dataset_for_embeddings_views + + # write embeddings for run "lemon-1" + td.embeddings.write(generate_sample_embeddings_for_run(td, run_id="lemon-1")) + + # first embeddings run for run "lemon-2" + td.embeddings.write( + generate_sample_embeddings_for_run( + td, run_id="lemon-2", timestamp="2025-08-02T00:00:00+00:00" + ) + ) + + # second embeddings run for run "lemon-2" with a later timestamp + td.embeddings.write( + generate_sample_embeddings_for_run( + td, run_id="lemon-2", timestamp="2025-08-03T00:00:00+00:00" + ) + ) + + # NOTE: at time of test creation, this manual reload is required + td = TIMDEXDataset(td.location) + + # check all embeddings for lemon-2 to verify both writes exist + all_lemon_2 = td.embeddings.read_dataframe(table="embeddings", run_id="lemon-2") + # should have 10 rows (5 from first write, 5 from second write) + assert len(all_lemon_2) == 10 + + # verify both timestamps exist + unique_timestamps = all_lemon_2["timestamp"].unique() + assert len(unique_timestamps) == 2 + + # query current_embeddings for lemon source + result = td.embeddings.read_dataframe(table="current_embeddings", source="lemon") + + # 10 current embeddings: 5 from lemon-1, 5 from lemon-2 (latest timestamp) + assert len(result) == 10 + + # verify lemon-1 embeddings (run_date 2025-08-01) + lemon_1_result = result[result["run_id"] == "lemon-1"] + assert len(lemon_1_result) == 5 + assert (lemon_1_result["run_date"] == date(2025, 8, 1)).all() + + # verify lemon-2 embeddings have the later embedding timestamp (run_date 2025-08-02) + lemon_2_result = result[result["run_id"] == "lemon-2"] + assert len(lemon_2_result) == 5 + assert (lemon_2_result["run_date"] == date(2025, 8, 2)).all() + + # all lemon-2 current embeddings should have the later embedding timestamp + max_timestamp = all_lemon_2["timestamp"].max() + assert (lemon_2_result["timestamp"] == max_timestamp).all() + + +def test_embeddings_view_includes_all_embeddings(timdex_dataset_for_embeddings_views): + td = timdex_dataset_for_embeddings_views + + # write embeddings for lemon-1 + td.embeddings.write(generate_sample_embeddings_for_run(td, run_id="lemon-1")) + + # write embeddings for lemon-2 (first time) with explicit timestamp + td.embeddings.write( + generate_sample_embeddings_for_run( + td, run_id="lemon-2", timestamp="2025-08-02T00:00:00+00:00" + ) + ) + + # write embeddings for lemon-2 again with later timestamp + td.embeddings.write( + generate_sample_embeddings_for_run( + td, run_id="lemon-2", timestamp="2025-08-03T00:00:00+00:00" + ) + ) + + # NOTE: at time of test creation, this manual reload is required + td = TIMDEXDataset(td.location) + + # query all embeddings for lemon source + result = td.embeddings.read_dataframe(table="embeddings", source="lemon") + + # 20 total embeddings: 10 from lemon-1, 5 from lemon-2 first write, + # 5 from lemon-2 second write + assert len(result) == 20 + + # verify run_date distribution + lemon_1_embeddings = result[result["run_id"] == "lemon-1"] + assert len(lemon_1_embeddings) == 10 + assert (lemon_1_embeddings["run_date"] == date(2025, 8, 1)).all() + + lemon_2_embeddings = result[result["run_id"] == "lemon-2"] + assert len(lemon_2_embeddings) == 10 # 5 from each write + assert (lemon_2_embeddings["run_date"] == date(2025, 8, 2)).all() diff --git a/tests/utils.py b/tests/utils.py index f6de49b..8f6e783 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -7,7 +7,7 @@ import uuid from collections.abc import Iterator -from timdex_dataset_api import DatasetRecord +from timdex_dataset_api import DatasetRecord, TIMDEXDataset from timdex_dataset_api.embeddings import DatasetEmbedding @@ -94,3 +94,42 @@ def generate_sample_embeddings( embedding_vector=embedding_vector, embedding_object=embedding_object, ) + + +def generate_sample_embeddings_for_run( + timdex_dataset: TIMDEXDataset, + run_id: str, + embedding_model: str | None = "super-org/amazing-model", + embedding_strategy: str | None = "full_record", + timestamp: str | None = None, + embedding_dimensions: int = 3, +) -> Iterator[DatasetEmbedding]: + """Generate sample DatasetEmbeddings for a given ETL run.""" + records_metadata = timdex_dataset.conn.query( + f""" + select + * + from metadata.records + where run_id = '{run_id}'; + """ + ).to_df() + + if not timestamp: + timestamp = records_metadata.iloc[0].run_timestamp.isoformat() + + for _idx, record in records_metadata.iterrows(): + embedding_vector = [random.random() for _ in range(embedding_dimensions)] + embedding_object = json.dumps( + {f"token{x+1}": (x + 1) / 10 for x in range(embedding_dimensions)} + ).encode() + + yield DatasetEmbedding( + timdex_record_id=record.timdex_record_id, + run_id=run_id, + run_record_offset=record.run_record_offset, + embedding_model=embedding_model, + embedding_strategy=embedding_strategy, + embedding_vector=embedding_vector, + embedding_object=embedding_object, + timestamp=timestamp, + ) diff --git a/timdex_dataset_api/embeddings.py b/timdex_dataset_api/embeddings.py index ea9625d..ba8969b 100644 --- a/timdex_dataset_api/embeddings.py +++ b/timdex_dataset_api/embeddings.py @@ -3,7 +3,7 @@ import time import uuid from collections.abc import Iterator -from datetime import UTC, datetime +from datetime import UTC, date, datetime from typing import TYPE_CHECKING, TypedDict, Unpack, cast import attrs @@ -14,7 +14,7 @@ from duckdb import DuckDBPyConnection from duckdb import IOException as DuckDBIOException from duckdb_engine import Dialect as DuckDBDialect -from sqlalchemy import Table, select, text +from sqlalchemy import Table, and_, select, text from sqlalchemy.types import ARRAY, FLOAT from timdex_dataset_api.record import datetime_iso_parse @@ -43,13 +43,39 @@ ) +EMBEDDINGS_FILTER_COLUMNS = { + "timdex_record_id", + "run_id", + "run_record_offset", + "timestamp", + "embedding_model", + "embedding_strategy", +} + +# subset of record metadata columns for filtering and selecting +METADATA_SELECT_FILTER_COLUMNS = { + "source", + "run_date", + "run_type", + "action", + "run_timestamp", +} + + class EmbeddingsFilters(TypedDict, total=False): + # embeddings columns timdex_record_id: str run_id: str run_record_offset: int timestamp: str | datetime embedding_model: str embedding_strategy: str + # record metadata columns + source: str | list[str] + run_date: str | date | list[str | date] + run_type: str | list[str] + action: str | list[str] + run_timestamp: str | datetime | list[str | datetime] @define @@ -356,7 +382,7 @@ def read_batches_iter( data_query = self._build_query( table, - columns or TIMDEX_DATASET_EMBEDDINGS_SCHEMA.names, + columns, limit, where, **filters, @@ -379,21 +405,66 @@ def _build_query( """Build SQL query using SQLAlchemy. The method returns a SQL query string, which SQLAlchemy executes to - fetch results. + fetch results. Always joins to metadata.records to enable filtering + by metadata columns (source, run_date, run_type, action, run_timestamp). """ - sa_table = self.get_sa_table(table) + embeddings_table = self.get_sa_table(table) + metadata_table = self.timdex_dataset.metadata.get_sa_table("records") + + # create SQL statement with join to metadata.records + join_condition = and_( + embeddings_table.c.timdex_record_id == metadata_table.c.timdex_record_id, + embeddings_table.c.run_id == metadata_table.c.run_id, + embeddings_table.c.run_record_offset == metadata_table.c.run_record_offset, + ) - # create SQL statement object - # select named columns + # select specific columns or default to all from embeddings + metadata if columns: - stmt = select(*sa_table.c[*columns]).select_from(sa_table) + embeddings_cols = [] + metadata_cols = [] + + for col_name in columns: + if col_name in TIMDEX_DATASET_EMBEDDINGS_SCHEMA.names: + embeddings_cols.append(embeddings_table.c[col_name]) + elif col_name in METADATA_SELECT_FILTER_COLUMNS: + metadata_cols.append(metadata_table.c[col_name]) + else: + raise ValueError(f"Invalid column: {col_name}") + + stmt = select(*embeddings_cols, *metadata_cols) else: - stmt = select(sa_table).select_from(sa_table) + embeddings_cols = [ + embeddings_table.c[col] for col in TIMDEX_DATASET_EMBEDDINGS_SCHEMA.names + ] + metadata_cols = [ + metadata_table.c[col] for col in METADATA_SELECT_FILTER_COLUMNS + ] + stmt = select(*embeddings_cols, *metadata_cols) + + # build join + stmt = stmt.select_from(embeddings_table.join(metadata_table, join_condition)) - # filter expressions from key/value filters (may return None) - filter_expr = build_filter_expr_sa(sa_table, **cast("dict", filters)) - if filter_expr is not None: - stmt = stmt.where(filter_expr) + # split filters between embeddings and metadata tables + embeddings_filters = { + k: v for k, v in filters.items() if k in EMBEDDINGS_FILTER_COLUMNS + } + record_metadata_filters = { + k: v for k, v in filters.items() if k in METADATA_SELECT_FILTER_COLUMNS + } + + # apply embeddings filters + embeddings_filter_expr = build_filter_expr_sa( + embeddings_table, **cast("dict", embeddings_filters) + ) + if embeddings_filter_expr is not None: + stmt = stmt.where(embeddings_filter_expr) + + # apply metadata filters + record_metadata_filter_expr = build_filter_expr_sa( + metadata_table, **cast("dict", record_metadata_filters) + ) + if record_metadata_filter_expr is not None: + stmt = stmt.where(record_metadata_filter_expr) # explicit raw WHERE string if where is not None and where.strip(): From 04c9c3e07bb1d4fdd40ab1e1c9e486e536c4a4ec Mon Sep 17 00:00:00 2001 From: Graham Hukill Date: Wed, 10 Dec 2025 13:04:04 -0500 Subject: [PATCH 2/5] Bump version to 3.8.0 --- timdex_dataset_api/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/timdex_dataset_api/__init__.py b/timdex_dataset_api/__init__.py index fd66cf2..e713149 100644 --- a/timdex_dataset_api/__init__.py +++ b/timdex_dataset_api/__init__.py @@ -5,7 +5,7 @@ from timdex_dataset_api.metadata import TIMDEXDatasetMetadata from timdex_dataset_api.record import DatasetRecord -__version__ = "3.7.1" +__version__ = "3.8.0" __all__ = [ "DatasetEmbedding", From eab335c24f0a72c63d968ae7e6edcbc47ea23137 Mon Sep 17 00:00:00 2001 From: Graham Hukill Date: Thu, 11 Dec 2025 12:59:20 -0500 Subject: [PATCH 3/5] Additional dependency updates, aligning with recent hotfix patch --- Pipfile.lock | 601 +++++++++++++++++++++++++++------------------------ 1 file changed, 314 insertions(+), 287 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 864a3a0..d52d52b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "8ceaf69ba4b1d7e2e7ae78466ae19a5df32ad41ae00ae35f50fa61ee2ddf0437" + "sha256": "467c9e3ec6f2d8648123c1f636a7fc60608564040818ff632f4028e122b30f7f" }, "pipfile-spec": 6, "requires": { @@ -22,66 +22,73 @@ "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==25.4.0" }, "boto3": { "hashes": [ - "sha256:0f4089e230d55f981d67376e48cefd41c3d58c7f694480f13288e6ff7b1fefbc", - "sha256:65f0d98a3786ec729ba9b5f70448895b2d1d1f27949aa7af5cb4f39da341bbc4" + "sha256:c5cb2ada690c14e2dfa1e1c59ef7ef399c5e381f5514f1541d28310e35192300", + "sha256:eda49046c0f6a21ac159f9b2d609e5cc70d1dd019b7ac9618eec99285282b3db" ], "index": "pypi", - "version": "==1.42.4" + "markers": "python_version >= '3.9'", + "version": "==1.42.7" }, "botocore": { "hashes": [ - "sha256:c3b091fd33809f187824b6434e518b889514ded5164cb379358367c18e8b0d7d", - "sha256:d4816023492b987a804f693c2d76fb751fdc8755d49933106d69e2489c4c0f98" + "sha256:92128d56654342f026d5c20a92bf0e8b546be1eb38df2c0efc7433e8bbc39045", + "sha256:cc401b4836eae2a781efa1d1df88b2e92f9245885a6ae1bf9a6b26bc97b3efd2" ], "markers": "python_version >= '3.9'", - "version": "==1.42.4" + "version": "==1.42.7" }, "duckdb": { "hashes": [ - "sha256:0c2315b693f201787c9892f31eb9a0484d3c648edb3578a86dc8c1284dd2873a", - "sha256:125cd89dbfd40846f216032b11e5eeaf2be13ee4d6745b82413ddd213ddc4d99", - "sha256:128c97dab574a438d7c8d020670b21c68792267d88e65a7773667b556541fa9b", - "sha256:19d2c2f3cdf0242cad42e803602bbc2636706fc1d2d260ffac815ea2e3a018e8", - "sha256:20c45b4ead1ea4d23a1be1cd4f1dfc635e58b55f0dd11e38781369be6c549903", - "sha256:2d3c39429b3ce1ee33d86daa94bed75a1f5b0fcf4d66d0839a6fcee398894548", - "sha256:2e552451054534970dc999e69ca5ae5c606458548c43fb66d772117760485096", - "sha256:2f7c61617d2b1da3da5d7e215be616ad45aa3221c4b9e2c4d1c28ed09bc3c1c4", - "sha256:389fa9abe4ca37d091332a2f8c3ebd713f18e87dc4cb5e8efd3e5aa8ddf8885f", - "sha256:422be8c6bdc98366c97f464b204b81b892bf962abeae6b0184104b8233da4f19", - "sha256:43ac632f40ab1aede9b4ce3c09ea043f26f3db97b83c07c632c84ebd7f7c0f4a", - "sha256:449fa37cdefa85bf925681e551157f3cb6434ee85c8329d2f72d52e432e8810f", - "sha256:459b1855bd06a226a2838da4f14c8863fd87a62e63d414a7f7f682a7c616511a", - "sha256:4d757dae8c63eeb001517ce4cfba768f87f90628c5d22f230773c1fe0b430c5c", - "sha256:4da7aafa94800f475d287814ad91993cf1f912c16f76ff4b411769da40c4b7da", - "sha256:769440f4507c20542ae2e5b87f6c6c6d3f148c0aa8f912528f6c97e9aedf6a21", - "sha256:77db030b48321bf785767b7b1800bf657dd2584f6df0a77e05201ecd22017da2", - "sha256:7a496a04458590dcec8e928122ebe2ecbb42c3e1de4119f5461f7bf547acbe79", - "sha256:7be8c0c40f2264b91500b89c688f743e1c7764966e988f680b1f19416b00052e", - "sha256:85f0c36c1b5f378d96dd7d8c6d312317f4f547a567e8b76cacb2590a31d931f3", - "sha256:9106c7292cff824e9497233bb16867ab3bca82885a11f1b533e7ecabf8073b34", - "sha256:9356fe17af2711e0a5ace4b20a0373e03163545fd7516e0c3c40428f44597052", - "sha256:946a8374c0252db3fa41165ab9952b48adc8de06561a6b5fd62025ac700e492f", - "sha256:995ec9c1fc3ce5fbfe5950b980ede2a9d51b35fdf2e3f873ce94c22fc3355fdc", - "sha256:a456adbc3459c9dcd99052fad20bd5f8ef642be5b04d09590376b2eb3eb84f5c", - "sha256:b2d882672b61bc6117a2c524cf64ea519d2e829295951d214f04e126f1549b09", - "sha256:bdd2d808806ceeeec33ba89665a0bb707af8815f2ca40e6c4c581966c0628ba1", - "sha256:c45e0e682ee9073c36dc34d7ad8033210bfea0cab80cc98d1eca516227b35fdf", - "sha256:c5feb658ed728cfc42d6fe5ff4e2035faf438a3f10c875f3cfa39ef9e2a2c004", - "sha256:c6a21732dd52a76f1e61484c06d65800b18f57fe29e8102a7466c201a2221604", - "sha256:c6d41fea4f9038663e6b9c325075a843fd105eaff0ec3d5fe31dfa9014114c3e", - "sha256:d4af73198e56ba3bc1b2a05eaaf93d162615c225c031685f2a20ef6b2798ed33", - "sha256:de646227fc2c53101ac84e86e444e7561aa077387aca8b37052f3803ee690a17", - "sha256:df81acee3b15ecb2c72eb8f8579fb5922f6f56c71f5c8892ea3bc6fab39aa2c4", - "sha256:dfcc56a83420c0dec0b83e97a6b33addac1b7554b8828894f9d203955591218c", - "sha256:e1c80934cb15879844a752776a1ea3d1405635f307f5bb8b87c99f5a5564d33a", - "sha256:f1fac31babda2045d4cdefe6d0fd2ebdd8d4c2a333fbcc11607cfeaec202d18d" + "sha256:006aca6a6d6736c441b02ff5c7600b099bb8b7f4de094b8b062137efddce42df", + "sha256:130c6760f6c573f9c9fe9aba56adba0fab48811a4871b7b8fd667318b4a3e8da", + "sha256:16952ac05bd7e7b39946695452bf450db1ebbe387e1e7178e10f593f2ea7b9a8", + "sha256:1b35491db98ccd11d151165497c084a9d29d3dc42fc80abea2715a6c861ca43d", + "sha256:1b9b445970fd18274d5ac07a0b24c032e228f967332fb5ebab3d7db27738c0e4", + "sha256:1bb8bd5a3dd205983726185b280a211eacc9f5bc0c4d4505bec8c87ac33a8ccb", + "sha256:1e5457dda91b67258aae30fb1a0df84183a9f6cd27abac1d5536c0d876c6dfa1", + "sha256:20c88effaa557a11267706b01419c542fe42f893dee66e5a6daa5974ea2d4a46", + "sha256:23a3a077821bed1768a84ac9cbf6b6487ead33e28e62cb118bda5fb8f9e53dea", + "sha256:23b12854032c1a58d0452e2b212afa908d4ce64171862f3792ba9a596ba7c765", + "sha256:274d4a31aba63115f23e7e7b401e3e3a937f3626dc9dea820a9c7d3073f450d2", + "sha256:2b195270ff1a661f22cbd547a215baff265b7d4469a76a215c8992b5994107c3", + "sha256:2b30245375ea94ab528c87c61fc3ab3e36331180b16af92ee3a37b810a745d24", + "sha256:316711a9e852bcfe1ed6241a5f654983f67e909e290495f3562cccdf43be8180", + "sha256:366bf607088053dce845c9d24c202c04d78022436cc5d8e4c9f0492de04afbe7", + "sha256:4f868a7e6d9b37274a1aa34849ea92aa964e9bd59a5237d6c17e8540533a1e4f", + "sha256:4fef6a053a1c485292000bf0c338bba60f89d334f6a06fc76ba4085a5a322b76", + "sha256:5634e40e1e2d972e4f75bced1fbdd9e9e90faa26445c1052b27de97ee546944a", + "sha256:6302452e57aef29aae3977063810ed7b2927967b97912947b9cca45c1c21955f", + "sha256:6db124f53a3edcb32b0a896ad3519e37477f7e67bf4811cb41ab60c1ef74e4c8", + "sha256:702dabbc22b27dc5b73e7599c60deef3d8c59968527c36b391773efddd8f4cf1", + "sha256:813f189039b46877b5517f1909c7b94a8fe01b4bde2640ab217537ea0fe9b59b", + "sha256:854b79375fa618f6ffa8d84fb45cbc9db887f6c4834076ea10d20bc106f1fd90", + "sha256:8afba22c370f06b7314aa46bfed052509269e482bcfb3f7b1ea0fa17ae49ce42", + "sha256:8d080e8d1bf2d226423ec781f539c8f6b6ef3fd42a9a58a7160de0a00877a21f", + "sha256:8d53b217698a76c4957e2c807dd9295d409146f9d3d7932f372883201ba9d25a", + "sha256:90f241f25cffe7241bf9f376754a5845c74775e00e1c5731119dc88cd71e0cb2", + "sha256:9dc049ba7e906cb49ca2b6d4fbf7b6615ec3883193e8abb93f0bef2652e42dda", + "sha256:9e625b2b4d52bafa1fd0ebdb0990c3961dac8bb00e30d327185de95b68202131", + "sha256:a2813f4635f4d6681cc3304020374c46aca82758c6740d7edbc237fe3aae2744", + "sha256:a7c864df027da1ee95f0c32def67e15d02cd4a906c9c1cbae82c09c5112f526b", + "sha256:a8b0a8764e1b5dd043d168c8f749314f7a1252b5a260fa415adaa26fa3b958fd", + "sha256:aa26a7406205bc1426cee28bdfdf084f669a5686977dafa4c3ec65873989593c", + "sha256:caa2164c91f7e91befb1ffb081b3cd97a137117533aef7abe1538b03ad72e3a9", + "sha256:d0ff08388ef8b1d1a4c95c321d6c5fa11201b241036b1ee740f9d841df3d6ba2", + "sha256:de984cd24a6cbefdd6d4a349f7b9a46e583ca3e58ce10d8def0b20a6e5fcbe78", + "sha256:deab351ac43b6282a3270e3d40e3d57b3b50f472d9fd8c30975d88a31be41231", + "sha256:ef7ef15347ce97201b1b5182a5697682679b04c3374d5a01ac10ba31cf791b95", + "sha256:efa7f1191c59e34b688fcd4e588c1b903a4e4e1f4804945902cf0b20e08a9001", + "sha256:fbc63ffdd03835f660155b37a1b6db2005bcd46e5ad398b8cac141eb305d2a3d", + "sha256:fea43e03604c713e25a25211ada87d30cd2a044d8f27afab5deba26ac49e5268" ], "index": "pypi", - "version": "==1.4.2" + "markers": "python_full_version >= '3.9.0'", + "version": "==1.4.3" }, "duckdb-engine": { "hashes": [ @@ -89,6 +96,7 @@ "sha256:3aa72085e536b43faab635f487baf77ddc5750069c16a2f8d9c6c3cb6083e979" ], "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4'", "version": "==0.17.0" }, "jmespath": { @@ -176,7 +184,7 @@ "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520" ], - "markers": "python_version >= '3.12'", + "markers": "python_version >= '3.11'", "version": "==2.3.5" }, "packaging": { @@ -246,6 +254,7 @@ "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==2.3.3" }, "pyarrow": { @@ -302,6 +311,7 @@ "sha256:f963ba8c3b0199f9d6b794c90ec77545e05eadc83973897a4523c9e8d84e9340" ], "index": "pypi", + "markers": "python_version >= '3.10'", "version": "==22.0.0" }, "python-dateutil": { @@ -309,7 +319,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "pytz": { @@ -332,7 +342,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "sqlalchemy": { @@ -396,6 +406,7 @@ "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==2.0.44" }, "typing-extensions": { @@ -416,11 +427,11 @@ }, "urllib3": { "hashes": [ - "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f", - "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1" + "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", + "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd" ], - "markers": "python_version >= '3.10'", - "version": "==2.6.0" + "markers": "python_version >= '3.9'", + "version": "==2.6.2" } }, "develop": { @@ -434,35 +445,37 @@ }, "black": { "hashes": [ - "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b", - "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37", - "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0", - "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170", - "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc", - "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd", - "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda", - "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd", - "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96", - "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e", - "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac", - "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a", - "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc", - "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993", - "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2", - "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", - "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06", - "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664", - "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409", - "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170", - "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc", - "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545", - "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", - "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e", - "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c", - "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03" + "sha256:05dd459a19e218078a1f98178c13f861fe6a9a5f88fc969ca4d9b49eb1809783", + "sha256:09524b0e6af8ba7a3ffabdfc7a9922fb9adef60fed008c7cd2fc01f3048e6e6f", + "sha256:0a0953b134f9335c2434864a643c842c44fba562155c738a2a37a4d61f00cad5", + "sha256:0e509c858adf63aa61d908061b52e580c40eae0dfa72415fa47ac01b12e29baf", + "sha256:169506ba91ef21e2e0591563deda7f00030cb466e747c4b09cb0a9dae5db2f43", + "sha256:17dcc893da8d73d8f74a596f64b7c98ef5239c2cd2b053c0f25912c4494bf9ea", + "sha256:1a2f578ae20c19c50a382286ba78bfbeafdf788579b053d8e4980afb079ab9be", + "sha256:2355bbb6c3b76062870942d8cc450d4f8ac71f9c93c40122762c8784df49543f", + "sha256:252678f07f5bac4ff0d0e9b261fbb029fa530cfa206d0a636a34ab445ef8ca9d", + "sha256:274f940c147ddab4442d316b27f9e332ca586d39c85ecf59ebdea82cc9ee8892", + "sha256:31f96b7c98c1ddaeb07dc0f56c652e25bdedaac76d5b68a059d998b57c55594a", + "sha256:48ceb36c16dbc84062740049eef990bb2ce07598272e673c17d1a7720c71c828", + "sha256:51e267458f7e650afed8445dc7edb3187143003d52a1b710c7321aef22aa9655", + "sha256:546eecfe9a3a6b46f9d69d8a642585a6eaf348bcbbc4d87a19635570e02d9f4a", + "sha256:778285d9ea197f34704e3791ea9404cd6d07595745907dd2ce3da7a13627b29b", + "sha256:8d3dd9cea14bff7ddc0eb243c811cdb1a011ebb4800a5f0335a01a68654796a7", + "sha256:9678bd991cc793e81d19aeeae57966ee02909877cb65838ccffef24c3ebac08f", + "sha256:97596189949a8aad13ad12fcbb4ae89330039b96ad6742e6f6b45e75ad5cfd83", + "sha256:9ec77439ef3e34896995503865a85732c94396edcc739f302c5673a2315e1e7f", + "sha256:a05ddeb656534c3e27a05a29196c962877c83fa5503db89e68857d1161ad08a5", + "sha256:a3fa71e3b8dd9f7c6ac4d818345237dfb4175ed3bf37cd5a581dbc4c034f1ec5", + "sha256:b162653ed89eb942758efeb29d5e333ca5bb90e5130216f8369857db5955a7da", + "sha256:bc5b1c09fe3c931ddd20ee548511c64ebf964ada7e6f0763d443947fd1c603ce", + "sha256:c1f68c5eff61f226934be6b5b80296cf6939e5d2f0c2f7d543ea08b204bfaf59", + "sha256:d0cfa263e85caea2cff57d8f917f9f51adae8e20b610e2b23de35b5b11ce691a", + "sha256:d3e1b65634b0e471d07ff86ec338819e2ef860689859ef4501ab7ac290431f9b", + "sha256:f85ba1ad15d446756b4ab5f3044731bf68b777f8f9ac9cdabd2425b97cd9c4e8" ], "index": "pypi", - "version": "==25.11.0" + "markers": "python_version >= '3.10'", + "version": "==25.12.0" }, "boolean.py": { "hashes": [ @@ -473,38 +486,39 @@ }, "boto3": { "hashes": [ - "sha256:0f4089e230d55f981d67376e48cefd41c3d58c7f694480f13288e6ff7b1fefbc", - "sha256:65f0d98a3786ec729ba9b5f70448895b2d1d1f27949aa7af5cb4f39da341bbc4" + "sha256:c5cb2ada690c14e2dfa1e1c59ef7ef399c5e381f5514f1541d28310e35192300", + "sha256:eda49046c0f6a21ac159f9b2d609e5cc70d1dd019b7ac9618eec99285282b3db" ], "index": "pypi", - "version": "==1.42.4" + "markers": "python_version >= '3.9'", + "version": "==1.42.7" }, "boto3-stubs": { "extras": [ "essential" ], "hashes": [ - "sha256:b489ed82a55e71d72d2ae7aee7fedd05e22bc8836360ef9c6d55b610f3bf45d2", - "sha256:c6c2853e51b3d330fe9862ffaa38e004bede8247e79d97a89bea09df8d0c3608" + "sha256:2d3f9e10686ca7ca054b788450fcc3d505b9f74954817afd994f71742df6d883", + "sha256:e4f153103a3e67a50aa98b9141382a16d37e943aef957319fe3a48e9b4a33a5a" ], - "index": "pypi", - "version": "==1.42.4" + "markers": "python_version >= '3.9'", + "version": "==1.42.7" }, "botocore": { "hashes": [ - "sha256:c3b091fd33809f187824b6434e518b889514ded5164cb379358367c18e8b0d7d", - "sha256:d4816023492b987a804f693c2d76fb751fdc8755d49933106d69e2489c4c0f98" + "sha256:92128d56654342f026d5c20a92bf0e8b546be1eb38df2c0efc7433e8bbc39045", + "sha256:cc401b4836eae2a781efa1d1df88b2e92f9245885a6ae1bf9a6b26bc97b3efd2" ], "markers": "python_version >= '3.9'", - "version": "==1.42.4" + "version": "==1.42.7" }, "botocore-stubs": { "hashes": [ - "sha256:0b6711abe0ceffe32fa572c0c683e93d9a17b2c4cff1b47a7b48bb784fe2dbcc", - "sha256:5b8e63a1f62800945dcc824514fa0465f78ad2c8fe7a592b59f77ca19f1aa10b" + "sha256:951fc41e78e1a53b49bfe8511bc24e430eda4c689ca6033c643693e56485e69c", + "sha256:d5c9ac851e8d7ce30d25204add0e2448cb23cb5f8fbe6b5c768ea1e4471b4455" ], "markers": "python_version >= '3.9'", - "version": "==1.42.4" + "version": "==1.42.7" }, "cachecontrol": { "extras": [ @@ -612,7 +626,7 @@ "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf" ], - "markers": "python_full_version >= '3.9' and platform_python_implementation != 'PyPy'", + "markers": "python_version >= '3.9'", "version": "==2.0.0" }, "cfgv": { @@ -755,101 +769,101 @@ "toml" ], "hashes": [ - "sha256:01d24af36fedda51c2b1aca56e4330a3710f83b02a5ff3743a6b015ffa7c9384", - "sha256:04a79245ab2b7a61688958f7a855275997134bc84f4a03bc240cf64ff132abf6", - "sha256:083631eeff5eb9992c923e14b810a179798bb598e6a0dd60586819fc23be6e60", - "sha256:099d11698385d572ceafb3288a5b80fe1fc58bf665b3f9d362389de488361d3d", - "sha256:09a86acaaa8455f13d6a99221d9654df249b33937b4e212b4e5a822065f12aa7", - "sha256:159d50c0b12e060b15ed3d39f87ed43d4f7f7ad40b8a534f4dd331adbb51104a", - "sha256:172cf3a34bfef42611963e2b661302a8931f44df31629e5b1050567d6b90287d", - "sha256:22a7aade354a72dff3b59c577bfd18d6945c61f97393bc5fb7bd293a4237024b", - "sha256:24cff9d1f5743f67db7ba46ff284018a6e9aeb649b67aa1e70c396aa1b7cb23c", - "sha256:29644c928772c78512b48e14156b81255000dcfd4817574ff69def189bcb3647", - "sha256:297bc2da28440f5ae51c845a47c8175a4db0553a53827886e4fb25c66633000c", - "sha256:2fd8354ed5d69775ac42986a691fbf68b4084278710cee9d7c3eaa0c28fa982a", - "sha256:313672140638b6ddb2c6455ddeda41c6a0b208298034544cfca138978c6baed6", - "sha256:31b8b2e38391a56e3cea39d22a23faaa7c3fc911751756ef6d2621d2a9daf742", - "sha256:32b75c2ba3f324ee37af3ccee5b30458038c50b349ad9b88cee85096132a575b", - "sha256:33baadc0efd5c7294f436a632566ccc1f72c867f82833eb59820ee37dc811c6f", - "sha256:3ff651dcd36d2fea66877cd4a82de478004c59b849945446acb5baf9379a1b64", - "sha256:40c867af715f22592e0d0fb533a33a71ec9e0f73a6945f722a0c85c8c1cbe3a2", - "sha256:42435d46d6461a3b305cdfcad7cdd3248787771f53fe18305548cba474e6523b", - "sha256:459443346509476170d553035e4a3eed7b860f4fe5242f02de1010501956ce87", - "sha256:4648158fd8dd9381b5847622df1c90ff314efbfc1df4550092ab6013c238a5fc", - "sha256:47324fffca8d8eae7e185b5bb20c14645f23350f870c1649003618ea91a78941", - "sha256:473dc45d69694069adb7680c405fb1e81f60b2aff42c81e2f2c3feaf544d878c", - "sha256:4b59b501455535e2e5dde5881739897967b272ba25988c89145c12d772810ccb", - "sha256:4c589361263ab2953e3c4cd2a94db94c4ad4a8e572776ecfbad2389c626e4507", - "sha256:51777647a749abdf6f6fd8c7cffab12de68ab93aab15efc72fbbb83036c2a068", - "sha256:52ca620260bd8cd6027317bdd8b8ba929be1d741764ee765b42c4d79a408601e", - "sha256:5560c7e0d82b42eb1951e4f68f071f8017c824ebfd5a6ebe42c60ac16c6c2434", - "sha256:5734b5d913c3755e72f70bf6cc37a0518d4f4745cde760c5d8e12005e62f9832", - "sha256:583f9adbefd278e9de33c33d6846aa8f5d164fa49b47144180a0e037f0688bb9", - "sha256:58c1c6aa677f3a1411fe6fb28ec3a942e4f665df036a3608816e0847fad23296", - "sha256:5b3c889c0b8b283a24d721a9eabc8ccafcfc3aebf167e4cd0d0e23bf8ec4e339", - "sha256:5bcead88c8423e1855e64b8057d0544e33e4080b95b240c2a355334bb7ced937", - "sha256:5ea5a9f7dc8877455b13dd1effd3202e0bca72f6f3ab09f9036b1bcf728f69ac", - "sha256:5f3738279524e988d9da2893f307c2093815c623f8d05a8f79e3eff3a7a9e553", - "sha256:68b0d0a2d84f333de875666259dadf28cc67858bc8fd8b3f1eae84d3c2bec455", - "sha256:6d907ddccbca819afa2cd014bc69983b146cca2735a0b1e6259b2a6c10be1e70", - "sha256:6e1a8c066dabcde56d5d9fed6a66bc19a2883a3fe051f0c397a41fc42aedd4cc", - "sha256:6ff7651cc01a246908eac162a6a86fc0dbab6de1ad165dfb9a1e2ec660b44984", - "sha256:737c3814903be30695b2de20d22bcc5428fdae305c61ba44cdc8b3252984c49c", - "sha256:73f9e7fbd51a221818fd11b7090eaa835a353ddd59c236c57b2199486b116c6d", - "sha256:76336c19a9ef4a94b2f8dc79f8ac2da3f193f625bb5d6f51a328cd19bfc19933", - "sha256:7670d860e18b1e3ee5930b17a7d55ae6287ec6e55d9799982aa103a2cc1fa2ef", - "sha256:79a44421cd5fba96aa57b5e3b5a4d3274c449d4c622e8f76882d76635501fd13", - "sha256:7c1059b600aec6ef090721f8f633f60ed70afaffe8ecab85b59df748f24b31fe", - "sha256:8638cbb002eaa5d7c8d04da667813ce1067080b9a91099801a0053086e52b736", - "sha256:874fe69a0785d96bd066059cd4368022cebbec1a8958f224f0016979183916e6", - "sha256:8787b0f982e020adb732b9f051f3e49dd5054cebbc3f3432061278512a2b1360", - "sha256:8bb5b894b3ec09dcd6d3743229dc7f2c42ef7787dc40596ae04c0edda487371e", - "sha256:907e0df1b71ba77463687a74149c6122c3f6aac56c2510a5d906b2f368208560", - "sha256:90d58ac63bc85e0fb919f14d09d6caa63f35a5512a2205284b7816cafd21bb03", - "sha256:9157a5e233c40ce6613dead4c131a006adfda70e557b6856b97aceed01b0e27a", - "sha256:91b810a163ccad2e43b1faa11d70d3cf4b6f3d83f9fd5f2df82a32d47b648e0d", - "sha256:950411f1eb5d579999c5f66c62a40961f126fc71e5e14419f004471957b51508", - "sha256:99d5415c73ca12d558e07776bd957c4222c687b9f1d26fa0e1b57e3598bdcde8", - "sha256:9b57e2d0ddd5f0582bae5437c04ee71c46cd908e7bc5d4d0391f9a41e812dd12", - "sha256:9bb44c889fb68004e94cab71f6a021ec83eac9aeabdbb5a5a88821ec46e1da73", - "sha256:a00594770eb715854fb1c57e0dea08cce6720cfbc531accdb9850d7c7770396c", - "sha256:a1783ed5bd0d5938d4435014626568dc7f93e3cb99bc59188cc18857c47aa3c4", - "sha256:a1c59b7dc169809a88b21a936eccf71c3895a78f5592051b1af8f4d59c2b4f92", - "sha256:aa124a3683d2af98bd9d9c2bfa7a5076ca7e5ab09fdb96b81fa7d89376ae928f", - "sha256:aa7d48520a32cb21c7a9b31f81799e8eaec7239db36c3b670be0fa2403828d1d", - "sha256:b1518ecbad4e6173f4c6e6c4a46e49555ea5679bf3feda5edb1b935c7c44e8a0", - "sha256:b1aab7302a87bafebfe76b12af681b56ff446dc6f32ed178ff9c092ca776e6bc", - "sha256:b2089cc445f2dc0af6f801f0d1355c025b76c24481935303cf1af28f636688f0", - "sha256:b365adc70a6936c6b0582dc38746b33b2454148c02349345412c6e743efb646d", - "sha256:b527a08cdf15753279b7afb2339a12073620b761d79b81cbe2cdebdb43d90daa", - "sha256:bc13baf85cd8a4cfcf4a35c7bc9d795837ad809775f782f697bf630b7e200211", - "sha256:bcec6f47e4cb8a4c2dc91ce507f6eefc6a1b10f58df32cdc61dff65455031dfc", - "sha256:c406a71f544800ef7e9e0000af706b88465f3573ae8b8de37e5f96c59f689ad1", - "sha256:c5a6f20bf48b8866095c6820641e7ffbe23f2ac84a2efc218d91235e404c7777", - "sha256:c87395744f5c77c866d0f5a43d97cc39e17c7f1cb0115e54a2fe67ca75c5d14d", - "sha256:ca8ecfa283764fdda3eae1bdb6afe58bf78c2c3ec2b2edcb05a671f0bba7b3f9", - "sha256:cb2a1b6ab9fe833714a483a915de350abc624a37149649297624c8d57add089c", - "sha256:ccf3b2ede91decd2fb53ec73c1f949c3e034129d1e0b07798ff1d02ea0c8fa4a", - "sha256:ce61969812d6a98a981d147d9ac583a36ac7db7766f2e64a9d4d059c2fe29d07", - "sha256:d6c2e26b481c9159c2773a37947a9718cfdc58893029cdfb177531793e375cfc", - "sha256:d7e0d0303c13b54db495eb636bc2465b2fb8475d4c8bcec8fe4b5ca454dfbae8", - "sha256:d8842f17095b9868a05837b7b1b73495293091bed870e099521ada176aa3e00e", - "sha256:d93fbf446c31c0140208dcd07c5d882029832e8ed7891a39d6d44bd65f2316c3", - "sha256:dcbb630ab034e86d2a0f79aefd2be07e583202f41e037602d438c80044957baa", - "sha256:e0d68c1f7eabbc8abe582d11fa393ea483caf4f44b0af86881174769f185c94d", - "sha256:e0f483ab4f749039894abaf80c2f9e7ed77bbf3c737517fb88c8e8e305896a17", - "sha256:e71bba6a40883b00c6d571599b4627f50c360b3d0d02bfc658168936be74027b", - "sha256:e84da3a0fd233aeec797b981c51af1cabac74f9bd67be42458365b30d11b5291", - "sha256:e949ebf60c717c3df63adb4a1a366c096c8d7fd8472608cd09359e1bd48ef59f", - "sha256:f3433ffd541380f3a0e423cff0f4926d55b0cc8c1d160fdc3be24a4c03aa65f7", - "sha256:f7ba9da4726e446d8dd8aae5a6cd872511184a5d861de80a86ef970b5dacce3e", - "sha256:f7bbb321d4adc9f65e402c677cd1c8e4c2d0105d3ce285b51b4d87f1d5db5245", - "sha256:f999813dddeb2a56aab5841e687b68169da0d3f6fc78ccf50952fa2463746022", - "sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c", - "sha256:fdba9f15849534594f60b47c9a30bc70409b54947319a7c4fd0e8e3d8d2f355d" + "sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe", + "sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b", + "sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070", + "sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e", + "sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053", + "sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080", + "sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc", + "sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb", + "sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf", + "sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820", + "sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b", + "sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232", + "sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657", + "sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef", + "sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd", + "sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259", + "sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833", + "sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d", + "sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f", + "sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493", + "sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8", + "sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf", + "sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9", + "sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19", + "sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98", + "sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f", + "sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b", + "sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9", + "sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b", + "sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e", + "sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc", + "sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256", + "sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8", + "sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927", + "sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae", + "sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f", + "sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe", + "sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f", + "sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621", + "sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1", + "sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137", + "sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9", + "sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74", + "sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46", + "sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8", + "sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940", + "sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39", + "sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a", + "sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d", + "sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b", + "sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0", + "sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a", + "sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2", + "sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb", + "sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303", + "sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971", + "sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030", + "sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96", + "sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb", + "sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33", + "sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8", + "sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904", + "sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d", + "sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28", + "sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e", + "sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e", + "sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9", + "sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74", + "sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8", + "sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032", + "sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57", + "sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be", + "sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936", + "sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f", + "sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c", + "sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a", + "sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791", + "sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5", + "sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e", + "sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a", + "sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7", + "sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a", + "sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753", + "sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3", + "sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6", + "sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e", + "sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071", + "sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b", + "sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511", + "sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff", + "sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7", + "sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6" ], "markers": "python_version >= '3.10'", - "version": "==7.12.0" + "version": "==7.13.0" }, "coveralls": { "hashes": [ @@ -857,6 +871,7 @@ "sha256:7c21ffa2808d3052fa0cfca3842a9f3d21cc8eada02538c192d932199e5f07d4" ], "index": "pypi", + "markers": "python_version >= '3.10' and python_version < '4.0'", "version": "==4.0.2" }, "cryptography": { @@ -1002,6 +1017,7 @@ "sha256:ebe6d1d58d7d988fbf23ff8ff6d8e1622cfdb194daf4b7b73b792c4ec3b85385" ], "index": "pypi", + "markers": "python_version >= '3.11'", "version": "==9.8.0" }, "ipython-pygments-lexers": { @@ -1038,85 +1054,85 @@ }, "librt": { "hashes": [ - "sha256:02b98cb2558b32d10489abcdf5119f08b27d6cf4e587159d3fcb0a1609d98d4c", - "sha256:0a0d0c70418e0c37c040a3acace252a21e25751f3fa96084facf24783d24fd5d", - "sha256:0ce1f5863839c85c8e7e1467dd939d4af5e59bab8852852a9d8b7a9dbcdcaf2a", - "sha256:0e7a4dcb2419b766a034a62d28708a11e92d790aa6faa74913e587ccc4c2fc55", - "sha256:0fee181b2f73c14d1f80380b91945305919e409748bc386008fe56e23e9b0652", - "sha256:12753c83c2e29c7bb28627bbada0cfcf19e8225c6da98eb7c590b27743115298", - "sha256:15875129cce2377bd703557314b81c4e7bfc63fdcd8247b0c5bf7dc34a8d61b5", - "sha256:1aa6eb96952cadb861b8fc5a41832349935a5a4bd1478b8425c023ece98af72c", - "sha256:1c16a988ef540b6dba0be057c343ff7489c95080348b70b6a1fa527128cf386b", - "sha256:1d156fce27e92ebd5094ff8e9fb622d945026fd552e8eda4f0acbb58164e67b6", - "sha256:1e3f975f62352ee20a0b1071532bf91e77097a541ab6f68e8cdfc56e708bed11", - "sha256:211a312a9ab2226ecdb509087bc6a0d0f9d8550565a0d1b848576b9119c69cda", - "sha256:2471e23a12599761e2f052a84dd359ba1d2b34d018d2d8039aa0f8865ee7a563", - "sha256:263cc4beae054d088292471434af6fc710eed357161f0d45c1783830cb5332b2", - "sha256:2bdf11b510877003330fff88b71985c1d73f8710527256bada5c78d4c8c341ef", - "sha256:2c23b7ab197ee9ed29cd0b61ac1e24e4483f24612f4626833877e19b28f95935", - "sha256:350385b5f8d3f71686b4aa2181d654f01de50a0e4b11eb20fa36f5b00dc5c440", - "sha256:369cf96ba818af4d14a95ce4d00f163cfa64d800ebb5a0f54556b9cb4346d97b", - "sha256:37c9133c69adcf6229e3aecea56d1c77a79dd00f5d65e7f28c500590b4edcf4b", - "sha256:388f794cd52ed4692ec0e3b00a07a502ef879bac90fa21f6e0035422c7b117c8", - "sha256:3cd85f9b52300cc0a748a72d8eba2f7998f03e1dfb44b8db6e2ca344f175e1a9", - "sha256:43028b50350caf3f27168d7a5f824d23e3300f20eb2bcb99fe03f14568dad0fc", - "sha256:46293b0541a04909581084781aaa0c0c56d2b430a551717de2535e564f569127", - "sha256:49bf5cb376e120db09c2ab56fde3ce4d3933f496d74c749948964e11d1c7ada6", - "sha256:4ce4baf7f74a5eb676a9688cf31ec8f25835cf84a3f129b781bde55daf267cf1", - "sha256:4d601771f291cd28aaefe115b0c3105d36fdd7d0d0abcc23bb17714c17b370bb", - "sha256:4e5b64996f1f116b6ba9597a8ff9f098c240926abbd024d1bc8e2605b46f7590", - "sha256:506fd319530866802f9e63f28e3822e24a38dcf1814b5b6f54690bfdb55ee947", - "sha256:51d899c7460cb30e68f7e83f4d68915127a8c7eaada7657702287e4c542f88d4", - "sha256:645721c2462136ed2783d6ba1edeafbc8f229f7229967fdaacf5f826fba99cf9", - "sha256:654a2a2e6325fc4906200156c98e5ef898011d4ee998f8b4277d96356920703a", - "sha256:6b70ae76272f107b6492e0a135a5af150efec29abd20f7a299aa4193e74bb9a9", - "sha256:6ef7654f79590bef5cc2256ffc2e9d8fccf55752f70a45e26aaac74237ab8552", - "sha256:75c787db17786f5a732a1eaf09b04d2c43f8931efe0876e594b8be77e603a2e1", - "sha256:810d09701fc9615943a7d510b50d450fdf1e54a8917e268cf6fa907bc61cd8df", - "sha256:867c904b6748dfa212f9de8f27537f1e51f9cc7a51474a3bdafe136d00608e45", - "sha256:88011c66ef4053807e45158cce6c79f8f1a12d533b9a918a062273c57f8846b6", - "sha256:89563b5aaada1750e106d0b04953b147c07ac07507e79252413a7e2d59153990", - "sha256:90119009b757b3a611aba38e9ee163b49864825572325e2eec0080c42fc8bb69", - "sha256:912f87f7059bd07644c675a499fff1bc3d39aea324dc4a818bf1fb163ac11fe6", - "sha256:92d7d9a4ab2ac35cf3202d555125dcfa29ec55ecee10cd5b8c9de412b0ad4ce1", - "sha256:938050cb83c54cbd636e3b68df8dee488740f7de557b6d3dc77998b825d544b1", - "sha256:96715093db6f983ca9c7d8a4e36b450d7c989c3b07839bb7bc3b8be12cf601af", - "sha256:97d3b787e78e8cc1b14513747cc677d3390493871394e3da9ac50dec99e2dc43", - "sha256:99d86939d3f5be4734ff3d87923002b816e047fbe35eca731ada5ec1871afc01", - "sha256:a531d4ae278713495768030ff02fc687cc174be1bf55f5084303d470e170ba7e", - "sha256:a914759833137621c8fab73ecc0701921689f7bd29bbc34fd9cadbc6057a5261", - "sha256:af5ab2c4cf132cedba4359551c4f05ef2da00229aaae13e3f8a337171bb700d9", - "sha256:b1ed0aa6c0d97697559200f64bbf1c5f04767631d8494b2ace593f0a9353d63b", - "sha256:ba50f3f01eac1066409988a7b5dcf741a474917bdef0a645ed21525f2dae0fca", - "sha256:bbe9364d5b25f1fce27acaf695205a89ba2f3d79c668b03bde7315ba4b088b60", - "sha256:bcd71a7ab212ca325013f968d06b72bb5ff83fb190dd582aa010e9c939a67050", - "sha256:c18415a23b465fc379a4a3e6e71c28f3263a111d6a0811c53b1d50ca9e1d7642", - "sha256:c3c10fad1468457b2d13d824b7cde8946a4caa76f18fe127c7e549d1730ab271", - "sha256:ca62bc77d6e2f1ece0e141c28e2778ff79f1ca50f7824a2d6237abe9397997f5", - "sha256:ce9fabcda1b5015dd2ff368a9d2f36586eb9fee375e3ee407f18045f4c032516", - "sha256:d2af9c598b2cb88e3d0afcd5caca0fdbb322a93c9043d7c7fad758b0375a5263", - "sha256:d7884f93a210e465c793023185672816d0e94a748fd8728fb7f5cb4a7e457da7", - "sha256:d89460a3a0dc0a6621c17be4eb84747b80a2e68e8da1b8cc6c2d8fc0a642b50e", - "sha256:da5edaf3c650fa9955d7343d1e057fdfc1adb3484621847331d8f01c84de70cc", - "sha256:e20cb95262897eea692eced3398f7be6647d38244c1fa8480c0e48337aac0080", - "sha256:e565e20cb349f93a4eac2509118ed75a9520dc7d757e84035a50a3307d97e3cc", - "sha256:e92323133242ff29eec97538f5d1421e8b96abb3212a07b9c6cea514dd58ddba", - "sha256:e95d45bfa4f207a9117ae7fb60c5cb0308eb77a924151a0b9a7d2fb70d8aec14", - "sha256:eab63367bdb304e87d108cfd078b0d9bfa62f4fe3e5daf9afc5e159676cac15b", - "sha256:ec5235ce0f0ab7f3006c5ea9b673d2168030911b7d3a73f751a809e12c5ae54f", - "sha256:ed2f2d991efb60218502b1a32f666cebb33deb904a176e8c36fcc8f7061f49b9", - "sha256:ee41eff32c0d1c08f50c32cdd2c2314366cea3912074b68db95df8cc4015eab3", - "sha256:f312a192534cf162306a9f00f6d5d6f432f9f8d07f9f726111de477cec8d3ddf", - "sha256:f32955c82ac5372f8d841fbe4d828f3538ef26f86ab7a275041100122513e5bf", - "sha256:f5771fd63fe30dfbc94ac08eb6f590fb74964d90aba14c06ac94ed40cbff9f99", - "sha256:f7ab208a759db0b607c785b8970d51ad101ebec7de4b13fbedafc4207508df85", - "sha256:f8054546544f70cd27cb5e0a73c8de271c9dcc664741399acd584134310e312a", - "sha256:f86024966f5bd4f962cbd54a4ad5d0e435fd3686f7edcd78c5aa84bb9427fa16", - "sha256:fcfe89d3bb67df63e2cb1e00a379bbc73720b43a4b8dd94ac4ca87ef32ec0f4d", - "sha256:fffb19b11f49c516b9cc4935e5ae01b07dfaf77b61f951c55ac9f51d3e9304aa" + "sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a", + "sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3", + "sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678", + "sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93", + "sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc", + "sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e", + "sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec", + "sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7", + "sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712", + "sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5", + "sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71", + "sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f", + "sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a", + "sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2", + "sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809", + "sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18", + "sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093", + "sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e", + "sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a", + "sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292", + "sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798", + "sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65", + "sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec", + "sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe", + "sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806", + "sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42", + "sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0", + "sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed", + "sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b", + "sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70", + "sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e", + "sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720", + "sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af", + "sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0", + "sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218", + "sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b", + "sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea", + "sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c", + "sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e", + "sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f", + "sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a", + "sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90", + "sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055", + "sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e", + "sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910", + "sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207", + "sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a", + "sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b", + "sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b", + "sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a", + "sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed", + "sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7", + "sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d", + "sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b", + "sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7", + "sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e", + "sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258", + "sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e", + "sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0", + "sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd", + "sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010", + "sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5", + "sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620", + "sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f", + "sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e", + "sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60", + "sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b", + "sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445", + "sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a", + "sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a", + "sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f", + "sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135", + "sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51", + "sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3", + "sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c", + "sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc" ], "markers": "python_version >= '3.9'", - "version": "==0.7.0" + "version": "==0.7.3" }, "license-expression": { "hashes": [ @@ -1251,6 +1267,7 @@ "sha256:b65aa8fc9032c5c574415451e14fd7da4e43fd50b8bdcb5f10289ad382c25bcf" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==5.1.18" }, "msgpack": { @@ -1363,6 +1380,7 @@ "sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==1.19.0" }, "mypy-boto3-cloudformation": { @@ -1383,11 +1401,11 @@ }, "mypy-boto3-ec2": { "hashes": [ - "sha256:4a9844dae662696979870a4ac5d9d26de30c635eeadb5795ec04c18475b05ae3", - "sha256:e19da3e0b316024d5d74db4ceab5cf529678e863f1986f936e04d58b67c40b34" + "sha256:1b54eaa6403c10677496f7dccdd0c2911533b1f26e4a5732af56fbd31141796f", + "sha256:bc89dcbd7057bd58fd4dc9956ae4d581c35c908c4920318d954ec41fe507ee37" ], "markers": "python_version >= '3.9'", - "version": "==1.42.3" + "version": "==1.42.5" }, "mypy-boto3-lambda": { "hashes": [ @@ -1399,11 +1417,11 @@ }, "mypy-boto3-rds": { "hashes": [ - "sha256:0a15bbea23e22cb016fa6fa49d5913b398584aba49d83f11f555a295aac3faf0", - "sha256:656e95c307b82cff92d6ece722aa3960ea82f33053e043aa0bb7929609843636" + "sha256:4cea697b63f7615a741dc9928acfbb5d956018e5ca73959b4031adfaf31921e7", + "sha256:e9a8679d1a61424d31327ee0b1f989571e21ecd6de3cbe7f9dd39174d528abdc" ], "markers": "python_version >= '3.9'", - "version": "==1.42.3" + "version": "==1.42.5" }, "mypy-boto3-s3": { "hashes": [ @@ -1514,7 +1532,7 @@ "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520" ], - "markers": "python_version >= '3.12'", + "markers": "python_version >= '3.11'", "version": "==2.3.5" }, "packageurl-python": { @@ -1539,6 +1557,7 @@ "sha256:eb5c9b6138bd8492fd74a47b09c9497341a278fcfbc8633ea4b35b230ebf4be5" ], "index": "pypi", + "markers": "python_version >= '3.10'", "version": "==2.3.3.251201" }, "parso": { @@ -1587,6 +1606,7 @@ "sha256:427ea5bf61d1d06b98b1ae29b7feacc00288a2eced52c9c58ceed5253ef6c2a4" ], "index": "pypi", + "markers": "python_version >= '3.10'", "version": "==2.10.0" }, "pip-requirements-parser": { @@ -1619,6 +1639,7 @@ "sha256:dc5a065e932b19fc1d4c653c6939068fe54325af8e741e74e88db4d28a4dd66b" ], "index": "pypi", + "markers": "python_version >= '3.10'", "version": "==4.5.0" }, "prompt-toolkit": { @@ -1705,22 +1726,24 @@ "sha256:f963ba8c3b0199f9d6b794c90ec77545e05eadc83973897a4523c9e8d84e9340" ], "index": "pypi", + "markers": "python_version >= '3.10'", "version": "==22.0.0" }, "pyarrow-stubs": { "hashes": [ - "sha256:09da6809f37cc6dbbbf59c9c8e42269290d19ac09f65d2b3456c671f1c3a8765", - "sha256:c0885c09f63e2be51bacb6b0e20b39083f43da1cb214d31e406f982e874bcb5a" + "sha256:a53793149bcbf41670acb8cd843645e3bf0469e4aa035824adda61c48fa900c6", + "sha256:eab02b02d4d74d86619b7f7b9fe6e7ddfe425cedf8c31aa4c7fd33cdb3b189be" ], "index": "pypi", - "version": "==20.0.0.20251107" + "markers": "python_version >= '3.9' and python_version < '4'", + "version": "==20.0.0.20251209" }, "pycparser": { "hashes": [ "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934" ], - "markers": "implementation_name != 'PyPy'", + "markers": "python_version >= '3.8'", "version": "==2.23" }, "pygments": { @@ -1741,11 +1764,12 @@ }, "pytest": { "hashes": [ - "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8", - "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad" + "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", + "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11" ], "index": "pypi", - "version": "==9.0.1" + "markers": "python_version >= '3.10'", + "version": "==9.0.2" }, "pytest-mock": { "hashes": [ @@ -1753,6 +1777,7 @@ "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==3.15.1" }, "python-dateutil": { @@ -1760,7 +1785,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "pytokens": { @@ -1897,6 +1922,7 @@ "sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.14.8" }, "s3transfer": { @@ -1913,6 +1939,7 @@ "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==80.9.0" }, "six": { @@ -1920,7 +1947,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.17.0" }, "sortedcontainers": { @@ -2019,11 +2046,11 @@ }, "types-s3transfer": { "hashes": [ - "sha256:1e617b14a9d3ce5be565f4b187fafa1d96075546b52072121f8fda8e0a444aed", - "sha256:43a523e0c43a88e447dfda5f4f6b63bf3da85316fdd2625f650817f2b170b5f7" + "sha256:1c0cd111ecf6e21437cb410f5cddb631bfb2263b77ad973e79b9c6d0cb24e0ef", + "sha256:b4636472024c5e2b62278c5b759661efeb52a81851cde5f092f24100b1ecb443" ], - "markers": "python_version >= '3.8'", - "version": "==0.15.0" + "markers": "python_version >= '3.9'", + "version": "==0.16.0" }, "typing-extensions": { "hashes": [ @@ -2035,11 +2062,11 @@ }, "urllib3": { "hashes": [ - "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f", - "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1" + "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", + "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd" ], - "markers": "python_version >= '3.10'", - "version": "==2.6.0" + "markers": "python_version >= '3.9'", + "version": "==2.6.2" }, "virtualenv": { "hashes": [ From e498931536bee96f07a94bcd645aa0f834fa25d9 Mon Sep 17 00:00:00 2001 From: Graham Hukill Date: Mon, 15 Dec 2025 16:21:44 -0500 Subject: [PATCH 4/5] Consolidate metadata join statements for embeddings --- .DS_Store | Bin 0 -> 8196 bytes timdex_dataset_api/embeddings.py | 14 ++++++-------- 2 files changed, 6 insertions(+), 8 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ead1605f5a4dfc674cb4726d082aa69af4fac679 GIT binary patch literal 8196 zcmeHMTWl0n7(U;$v@=s`r$9^D39zA&OKGJoP%g!=yQN5wr7@8|ihB!w;2BtiC!6_}qbc{5qt&EBOQ zHADzR2t)`(2t)`(2s{V~(4EbbyuiILdZRKzAVT1wM1Y?UamrjKLOCmBaCA@+ga9OY z2oNNCrZ^z5iH9-~%2^=;Q+lU}9uS%$3^5?gsXxxuNhU%$E2J=I5atZw$Ot181f!E( zJWyvy2pN?T0ucgtBf#CKhPga)XEPP?`<3jBZFzoY=S@ge)r)FsmJPU$pRpV>9~fAMNh(w0mSec3ez)KlUSOLP9kL=T zX)Sj4Y)4mDS9g1SThEqr?eViax;xwBTQ>KcJEzD^t($sB(?IRRee)lm7><^hsM>zX>Cc7rhZ_?w_L|NWad4RX|2JdC644==V0FC z{o^^;E=)UKT5HT@>|DXl_-3DNC#`2pZ^AcE`}}FrbMyW{pqSRQf@hAJq-Pb)LDKdn zEP5SRTUIe~D3=#Etz5HqW9QbLy9bB&9h|Fwq(N(3qN*EHgh=vJC&k;f$9v z9m8^tj~6Y^%Gzei$xNG#s8N);`sU>=D`L97km^JsYn>`s{u!-RmV+@?t=82kgC@7% zHTWoo_OVRwq0w7c>-rJiGmtl_G(v-Q>vc8d(HgW&sMy}2s;QH-!J5aXK&D;Ysy=3C zvZk#WiWsM7o2ri&1-9DWu(5ZSs!!zH>1kS`*NFD8Ink%jPJsGgFwFJ;;# z%PCsKYua={Z@D$mCiW*lR%uOihTA2x73?v(nTFXEGs$nxvkUBXc8R^uK4I6{XY31h zi+#(!XFsqX*)Qxi`vcXeM*}o8B8GL?fHrKz79`Mze(c3Tj3S8?jv@;KCXT^H0VSNq z89avM;z^9UbMH`wV4&dmvDQdgE8tN=U&uGNTYTdZ9s|I(zOs&0yPDda_3m8iDGwkom)QQ5BURLGySYEgY$-K}sJ z*H}=G^~VNf@(E4;_hkKmU18VQ4K_z){fYg|er10_CWkN|Cw5^7 zdoYX%Akt4bu!*N*1!-J0^p2aLt_B@^^!oGx;@d{qWCA@*R@ODVu5Ajh2 z8K0a_MqI5VV=04$0 L-TwgrAJXD)ZEqux literal 0 HcmV?d00001 diff --git a/timdex_dataset_api/embeddings.py b/timdex_dataset_api/embeddings.py index ba8969b..d9404bc 100644 --- a/timdex_dataset_api/embeddings.py +++ b/timdex_dataset_api/embeddings.py @@ -411,13 +411,6 @@ def _build_query( embeddings_table = self.get_sa_table(table) metadata_table = self.timdex_dataset.metadata.get_sa_table("records") - # create SQL statement with join to metadata.records - join_condition = and_( - embeddings_table.c.timdex_record_id == metadata_table.c.timdex_record_id, - embeddings_table.c.run_id == metadata_table.c.run_id, - embeddings_table.c.run_record_offset == metadata_table.c.run_record_offset, - ) - # select specific columns or default to all from embeddings + metadata if columns: embeddings_cols = [] @@ -441,7 +434,12 @@ def _build_query( ] stmt = select(*embeddings_cols, *metadata_cols) - # build join + # create SQL statement with join to metadata.records + join_condition = and_( + embeddings_table.c.timdex_record_id == metadata_table.c.timdex_record_id, + embeddings_table.c.run_id == metadata_table.c.run_id, + embeddings_table.c.run_record_offset == metadata_table.c.run_record_offset, + ) stmt = stmt.select_from(embeddings_table.join(metadata_table, join_condition)) # split filters between embeddings and metadata tables From b125772267651c9692176eb34a06009f0e748090 Mon Sep 17 00:00:00 2001 From: Graham Hukill Date: Tue, 16 Dec 2025 09:15:13 -0500 Subject: [PATCH 5/5] Rename timestamp to embeddings_timestamp Why these changes are being introduced: A PR discussion pointed out that `timestamp` was the only column in the new embeddings schema that, for columns unique to this schema, doesn't prefix with `embeddings_`. There was some discussion that for any of those columns it's implied they are part of the embeddings schema so the `embeddings_` prefix is not necessary. This would hold true in a pure SQL world with tables and views acting like namespaces. But at the level of this python library, where we support quite a bit of kwargs filtering of read methods, that kind of namespacing is awkward. We would like to be able to filter by `run_timestamp` or `embeddings_timestamp`, or in the future maybe `fulltext_timestamp`. Being verbose with our columns names simplifies this a bit. How this addresses that need: Renames the column `timestamp` to `embedding_timestamp` in the embeddings schema. Side effects of this change: * The CLI timdex-embeddings will need an update to what columns it writes to Relevant ticket(s): * https://mitlibraries.atlassian.net/browse/USE-143 * https://mitlibraries.atlassian.net/browse/USE-288 --- tests/test_embeddings.py | 22 +++++++++++----------- tests/utils.py | 12 ++++++------ timdex_dataset_api/embeddings.py | 24 ++++++++++++------------ 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/test_embeddings.py b/tests/test_embeddings.py index 78a5bf4..09a22c4 100644 --- a/tests/test_embeddings.py +++ b/tests/test_embeddings.py @@ -31,7 +31,7 @@ def test_dataset_embedding_init(): "run_record_offset": 0, "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", "embedding_strategy": "full_record", - "timestamp": "2024-12-01T10:00:00+00:00", + "embedding_timestamp": "2024-12-01T10:00:00+00:00", "embedding_vector": [0.1, 0.2, 0.3], "embedding_object": json.dumps( {"token1": 0.1, "token2": 0.2, "token3": 0.3} @@ -41,7 +41,7 @@ def test_dataset_embedding_init(): assert embedding assert embedding.timdex_record_id == "alma:123" - assert embedding.timestamp == datetime(2024, 12, 1, 10, 0, tzinfo=UTC) + assert embedding.embedding_timestamp == datetime(2024, 12, 1, 10, 0, tzinfo=UTC) assert embedding.embedding_object == b'{"token1": 0.1, "token2": 0.2, "token3": 0.3}' @@ -52,7 +52,7 @@ def test_dataset_embedding_date_properties(): run_record_offset=0, embedding_model="sentence-transformers/all-MiniLM-L6-v2", embedding_strategy="full_record", - timestamp="2024-12-01T10:00:00+00:00", + embedding_timestamp="2024-12-01T10:00:00+00:00", embedding_vector=[0.1, 0.2, 0.3], ) @@ -66,7 +66,7 @@ def test_dataset_embedding_to_dict(): "run_record_offset": 0, "embedding_model": "sentence-transformers/all-MiniLM-L6-v2", "embedding_strategy": "full_record", - "timestamp": "2024-12-01T10:00:00+00:00", + "embedding_timestamp": "2024-12-01T10:00:00+00:00", "embedding_vector": [0.1, 0.2, 0.3], "embedding_object": None, } @@ -352,14 +352,14 @@ def test_current_embeddings_view_handles_duplicate_run_embeddings( # first embeddings run for run "lemon-2" td.embeddings.write( generate_sample_embeddings_for_run( - td, run_id="lemon-2", timestamp="2025-08-02T00:00:00+00:00" + td, run_id="lemon-2", embedding_timestamp="2025-08-02T00:00:00+00:00" ) ) # second embeddings run for run "lemon-2" with a later timestamp td.embeddings.write( generate_sample_embeddings_for_run( - td, run_id="lemon-2", timestamp="2025-08-03T00:00:00+00:00" + td, run_id="lemon-2", embedding_timestamp="2025-08-03T00:00:00+00:00" ) ) @@ -372,7 +372,7 @@ def test_current_embeddings_view_handles_duplicate_run_embeddings( assert len(all_lemon_2) == 10 # verify both timestamps exist - unique_timestamps = all_lemon_2["timestamp"].unique() + unique_timestamps = all_lemon_2["embedding_timestamp"].unique() assert len(unique_timestamps) == 2 # query current_embeddings for lemon source @@ -392,8 +392,8 @@ def test_current_embeddings_view_handles_duplicate_run_embeddings( assert (lemon_2_result["run_date"] == date(2025, 8, 2)).all() # all lemon-2 current embeddings should have the later embedding timestamp - max_timestamp = all_lemon_2["timestamp"].max() - assert (lemon_2_result["timestamp"] == max_timestamp).all() + max_timestamp = all_lemon_2["embedding_timestamp"].max() + assert (lemon_2_result["embedding_timestamp"] == max_timestamp).all() def test_embeddings_view_includes_all_embeddings(timdex_dataset_for_embeddings_views): @@ -405,14 +405,14 @@ def test_embeddings_view_includes_all_embeddings(timdex_dataset_for_embeddings_v # write embeddings for lemon-2 (first time) with explicit timestamp td.embeddings.write( generate_sample_embeddings_for_run( - td, run_id="lemon-2", timestamp="2025-08-02T00:00:00+00:00" + td, run_id="lemon-2", embedding_timestamp="2025-08-02T00:00:00+00:00" ) ) # write embeddings for lemon-2 again with later timestamp td.embeddings.write( generate_sample_embeddings_for_run( - td, run_id="lemon-2", timestamp="2025-08-03T00:00:00+00:00" + td, run_id="lemon-2", embedding_timestamp="2025-08-03T00:00:00+00:00" ) ) diff --git a/tests/utils.py b/tests/utils.py index 8f6e783..850a6fc 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -68,7 +68,7 @@ def generate_sample_embeddings( embedding_model: str | None = "super-org/amazing-model", embedding_strategy: str | None = "full_record", run_id: str | None = None, - timestamp: str | None = "2024-12-01T00:00:00+00:00", + embedding_timestamp: str | None = "2024-12-01T00:00:00+00:00", ) -> Iterator[DatasetEmbedding]: """Generate sample DatasetEmbeddings.""" if not run_id: @@ -90,7 +90,7 @@ def generate_sample_embeddings( run_record_offset=x, embedding_model=embedding_model, embedding_strategy=embedding_strategy, - timestamp=timestamp, + embedding_timestamp=embedding_timestamp, embedding_vector=embedding_vector, embedding_object=embedding_object, ) @@ -101,7 +101,7 @@ def generate_sample_embeddings_for_run( run_id: str, embedding_model: str | None = "super-org/amazing-model", embedding_strategy: str | None = "full_record", - timestamp: str | None = None, + embedding_timestamp: str | None = None, embedding_dimensions: int = 3, ) -> Iterator[DatasetEmbedding]: """Generate sample DatasetEmbeddings for a given ETL run.""" @@ -114,8 +114,8 @@ def generate_sample_embeddings_for_run( """ ).to_df() - if not timestamp: - timestamp = records_metadata.iloc[0].run_timestamp.isoformat() + if not embedding_timestamp: + embedding_timestamp = records_metadata.iloc[0].run_timestamp.isoformat() for _idx, record in records_metadata.iterrows(): embedding_vector = [random.random() for _ in range(embedding_dimensions)] @@ -131,5 +131,5 @@ def generate_sample_embeddings_for_run( embedding_strategy=embedding_strategy, embedding_vector=embedding_vector, embedding_object=embedding_object, - timestamp=timestamp, + embedding_timestamp=embedding_timestamp, ) diff --git a/timdex_dataset_api/embeddings.py b/timdex_dataset_api/embeddings.py index d9404bc..00655ff 100644 --- a/timdex_dataset_api/embeddings.py +++ b/timdex_dataset_api/embeddings.py @@ -31,7 +31,7 @@ pa.field("timdex_record_id", pa.string()), pa.field("run_id", pa.string()), pa.field("run_record_offset", pa.int32()), - pa.field("timestamp", pa.timestamp("us", tz="UTC")), + pa.field("embedding_timestamp", pa.timestamp("us", tz="UTC")), pa.field("embedding_model", pa.string()), pa.field("embedding_strategy", pa.string()), pa.field("embedding_vector", pa.list_(pa.float32())), @@ -47,7 +47,7 @@ "timdex_record_id", "run_id", "run_record_offset", - "timestamp", + "embedding_timestamp", "embedding_model", "embedding_strategy", } @@ -67,7 +67,7 @@ class EmbeddingsFilters(TypedDict, total=False): timdex_record_id: str run_id: str run_record_offset: int - timestamp: str | datetime + embedding_timestamp: str | datetime embedding_model: str embedding_strategy: str # record metadata columns @@ -92,7 +92,7 @@ class DatasetEmbedding: embedding_strategy: Strategy used to create embedding - this correlates to a transformation strategy in the timdex-embeddings CLI application, e.g. "full_record" - timestamp: Timestamp when embedding was created + embedding_timestamp: Timestamp when embedding was created embedding_vector: Numerical vector representation of embedding - preferred form for storing embedding as a numerical array embedding_object: Object representation of the embedding @@ -105,7 +105,7 @@ class DatasetEmbedding: run_record_offset: int = field() embedding_model: str = field() embedding_strategy: str = field() - timestamp: datetime = field( # type: ignore[assignment] + embedding_timestamp: datetime = field( # type: ignore[assignment] converter=datetime_iso_parse, default=attrs.Factory(lambda: datetime.now(tz=UTC).isoformat()), ) @@ -114,15 +114,15 @@ class DatasetEmbedding: @property def year(self) -> str: - return self.timestamp.strftime("%Y") + return self.embedding_timestamp.strftime("%Y") @property def month(self) -> str: - return self.timestamp.strftime("%m") + return self.embedding_timestamp.strftime("%m") @property def day(self) -> str: - return self.timestamp.strftime("%d") + return self.embedding_timestamp.strftime("%d") def to_dict( self, @@ -232,7 +232,7 @@ def _create_current_embeddings_view(self, conn: DuckDBPyConnection) -> None: create or replace view data.current_embeddings as ( with - -- CTE of embeddings ranked by timestamp + -- CTE of embeddings ranked by embedding_timestamp ce_ranked_embeddings as ( select @@ -240,7 +240,7 @@ def _create_current_embeddings_view(self, conn: DuckDBPyConnection) -> None: row_number() over ( partition by timdex_record_id, embedding_strategy order by - timestamp desc nulls last, + embedding_timestamp desc nulls last, run_record_offset desc nulls last ) as rn from data.embeddings @@ -269,7 +269,7 @@ def _create_current_run_embeddings_view(self, conn: DuckDBPyConnection) -> None: create or replace view data.current_run_embeddings as ( with - -- CTE of embeddings ranked by timestamp + -- CTE of embeddings ranked by embedding_timestamp ce_ranked_embeddings as ( select @@ -277,7 +277,7 @@ def _create_current_run_embeddings_view(self, conn: DuckDBPyConnection) -> None: row_number() over ( partition by timdex_record_id, run_id, embedding_strategy order by - timestamp desc nulls last, + embedding_timestamp desc nulls last, run_id desc nulls last, run_record_offset desc nulls last ) as rn