diff --git a/poetry.lock b/poetry.lock index e8f7cbb97..0a7e6c674 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. [[package]] name = "agate" @@ -47,87 +47,87 @@ files = [ [[package]] name = "aiohttp" -version = "3.11.10" +version = "3.11.11" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.9" files = [ - {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d"}, - {file = "aiohttp-3.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f"}, - {file = "aiohttp-3.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df"}, - {file = "aiohttp-3.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767"}, - {file = "aiohttp-3.11.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d"}, - {file = "aiohttp-3.11.10-cp310-cp310-win32.whl", hash = "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91"}, - {file = "aiohttp-3.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33"}, - {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b"}, - {file = "aiohttp-3.11.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1"}, - {file = "aiohttp-3.11.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0"}, - {file = "aiohttp-3.11.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52"}, - {file = "aiohttp-3.11.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"}, - {file = "aiohttp-3.11.10-cp311-cp311-win32.whl", hash = "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4"}, - {file = "aiohttp-3.11.10-cp311-cp311-win_amd64.whl", hash = "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec"}, - {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf"}, - {file = "aiohttp-3.11.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138"}, - {file = "aiohttp-3.11.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b"}, - {file = "aiohttp-3.11.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9"}, - {file = "aiohttp-3.11.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc"}, - {file = "aiohttp-3.11.10-cp312-cp312-win32.whl", hash = "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985"}, - {file = "aiohttp-3.11.10-cp312-cp312-win_amd64.whl", hash = "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408"}, - {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816"}, - {file = "aiohttp-3.11.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf"}, - {file = "aiohttp-3.11.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99"}, - {file = "aiohttp-3.11.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60"}, - {file = "aiohttp-3.11.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836"}, - {file = "aiohttp-3.11.10-cp313-cp313-win32.whl", hash = "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c"}, - {file = "aiohttp-3.11.10-cp313-cp313-win_amd64.whl", hash = "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6"}, - {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf"}, - {file = "aiohttp-3.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f"}, - {file = "aiohttp-3.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf"}, - {file = "aiohttp-3.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1"}, - {file = "aiohttp-3.11.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4"}, - {file = "aiohttp-3.11.10-cp39-cp39-win32.whl", hash = "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be"}, - {file = "aiohttp-3.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74"}, - {file = "aiohttp-3.11.10.tar.gz", hash = "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a60804bff28662cbcf340a4d61598891f12eea3a66af48ecfdc975ceec21e3c8"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b4fa1cb5f270fb3eab079536b764ad740bb749ce69a94d4ec30ceee1b5940d5"}, + {file = "aiohttp-3.11.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:731468f555656767cda219ab42e033355fe48c85fbe3ba83a349631541715ba2"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb23d8bb86282b342481cad4370ea0853a39e4a32a0042bb52ca6bdde132df43"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f047569d655f81cb70ea5be942ee5d4421b6219c3f05d131f64088c73bb0917f"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7659baae9ccf94ae5fe8bfaa2c7bc2e94d24611528395ce88d009107e00c6d"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af01e42ad87ae24932138f154105e88da13ce7d202a6de93fafdafb2883a00ef"}, + {file = "aiohttp-3.11.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5854be2f3e5a729800bac57a8d76af464e160f19676ab6aea74bde18ad19d438"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6526e5fb4e14f4bbf30411216780c9967c20c5a55f2f51d3abd6de68320cc2f3"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:85992ee30a31835fc482468637b3e5bd085fa8fe9392ba0bdcbdc1ef5e9e3c55"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:88a12ad8ccf325a8a5ed80e6d7c3bdc247d66175afedbe104ee2aaca72960d8e"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0a6d3fbf2232e3a08c41eca81ae4f1dff3d8f1a30bae415ebe0af2d2458b8a33"}, + {file = "aiohttp-3.11.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84a585799c58b795573c7fa9b84c455adf3e1d72f19a2bf498b54a95ae0d194c"}, + {file = "aiohttp-3.11.11-cp310-cp310-win32.whl", hash = "sha256:bfde76a8f430cf5c5584553adf9926534352251d379dcb266ad2b93c54a29745"}, + {file = "aiohttp-3.11.11-cp310-cp310-win_amd64.whl", hash = "sha256:0fd82b8e9c383af11d2b26f27a478640b6b83d669440c0a71481f7c865a51da9"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ba74ec819177af1ef7f59063c6d35a214a8fde6f987f7661f4f0eecc468a8f76"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4af57160800b7a815f3fe0eba9b46bf28aafc195555f1824555fa2cfab6c1538"}, + {file = "aiohttp-3.11.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ffa336210cf9cd8ed117011085817d00abe4c08f99968deef0013ea283547204"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81b8fe282183e4a3c7a1b72f5ade1094ed1c6345a8f153506d114af5bf8accd9"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af41686ccec6a0f2bdc66686dc0f403c41ac2089f80e2214a0f82d001052c03"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70d1f9dde0e5dd9e292a6d4d00058737052b01f3532f69c0c65818dac26dc287"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:249cc6912405917344192b9f9ea5cd5b139d49e0d2f5c7f70bdfaf6b4dbf3a2e"}, + {file = "aiohttp-3.11.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0eb98d90b6690827dcc84c246811feeb4e1eea683c0eac6caed7549be9c84665"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec82bf1fda6cecce7f7b915f9196601a1bd1a3079796b76d16ae4cce6d0ef89b"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9fd46ce0845cfe28f108888b3ab17abff84ff695e01e73657eec3f96d72eef34"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:bd176afcf8f5d2aed50c3647d4925d0db0579d96f75a31e77cbaf67d8a87742d"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ec2aa89305006fba9ffb98970db6c8221541be7bee4c1d027421d6f6df7d1ce2"}, + {file = "aiohttp-3.11.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:92cde43018a2e17d48bb09c79e4d4cb0e236de5063ce897a5e40ac7cb4878773"}, + {file = "aiohttp-3.11.11-cp311-cp311-win32.whl", hash = "sha256:aba807f9569455cba566882c8938f1a549f205ee43c27b126e5450dc9f83cc62"}, + {file = "aiohttp-3.11.11-cp311-cp311-win_amd64.whl", hash = "sha256:ae545f31489548c87b0cced5755cfe5a5308d00407000e72c4fa30b19c3220ac"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e595c591a48bbc295ebf47cb91aebf9bd32f3ff76749ecf282ea7f9f6bb73886"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ea1b59dc06396b0b424740a10a0a63974c725b1c64736ff788a3689d36c02d2"}, + {file = "aiohttp-3.11.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8811f3f098a78ffa16e0ea36dffd577eb031aea797cbdba81be039a4169e242c"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7227b87a355ce1f4bf83bfae4399b1f5bb42e0259cb9405824bd03d2f4336a"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d40f9da8cabbf295d3a9dae1295c69975b86d941bc20f0a087f0477fa0a66231"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ffb3dc385f6bb1568aa974fe65da84723210e5d9707e360e9ecb51f59406cd2e"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8f5f7515f3552d899c61202d99dcb17d6e3b0de777900405611cd747cecd1b8"}, + {file = "aiohttp-3.11.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3499c7ffbfd9c6a3d8d6a2b01c26639da7e43d47c7b4f788016226b1e711caa8"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8e2bf8029dbf0810c7bfbc3e594b51c4cc9101fbffb583a3923aea184724203c"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b6212a60e5c482ef90f2d788835387070a88d52cf6241d3916733c9176d39eab"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d119fafe7b634dbfa25a8c597718e69a930e4847f0b88e172744be24515140da"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:6fba278063559acc730abf49845d0e9a9e1ba74f85f0ee6efd5803f08b285853"}, + {file = "aiohttp-3.11.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:92fc484e34b733704ad77210c7957679c5c3877bd1e6b6d74b185e9320cc716e"}, + {file = "aiohttp-3.11.11-cp312-cp312-win32.whl", hash = "sha256:9f5b3c1ed63c8fa937a920b6c1bec78b74ee09593b3f5b979ab2ae5ef60d7600"}, + {file = "aiohttp-3.11.11-cp312-cp312-win_amd64.whl", hash = "sha256:1e69966ea6ef0c14ee53ef7a3d68b564cc408121ea56c0caa2dc918c1b2f553d"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:541d823548ab69d13d23730a06f97460f4238ad2e5ed966aaf850d7c369782d9"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:929f3ed33743a49ab127c58c3e0a827de0664bfcda566108989a14068f820194"}, + {file = "aiohttp-3.11.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0882c2820fd0132240edbb4a51eb8ceb6eef8181db9ad5291ab3332e0d71df5f"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b63de12e44935d5aca7ed7ed98a255a11e5cb47f83a9fded7a5e41c40277d104"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa54f8ef31d23c506910c21163f22b124facb573bff73930735cf9fe38bf7dff"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a344d5dc18074e3872777b62f5f7d584ae4344cd6006c17ba12103759d407af3"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7fb429ab1aafa1f48578eb315ca45bd46e9c37de11fe45c7f5f4138091e2f1"}, + {file = "aiohttp-3.11.11-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c341c7d868750e31961d6d8e60ff040fb9d3d3a46d77fd85e1ab8e76c3e9a5c4"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed9ee95614a71e87f1a70bc81603f6c6760128b140bc4030abe6abaa988f1c3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:de8d38f1c2810fa2a4f1d995a2e9c70bb8737b18da04ac2afbf3971f65781d87"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a9b7371665d4f00deb8f32208c7c5e652059b0fda41cf6dbcac6114a041f1cc2"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:620598717fce1b3bd14dd09947ea53e1ad510317c85dda2c9c65b622edc96b12"}, + {file = "aiohttp-3.11.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf8d9bfee991d8acc72d060d53860f356e07a50f0e0d09a8dfedea1c554dd0d5"}, + {file = "aiohttp-3.11.11-cp313-cp313-win32.whl", hash = "sha256:9d73ee3725b7a737ad86c2eac5c57a4a97793d9f442599bea5ec67ac9f4bdc3d"}, + {file = "aiohttp-3.11.11-cp313-cp313-win_amd64.whl", hash = "sha256:c7a06301c2fb096bdb0bd25fe2011531c1453b9f2c163c8031600ec73af1cc99"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3e23419d832d969f659c208557de4a123e30a10d26e1e14b73431d3c13444c2e"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21fef42317cf02e05d3b09c028712e1d73a9606f02467fd803f7c1f39cc59add"}, + {file = "aiohttp-3.11.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1f21bb8d0235fc10c09ce1d11ffbd40fc50d3f08a89e4cf3a0c503dc2562247a"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1642eceeaa5ab6c9b6dfeaaa626ae314d808188ab23ae196a34c9d97efb68350"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2170816e34e10f2fd120f603e951630f8a112e1be3b60963a1f159f5699059a6"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8be8508d110d93061197fd2d6a74f7401f73b6d12f8822bbcd6d74f2b55d71b1"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eed954b161e6b9b65f6be446ed448ed3921763cc432053ceb606f89d793927e"}, + {file = "aiohttp-3.11.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6c9af134da4bc9b3bd3e6a70072509f295d10ee60c697826225b60b9959acdd"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:44167fc6a763d534a6908bdb2592269b4bf30a03239bcb1654781adf5e49caf1"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:479b8c6ebd12aedfe64563b85920525d05d394b85f166b7873c8bde6da612f9c"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:10b4ff0ad793d98605958089fabfa350e8e62bd5d40aa65cdc69d6785859f94e"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b540bd67cfb54e6f0865ceccd9979687210d7ed1a1cc8c01f8e67e2f1e883d28"}, + {file = "aiohttp-3.11.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1dac54e8ce2ed83b1f6b1a54005c87dfed139cf3f777fdc8afc76e7841101226"}, + {file = "aiohttp-3.11.11-cp39-cp39-win32.whl", hash = "sha256:568c1236b2fde93b7720f95a890741854c1200fba4a3471ff48b2934d2d93fd3"}, + {file = "aiohttp-3.11.11-cp39-cp39-win_amd64.whl", hash = "sha256:943a8b052e54dfd6439fd7989f67fc6a7f2138d0a2cf0a7de5f18aa4fe7eb3b1"}, + {file = "aiohttp-3.11.11.tar.gz", hash = "sha256:bb49c7f1e6ebf3821a42d81d494f538107610c3a705987f53068546b0e90303e"}, ] [package.dependencies] @@ -309,19 +309,19 @@ cachetools = ">=5.2.0,<6.0.0" [[package]] name = "attrs" -version = "24.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] @@ -940,13 +940,13 @@ test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist" [[package]] name = "croniter" -version = "5.0.1" +version = "6.0.0" description = "croniter provides iteration for datetime object with cron like format" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.6" files = [ - {file = "croniter-5.0.1-py2.py3-none-any.whl", hash = "sha256:eb28439742291f6c10b181df1a5ecf421208b1fc62ef44501daec1780a0b09e9"}, - {file = "croniter-5.0.1.tar.gz", hash = "sha256:7d9b1ef25b10eece48fdf29d8ac52f9b6252abff983ac614ade4f3276294019e"}, + {file = "croniter-6.0.0-py2.py3-none-any.whl", hash = "sha256:2f878c3856f17896979b2a4379ba1f09c83e374931ea15cc835c5dd2eee9b368"}, + {file = "croniter-6.0.0.tar.gz", hash = "sha256:37c504b313956114a983ece2c2b07790b1f1094fe9d81cc94739214748255577"}, ] [package.dependencies] @@ -1305,19 +1305,19 @@ test = ["starlette[full]"] [[package]] name = "dask" -version = "2024.12.0" +version = "2024.12.1" description = "Parallel PyData with Task Scheduling" optional = false python-versions = ">=3.10" files = [ - {file = "dask-2024.12.0-py3-none-any.whl", hash = "sha256:e038e87b9f06e7927b81ecde6cf2b49aa699bb902fec11abba5697cb48baeb8d"}, - {file = "dask-2024.12.0.tar.gz", hash = "sha256:ffd02b06ac06b993df0b48e0ba4fe02abceb5c8b34b40bd91d63f33ec7a272a4"}, + {file = "dask-2024.12.1-py3-none-any.whl", hash = "sha256:1f32acddf1a6994e3af6734756f0a92467c47050bc29f3555bb9b140420e8e19"}, + {file = "dask-2024.12.1.tar.gz", hash = "sha256:bac809af21c2dd7eb06827bccbfc612504f3ee6435580e548af912828f823195"}, ] [package.dependencies] click = ">=8.1" cloudpickle = ">=3.0.0" -distributed = {version = "2024.12.0", optional = true, markers = "extra == \"distributed\""} +distributed = {version = "2024.12.1", optional = true, markers = "extra == \"distributed\""} fsspec = ">=2021.09.0" packaging = ">=20.0" partd = ">=1.4.0" @@ -1329,7 +1329,7 @@ array = ["numpy (>=1.24)"] complete = ["dask[array,dataframe,diagnostics,distributed]", "lz4 (>=4.3.2)", "pyarrow (>=14.0.1)"] dataframe = ["dask-expr (>=1.1,<1.2)", "dask[array]", "pandas (>=2.0)"] diagnostics = ["bokeh (>=3.1.0)", "jinja2 (>=2.10.3)"] -distributed = ["distributed (==2024.12.0)"] +distributed = ["distributed (==2024.12.1)"] test = ["pandas[test]", "pre-commit", "pytest", "pytest-cov", "pytest-rerunfailures", "pytest-timeout", "pytest-xdist"] [[package]] @@ -1609,19 +1609,19 @@ async = ["httpx (>=0.23.0,<0.24.0)"] [[package]] name = "distributed" -version = "2024.12.0" +version = "2024.12.1" description = "Distributed scheduler for Dask" optional = false python-versions = ">=3.10" files = [ - {file = "distributed-2024.12.0-py3-none-any.whl", hash = "sha256:ed05aa13b6c62b69b33d1ba7d1ca95e78406c8f37163fafd07f7ca94ae036b66"}, - {file = "distributed-2024.12.0.tar.gz", hash = "sha256:6a2c04e63d31973ee3c1f2160d66521ed8f08e637d6a25a450e7561582920f38"}, + {file = "distributed-2024.12.1-py3-none-any.whl", hash = "sha256:87e31abaa0ee3dc517b44fec4993d4b5d92257f926a8d2a12d52c005227154e7"}, + {file = "distributed-2024.12.1.tar.gz", hash = "sha256:438aa3ae48bfac9c2bb2ad03f9d47899286f9cb3db8a627b3b8c0de9e26f53dd"}, ] [package.dependencies] click = ">=8.0" cloudpickle = ">=3.0.0" -dask = "2024.12.0" +dask = "2024.12.1" jinja2 = ">=2.10.3" locket = ">=1.0.0" msgpack = ">=1.0.2" @@ -1637,13 +1637,13 @@ zict = ">=3.0.0" [[package]] name = "dlt" -version = "1.4.1" +version = "1.5.0" description = "dlt is an open-source python-first scalable data loading library that does not require any backend to run." optional = false python-versions = "<3.13,>=3.8.1" files = [ - {file = "dlt-1.4.1-py3-none-any.whl", hash = "sha256:fdfda790084914902579c903882b75d3c683b7545e15f86240cd1005bb3e8e64"}, - {file = "dlt-1.4.1.tar.gz", hash = "sha256:73e797e8d1c220caa80d464aebdd23c300b1c8385fbb605df04167fc513f8670"}, + {file = "dlt-1.5.0-py3-none-any.whl", hash = "sha256:b9eaaa4966f3f696b8ba5cb988ce3c1a1030bede0cb92ecfa75f663709a7d296"}, + {file = "dlt-1.5.0.tar.gz", hash = "sha256:2ece1c96242699630793681f0e3b9ec8bd41c79db3de20266cde427a71869b61"}, ] [package.dependencies] @@ -1664,7 +1664,7 @@ pytz = ">=2022.6" PyYAML = ">=5.4.1" requests = ">=2.26.0" requirements-parser = ">=0.5.0" -semver = ">=2.13.0" +semver = ">=3.0.0" setuptools = ">=65.6.0" simplejson = ">=3.17.5" tenacity = ">=8.0.2" @@ -1675,11 +1675,11 @@ win-precise-time = {version = ">=1.4.2", markers = "os_name == \"nt\""} [package.extras] athena = ["botocore (>=1.28)", "pyarrow (>=12.0.0)", "pyathena (>=2.9.6)", "s3fs (>=2022.4.0)"] -az = ["adlfs (>=2022.4.0)"] +az = ["adlfs (>=2024.7.0)"] bigquery = ["db-dtypes (>=1.2.0)", "gcsfs (>=2022.4.0)", "google-cloud-bigquery (>=2.26.0)", "grpcio (>=1.50.0)", "pyarrow (>=12.0.0)"] cli = ["cron-descriptor (>=1.2.32)", "pipdeptree (>=2.9.0,<2.10)"] -clickhouse = ["adlfs (>=2022.4.0)", "clickhouse-connect (>=0.7.7)", "clickhouse-driver (>=0.2.7)", "gcsfs (>=2022.4.0)", "pyarrow (>=12.0.0)", "s3fs (>=2022.4.0)"] -databricks = ["databricks-sql-connector (>=2.9.3)"] +clickhouse = ["adlfs (>=2024.7.0)", "clickhouse-connect (>=0.7.7)", "clickhouse-driver (>=0.2.7)", "gcsfs (>=2022.4.0)", "pyarrow (>=12.0.0)", "s3fs (>=2022.4.0)"] +databricks = ["databricks-sdk (>=0.38.0)", "databricks-sql-connector (>=2.9.3)"] deltalake = ["deltalake (>=0.21.0)", "pyarrow (>=12.0.0)"] dremio = ["pyarrow (>=12.0.0)"] duckdb = ["duckdb (>=0.9)"] @@ -1692,6 +1692,7 @@ mssql = ["pyodbc (>=4.0.39)"] parquet = ["pyarrow (>=12.0.0)"] postgis = ["psycopg2-binary (>=2.9.1)", "psycopg2cffi (>=2.9.0)"] postgres = ["psycopg2-binary (>=2.9.1)", "psycopg2cffi (>=2.9.0)"] +pyiceberg = ["pyarrow (>=12.0.0)", "pyiceberg (>=0.8.1)", "sqlalchemy (>=1.4)"] qdrant = ["qdrant-client[fastembed] (>=1.8)"] redshift = ["psycopg2-binary (>=2.9.1)", "psycopg2cffi (>=2.9.0)"] s3 = ["botocore (>=1.28)", "s3fs (>=2022.4.0)"] @@ -1699,7 +1700,7 @@ sftp = ["paramiko (>=3.3.0)"] snowflake = ["snowflake-connector-python (>=3.5.0)"] sql-database = ["sqlalchemy (>=1.4)"] sqlalchemy = ["alembic (>1.10.0)", "sqlalchemy (>=1.4)"] -synapse = ["adlfs (>=2022.4.0)", "pyarrow (>=12.0.0)", "pyodbc (>=4.0.39)"] +synapse = ["adlfs (>=2024.7.0)", "pyarrow (>=12.0.0)", "pyodbc (>=4.0.39)"] weaviate = ["weaviate-client (>=3.22)"] [[package]] @@ -1862,13 +1863,13 @@ standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "htt [[package]] name = "fastapi-cli" -version = "0.0.6" +version = "0.0.7" description = "Run and manage FastAPI apps from the command line with FastAPI CLI. 🚀" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi_cli-0.0.6-py3-none-any.whl", hash = "sha256:43288efee46338fae8902f9bf4559aed3aed639f9516f5d394a7ff19edcc8faf"}, - {file = "fastapi_cli-0.0.6.tar.gz", hash = "sha256:2835a8f0c44b68e464d5cafe5ec205265f02dc1ad1d640db33a994ba3338003b"}, + {file = "fastapi_cli-0.0.7-py3-none-any.whl", hash = "sha256:d549368ff584b2804336c61f192d86ddea080c11255f375959627911944804f4"}, + {file = "fastapi_cli-0.0.7.tar.gz", hash = "sha256:02b3b65956f526412515907a0793c9094abd4bfb5457b389f645b0ea6ba3605e"}, ] [package.dependencies] @@ -1895,20 +1896,6 @@ docs = ["furo (>=2024.8.6)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2. testing = ["covdefaults (>=2.3)", "coverage (>=7.6.1)", "diff-cover (>=9.2)", "pytest (>=8.3.3)", "pytest-asyncio (>=0.24)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-timeout (>=2.3.1)", "virtualenv (>=20.26.4)"] typing = ["typing-extensions (>=4.12.2)"] -[[package]] -name = "freezegun" -version = "1.5.1" -description = "Let your Python tests travel through time" -optional = false -python-versions = ">=3.7" -files = [ - {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, - {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, -] - -[package.dependencies] -python-dateutil = ">=2.7" - [[package]] name = "frozenlist" version = "1.5.0" @@ -2012,13 +1999,13 @@ files = [ [[package]] name = "fsspec" -version = "2024.10.0" +version = "2024.12.0" description = "File-system specification" optional = false python-versions = ">=3.8" files = [ - {file = "fsspec-2024.10.0-py3-none-any.whl", hash = "sha256:03b9a6785766a4de40368b88906366755e2819e758b83705c88cd7cb5fe81871"}, - {file = "fsspec-2024.10.0.tar.gz", hash = "sha256:eda2d8a4116d4f2429db8550f2457da57279247dd930bb12f821b58391359493"}, + {file = "fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2"}, + {file = "fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f"}, ] [package.extras] @@ -2051,19 +2038,19 @@ tqdm = ["tqdm"] [[package]] name = "gcsfs" -version = "2024.10.0" +version = "2024.12.0" description = "Convenient Filesystem interface over GCS" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "gcsfs-2024.10.0-py2.py3-none-any.whl", hash = "sha256:bb2d23547e61203ea2dda5fa6c4b91a0c34b74ebe8bb6ab1926f6c33381bceb2"}, - {file = "gcsfs-2024.10.0.tar.gz", hash = "sha256:5df54cfe568e8fdeea5aafa7fed695cdc69a9a674e991ca8c1ce634f5df1d314"}, + {file = "gcsfs-2024.12.0-py2.py3-none-any.whl", hash = "sha256:ec88e48f77e466723705458af85dda238e43aa69fac071efd98829d06e9f095a"}, + {file = "gcsfs-2024.12.0.tar.gz", hash = "sha256:e672413922108300ebc1fe78b8f99f3c7c1b94e7e088f5a6dc88de6d5a93d156"}, ] [package.dependencies] aiohttp = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1" decorator = ">4.1.2" -fsspec = "2024.10.0" +fsspec = "2024.12.0" google-auth = ">=1.2" google-auth-oauthlib = "*" google-cloud-storage = "*" @@ -2168,13 +2155,13 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-api-python-client" -version = "2.155.0" +version = "2.156.0" description = "Google API Client Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "google_api_python_client-2.155.0-py2.py3-none-any.whl", hash = "sha256:83fe9b5aa4160899079d7c93a37be306546a17e6686e2549bcc9584f1a229747"}, - {file = "google_api_python_client-2.155.0.tar.gz", hash = "sha256:25529f89f0d13abcf3c05c089c423fb2858ac16e0b3727543393468d0d7af67c"}, + {file = "google_api_python_client-2.156.0-py2.py3-none-any.whl", hash = "sha256:6352185c505e1f311f11b0b96c1b636dcb0fec82cd04b80ac5a671ac4dcab339"}, + {file = "google_api_python_client-2.156.0.tar.gz", hash = "sha256:b809c111ded61716a9c1c7936e6899053f13bae3defcdfda904bd2ca68065b9c"}, ] [package.dependencies] @@ -3062,13 +3049,13 @@ files = [ [[package]] name = "ipython" -version = "8.30.0" +version = "8.31.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" files = [ - {file = "ipython-8.30.0-py3-none-any.whl", hash = "sha256:85ec56a7e20f6c38fce7727dcca699ae4ffc85985aa7b23635a8008f918ae321"}, - {file = "ipython-8.30.0.tar.gz", hash = "sha256:cb0a405a306d2995a5cbb9901894d240784a9f341394c6ba3f4fe8c6eb89ff6e"}, + {file = "ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6"}, + {file = "ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b"}, ] [package.dependencies] @@ -3214,6 +3201,8 @@ optional = false python-versions = "*" files = [ {file = "jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c"}, + {file = "jsonpath_ng-1.7.0-py2-none-any.whl", hash = "sha256:898c93fc173f0c336784a3fa63d7434297544b7198124a68f9a3ef9597b0ae6e"}, + {file = "jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6"}, ] [package.dependencies] @@ -3343,13 +3332,13 @@ adal = ["adal (>=1.0.2)"] [[package]] name = "kubernetes-asyncio" -version = "31.1.1" +version = "32.0.0" description = "Kubernetes asynchronous python client" optional = false python-versions = "*" files = [ - {file = "kubernetes_asyncio-31.1.1-py3-none-any.whl", hash = "sha256:d5e441674fde5dd8d0366cb6a204d7fbaef8d0dce7ca7a34c0791af0d13b6ff1"}, - {file = "kubernetes_asyncio-31.1.1.tar.gz", hash = "sha256:393bb60a2740d482651d474956296b341348c3e4f883b171740e5a4bf105a87b"}, + {file = "kubernetes_asyncio-32.0.0-py3-none-any.whl", hash = "sha256:f9baa8f73c182948e063bb9448d8e614f73df4aae52d28f173a3a1c2b77fbfb4"}, + {file = "kubernetes_asyncio-32.0.0.tar.gz", hash = "sha256:77f28a026aff8a40fd34a7ebad9f3813dcb7e549c7240275fc4bfbff0a6b49d0"}, ] [package.dependencies] @@ -4829,32 +4818,32 @@ files = [ [[package]] name = "psutil" -version = "6.1.0" +version = "6.1.1" description = "Cross-platform lib for process and system monitoring in Python." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"}, - {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"}, - {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"}, - {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"}, - {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"}, - {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"}, - {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"}, - {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"}, - {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"}, - {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"}, - {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"}, - {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"}, - {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"}, - {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"}, - {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"}, - {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"}, - {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"}, -] - -[package.extras] -dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"] + {file = "psutil-6.1.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777"}, + {file = "psutil-6.1.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468"}, + {file = "psutil-6.1.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca"}, + {file = "psutil-6.1.1-cp27-none-win32.whl", hash = "sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac"}, + {file = "psutil-6.1.1-cp27-none-win_amd64.whl", hash = "sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3"}, + {file = "psutil-6.1.1-cp36-cp36m-win32.whl", hash = "sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603"}, + {file = "psutil-6.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303"}, + {file = "psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53"}, + {file = "psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649"}, + {file = "psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5"}, +] + +[package.extras] +dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] test = ["pytest", "pytest-xdist", "setuptools"] [[package]] @@ -5447,13 +5436,13 @@ cli = ["click (>=5.0)"] [[package]] name = "python-json-logger" -version = "3.2.0" +version = "3.2.1" description = "JSON Log Formatter for the Python Logging Package" optional = false python-versions = ">=3.8" files = [ - {file = "python_json_logger-3.2.0-py3-none-any.whl", hash = "sha256:d73522ddcfc6d0461394120feaddea9025dc64bf804d96357dd42fa878cc5fe8"}, - {file = "python_json_logger-3.2.0.tar.gz", hash = "sha256:2c11056458d3f56614480b24e9cb28f7aba69cbfbebddbb77c92f0ec0d4947ab"}, + {file = "python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090"}, + {file = "python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008"}, ] [package.extras] @@ -5472,13 +5461,13 @@ files = [ [[package]] name = "python-multipart" -version = "0.0.19" +version = "0.0.20" description = "A streaming multipart parser for Python" optional = false python-versions = ">=3.8" files = [ - {file = "python_multipart-0.0.19-py3-none-any.whl", hash = "sha256:f8d5b0b9c618575bf9df01c684ded1d94a338839bdd8223838afacfb4bb2082d"}, - {file = "python_multipart-0.0.19.tar.gz", hash = "sha256:905502ef39050557b7a6af411f454bc19526529ca46ae6831508438890ce12cc"}, + {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"}, + {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"}, ] [[package]] @@ -6275,25 +6264,25 @@ files = [ [[package]] name = "sling" -version = "1.3.2" +version = "1.3.3" description = "Slings data from a source to a target" optional = false python-versions = "*" files = [ - {file = "sling-1.3.2.tar.gz", hash = "sha256:080a32bb1d50fc19a1b56e13292b74ea7f190d29c2d9c5f19bda3c75cf04d97f"}, + {file = "sling-1.3.3.tar.gz", hash = "sha256:f43e86c696d18b04bc3a20775f61782046fa08dcc31736d72434542b966a8c52"}, ] [package.dependencies] -sling-linux-amd64 = "1.3.2" +sling-linux-amd64 = "1.3.3" [[package]] name = "sling-linux-amd64" -version = "1.3.2" +version = "1.3.3" description = "Sling Binary for Linux (AMD64)" optional = false python-versions = "*" files = [ - {file = "sling-linux-amd64-1.3.2.tar.gz", hash = "sha256:ab5f8caa26f6873f606ad7f954496fbc50608610eb51adea79b2fbb8d2a56c23"}, + {file = "sling-linux-amd64-1.3.3.tar.gz", hash = "sha256:2f6973c1fd8d13e49264997620803e4b921d621a7fbf591d6afd39728cff758b"}, ] [[package]] @@ -6467,101 +6456,101 @@ sqlfluff = "3.2.5" [[package]] name = "sqlglot" -version = "25.27.0" +version = "26.0.1" description = "An easily customizable SQL parser and transpiler" optional = false python-versions = ">=3.7" files = [ - {file = "sqlglot-25.27.0-py3-none-any.whl", hash = "sha256:6dbed60971542f1a69775f1f642359097859df4db440d4601cb75cb4cd9fe936"}, - {file = "sqlglot-25.27.0.tar.gz", hash = "sha256:0a225bd0967bb1830a4fa9e9072eb1a4e74e9f80b5ff99f4bba52a60330322e9"}, + {file = "sqlglot-26.0.1-py3-none-any.whl", hash = "sha256:ced4967ce3a4a713d35e2037492fbe1a5187936fdfbd72d7b9ace7815c2d2225"}, + {file = "sqlglot-26.0.1.tar.gz", hash = "sha256:588cde7739029fda310fb7dd49afdc0a20b79e760e4cd6d5e1cd083e7e458b90"}, ] [package.dependencies] -sqlglotrs = {version = "0.2.12", optional = true, markers = "extra == \"rs\""} +sqlglotrs = {version = "0.3.0", optional = true, markers = "extra == \"rs\""} [package.extras] -dev = ["duckdb (>=0.6)", "maturin (>=1.4,<2.0)", "mypy", "pandas", "pandas-stubs", "pdoc", "pre-commit", "python-dateutil", "pytz", "ruff (==0.4.3)", "types-python-dateutil", "types-pytz", "typing-extensions"] -rs = ["sqlglotrs (==0.2.12)"] +dev = ["duckdb (>=0.6)", "maturin (>=1.4,<2.0)", "mypy", "pandas", "pandas-stubs", "pdoc", "pre-commit", "python-dateutil", "pytz", "ruff (==0.7.2)", "types-python-dateutil", "types-pytz", "typing-extensions"] +rs = ["sqlglotrs (==0.3.0)"] [[package]] name = "sqlglotrs" -version = "0.2.12" +version = "0.3.0" description = "An easily customizable SQL parser and transpiler" optional = false python-versions = ">=3.7" files = [ - {file = "sqlglotrs-0.2.12-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4ceb28cf2ee3850cd745167cebe59a5fc3d506b32e9c81307938d8d272c1d670"}, - {file = "sqlglotrs-0.2.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a2ddeab27a94447270b7a240770a31a3afed0a972d60085205baec990ad76a"}, - {file = "sqlglotrs-0.2.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9597865efc40e5c41af7719106c7620e1338aaa64646726652c63bae14225391"}, - {file = "sqlglotrs-0.2.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6ef3a827f2980aad17af4f8548297c93c4989d4cd3f64b9bcb7443952c542423"}, - {file = "sqlglotrs-0.2.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39a6ef72cf271db93ec6019847b7832defa9f4013c1e66851ca9c0a11c010c0c"}, - {file = "sqlglotrs-0.2.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc1807c6222e32fc9bf6f5c7e12b85c4b72f12227800d40c1693244c198b33bb"}, - {file = "sqlglotrs-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aacab6e20d92be3ca76f7358fa12346f29985e2d408660c764b7f1c75cc40ee"}, - {file = "sqlglotrs-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:91971032603d05428fd42a978084110afb2a4c0975e4343b075f69a23889e3da"}, - {file = "sqlglotrs-0.2.12-cp310-none-win32.whl", hash = "sha256:5026eada48f258ce9ad26fa41994b2ea5404bef2c3df9cb5cb2a159112a6269f"}, - {file = "sqlglotrs-0.2.12-cp310-none-win_amd64.whl", hash = "sha256:ab676d2d7da28907a139ad5fc20dee0890054967bac0b18e653ac048837c9ea1"}, - {file = "sqlglotrs-0.2.12-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b6020825e58af6e2795e6dcb69639f5500e45e1da78f1b1abd74c4d11083a249"}, - {file = "sqlglotrs-0.2.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c64066d13bd2e5e788b845c933c765af9991faa93982e273b623019a1161fadc"}, - {file = "sqlglotrs-0.2.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9334f6c394a671a630c61339d52fb7da1a72eca057570f039b2a4035d2e39380"}, - {file = "sqlglotrs-0.2.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2db7e6cd41ef88c2ac647ad0258f87906de822955dec8f14e91829083047d784"}, - {file = "sqlglotrs-0.2.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c79c43c5cde1f4017641032f11770ed8111c963dccc096cd15df906d4fb46a4"}, - {file = "sqlglotrs-0.2.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59499adc27a70a72170db9241404a18d4829cd3a83a076b9e112ad365c4b1452"}, - {file = "sqlglotrs-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3d62905ce74a48714b7662ad95efe299fad62f193be4b482a327af060f98710"}, - {file = "sqlglotrs-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:327bfc2d71449f4dffba93d63f0565c4a1fa818143b1cfbc3f936fa8c9bcce10"}, - {file = "sqlglotrs-0.2.12-cp311-none-win32.whl", hash = "sha256:4364116b7b0c72b841de6acd149a002bfc8fe360125989d4f39debd387c874d8"}, - {file = "sqlglotrs-0.2.12-cp311-none-win_amd64.whl", hash = "sha256:732516bffffc70f172306ad8bc747dd9f16512cdbc09475abe6ad6f744479dee"}, - {file = "sqlglotrs-0.2.12-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9d5b9a9d6259b72258f6764f88a89faa3c648438bd1b2c3a9598b725d42bf6f2"}, - {file = "sqlglotrs-0.2.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:acc25d651eb663332157c2e5d2736516cddf4cd0effe67a887723934de5051d1"}, - {file = "sqlglotrs-0.2.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc98b7649445e726a492841b8b8b39a4e5724ec2787cd1436404ebccf42519a"}, - {file = "sqlglotrs-0.2.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b10bf6b71961b31951bf4dff937d8d5d399ea1b3bd47fb5c5810386710fe7dfb"}, - {file = "sqlglotrs-0.2.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8bf7ae29c0fc66e9c998d7f8e6f6fc26309c6eb5a4728e1443cb628218bc307"}, - {file = "sqlglotrs-0.2.12-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e8be22da77c964be76ab4438da2c77096f5871088466ca950ee1b4712a97d4"}, - {file = "sqlglotrs-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:147cda8412f45af290ad190d9a98b5829a5f46a575ce768279ccebf9b7b53785"}, - {file = "sqlglotrs-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:954ccd912391ab5922adb23159ebcc0c5dccb468381e2a1ce92117cb4b0f0ed3"}, - {file = "sqlglotrs-0.2.12-cp312-none-win32.whl", hash = "sha256:5be231acf95920bed473524dd1cac93e4cb320ed7e6ae937531b232c54cfc232"}, - {file = "sqlglotrs-0.2.12-cp312-none-win_amd64.whl", hash = "sha256:4c07d3dba9c3ae8b56a0e45a9e47aa2a2c6ed95870c5bcc67dacaadb873843ff"}, - {file = "sqlglotrs-0.2.12-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:aaf86275a3388da1ed2161645aa346bfca3ee6e1dc0e2115867db9e78f1caddd"}, - {file = "sqlglotrs-0.2.12-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:c3e0edde0fdf598561e7404ac56fb4b12276394ee5155b5365e42434c6f287a3"}, - {file = "sqlglotrs-0.2.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f83ad3fb4ea57218c0e65d3499e31c9bb3051bbb5dccbb11593eaf1640964b51"}, - {file = "sqlglotrs-0.2.12-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4ec38035523d54ba33de1e2b5562de4938254b61e1df48eb1db0e26ea189de28"}, - {file = "sqlglotrs-0.2.12-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40601e67f5abae5d09d23f92394dbd735539de469ce663b596eb42bf77d2c54"}, - {file = "sqlglotrs-0.2.12-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8a18b3a09c32788d1ee2d0610ab35af862413c56b65f8ad8bc0131701f03103b"}, - {file = "sqlglotrs-0.2.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2824fc87fd7e41a785150ff042c7934e1fff97c6ccd59e4d96bebf6697a90762"}, - {file = "sqlglotrs-0.2.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa1ae834fb78bd52bb76e3c8d02cb79f45717ab1f02f4ad8154bf33a5408a502"}, - {file = "sqlglotrs-0.2.12-cp37-none-win32.whl", hash = "sha256:155b0d59e34851b119c7ff0b2c7968c7b51667c1a1c2abefe1ac7244b3c1d78e"}, - {file = "sqlglotrs-0.2.12-cp37-none-win_amd64.whl", hash = "sha256:ebc162a599fac86e59f899631716752fbc7f89598e94729eadb707e54db371b2"}, - {file = "sqlglotrs-0.2.12-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:a4a2cacb31f75e242c7b9ff4afae1d95f548df8441444114376d8007cc91b55b"}, - {file = "sqlglotrs-0.2.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2554ead3126c83864a4b7e48e8e7e1bc23faf7160a6f28d3db967661cf529c9e"}, - {file = "sqlglotrs-0.2.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c4c6f6fe1c54fff614f9d0b2dd7a6bf948bda87ce51a245dcd3f447f20c8b74"}, - {file = "sqlglotrs-0.2.12-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8174aa227193d0a755f4515e6c3883be4681c9b669a65c2316f09be27b84be4d"}, - {file = "sqlglotrs-0.2.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97b2c74fcdd89f0d4458c0e2b5783989be99a1e0b2d627797688ab716ad9391b"}, - {file = "sqlglotrs-0.2.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0338c7770a5cb5bb0ec1dcbe5206359fe9b83da0aba8dde53b9e7bd1afc89a22"}, - {file = "sqlglotrs-0.2.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b553cdb9e8afcfea5466815e865f874f6f51aaace4fb4101670e150f7bbfe5a"}, - {file = "sqlglotrs-0.2.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f268aea3d2ebc05cb9148bb487f21e532f8af1b0a4aed6b7374703aadfb6a7c"}, - {file = "sqlglotrs-0.2.12-cp38-none-win32.whl", hash = "sha256:bd6c4e6a7670f761c8e69b45d6d302a4d37a3cddb1fdca2ad90e54b77858fe80"}, - {file = "sqlglotrs-0.2.12-cp38-none-win_amd64.whl", hash = "sha256:bf3e2eab11f06f1df13c0f85b3e26fbab0b7e8a5d189e5edfed951bc85f6bd48"}, - {file = "sqlglotrs-0.2.12-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:17b289ef0f25a7c034d183c588345e2b56622f7f64a85d1020633a75f8e3ac96"}, - {file = "sqlglotrs-0.2.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7b2da43b2a6a85807df6c56b2627abe244aff28fdf9a4940d38d749cb4b8e3e"}, - {file = "sqlglotrs-0.2.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e4e1765c6be438329e234e56a6772537f6de16c4bb5ba7170e344664cccdf7"}, - {file = "sqlglotrs-0.2.12-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:989ccc5dc6b38da937481b6eb2dc1fc0b13676fe129697b874828e577984d7ef"}, - {file = "sqlglotrs-0.2.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a266c9047726d83c51a8ec3d5278ceb9caf131307c9c93c4ceefd99c0116e538"}, - {file = "sqlglotrs-0.2.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:065835e7f2be50ba83895b64d044a39dab9d95098fff995427365e4bd8bc7bc6"}, - {file = "sqlglotrs-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67e288759d2be822db2175d0025c1f61283b019f2cc3e2577f31ad0ef3b5854d"}, - {file = "sqlglotrs-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:057a8db59a6c4bcdc42831e7ad01f41cf9e7f388ed5b139816adafbcacf2f591"}, - {file = "sqlglotrs-0.2.12-cp39-none-win32.whl", hash = "sha256:315f7f7bbfedf0c87d98068e62363454e986bdd05baa165b7fb448b5c6fe9f1a"}, - {file = "sqlglotrs-0.2.12-cp39-none-win_amd64.whl", hash = "sha256:d2827c7bf7e57496f9b95658bcd2395cfb0c51adc3023cd3386988337dfaf6a5"}, - {file = "sqlglotrs-0.2.12.tar.gz", hash = "sha256:f104a98182761d4613f920eda7ec5fc921afb3608f7db648206ce06dd10a6be5"}, + {file = "sqlglotrs-0.3.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:20483ace62f943d50a7caeae57b434d1872f0dfeebc697f5e97a6851e3cef254"}, + {file = "sqlglotrs-0.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602feea94d9cfbba0d8b7cf40f144ce311f8c11f06b6a49638d6311b799ee578"}, + {file = "sqlglotrs-0.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27a64bf9770c683be0e345020674e52f04eacfccb74ef3529c0dfbaa25099509"}, + {file = "sqlglotrs-0.3.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09e6291cf28dbab1d4fedbe121e6db6bc5ca2fb4d1d60071b632ca4a543d5448"}, + {file = "sqlglotrs-0.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac61397b933471149a0d4227736f8fa727f90b7ae370bfcef9afe7835e1177b8"}, + {file = "sqlglotrs-0.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93ba39a9ceafd999c9ccc0e53ff08d284915705db5a739b2ab66064e39010418"}, + {file = "sqlglotrs-0.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01e059b9ab5ccc98203dee2962e094c8d798cd50d94398740d514d1d5d480171"}, + {file = "sqlglotrs-0.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0493ac7c0ec58c1d1f13a931e98389a1dc6492f1ea1ad5b6edcf331ca2a1791"}, + {file = "sqlglotrs-0.3.0-cp310-none-win32.whl", hash = "sha256:3b4cbdb225639615402e9fc79661255d9dea5b937d4196a9b499ffccb9560629"}, + {file = "sqlglotrs-0.3.0-cp310-none-win_amd64.whl", hash = "sha256:a9f2ab2fa34d025439491f372c4c065aa921b7b73854647468218778b564f9eb"}, + {file = "sqlglotrs-0.3.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c1b6b80f75676342268e46a47d07b406976a7c058d842d8729227c493540dba"}, + {file = "sqlglotrs-0.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b02f33c570d7a170279a67a66d30602857371aba5c5212af7f544cba41b0f48f"}, + {file = "sqlglotrs-0.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5917dc3bba375d1bbb1ec8c72a317c138b95b1c7fcaba9aa5d71f8d2c88e86d"}, + {file = "sqlglotrs-0.3.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b7be5af42795481047561e2dc67bd20d06291daaa757ffaf0854bacbf280cc"}, + {file = "sqlglotrs-0.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b678b19a3ae22068e6f0ec74a87db549d530f7642a9c954d79273eb0d579bb55"}, + {file = "sqlglotrs-0.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:809394744715f2992d26e8f6eacddf5961864b1dbd778c9918b0bfc0b49176e3"}, + {file = "sqlglotrs-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26036563d4ca30750e44ab5eb1682d3585965df592425a6ecfdb03d154bb6393"}, + {file = "sqlglotrs-0.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4718c07e136f94a85dc438d8392d868c14c88e8c27b1cd8a8bd7167c2318453e"}, + {file = "sqlglotrs-0.3.0-cp311-none-win32.whl", hash = "sha256:99a6380100cb744a56ca24bddb62783b6f3cbddd50529183d95a426d3a9ce052"}, + {file = "sqlglotrs-0.3.0-cp311-none-win_amd64.whl", hash = "sha256:c813e0620dd79573a08682551b90b0e408f52b84d7ffdbdb4cd5346101575239"}, + {file = "sqlglotrs-0.3.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b722831fd3de500d3c32169317878fede01880e3f1b6cfae926d60d6fbbde6b1"}, + {file = "sqlglotrs-0.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4eeedf2d77c9a44d75e641fa659da1cf69dfcdc27d4fe23d0ee45666122605ce"}, + {file = "sqlglotrs-0.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36878452de1c785dcf11792d9c9bd0810f523be02c23406dbeb6eef05c97e515"}, + {file = "sqlglotrs-0.3.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3e2771b7c6ac9f3f871751e90f4d864c9c689622a3591d932497bd6f1475677"}, + {file = "sqlglotrs-0.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f14e501797e04711a13f766abb31871bc1044ec74e131cabebd7f7757f1cd3f"}, + {file = "sqlglotrs-0.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19bc0293fc586d7c0b5b210f011765cb4378e8f3d77ef93d1937bdd5971d6425"}, + {file = "sqlglotrs-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd5bdc463afe95f00bc9f52e412ea1d52bd958648428e552ecbab5b21d8f93c9"}, + {file = "sqlglotrs-0.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ecacb017d414b21b495e0868ca76b958dbae193ca0e158e0adcaa61b633c0315"}, + {file = "sqlglotrs-0.3.0-cp312-none-win32.whl", hash = "sha256:48d510f5c9704899262ee6b2189eb8eb5639e6474e8141453e93fe10364bde2c"}, + {file = "sqlglotrs-0.3.0-cp312-none-win_amd64.whl", hash = "sha256:b9f308732f12331f06c53fcb1d7c2b135a43aa22486b4c88c26d42710f329448"}, + {file = "sqlglotrs-0.3.0-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:2ebdd93b3bcfa5f221957db355d88beea2ae238e388dc16876aa60d0904ae38c"}, + {file = "sqlglotrs-0.3.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:3d642e2df4ec0016b493fc864ff0e94d90aad04dd350a1515e29e594a93e4ab0"}, + {file = "sqlglotrs-0.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:780f2d3400af95976677d4f007e8eae58ff0da0c0191eeee2b722f4f3ca5eabf"}, + {file = "sqlglotrs-0.3.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8ff408440b8a8baa22581356057c49fba6de48fbbfc4c2b765edcfbaad06fb5e"}, + {file = "sqlglotrs-0.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efc31350a2f64821cc0c5c5297e8731c65e2fb4a276b2bd49b9873edab352a33"}, + {file = "sqlglotrs-0.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:acb5e8cddccd70d4937a78bcad1b6a6e919e7d74ae867bad01313fb86ea9be14"}, + {file = "sqlglotrs-0.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabe76a38acad75c54f324dc43b38b591574ff679c6317dfb680f19d798d599d"}, + {file = "sqlglotrs-0.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0fac87cfbf070c32d36da98bb221c1594087f4fc1be07367749f6e28483c0df"}, + {file = "sqlglotrs-0.3.0-cp37-none-win32.whl", hash = "sha256:b031e307b904c966b7820d332ada97876c39eddcbfef11f26841f2a19964878a"}, + {file = "sqlglotrs-0.3.0-cp37-none-win_amd64.whl", hash = "sha256:eaf54eccab602ba0e029b42fecb495bd48e8f305ede7b049acad82a5cf4ce117"}, + {file = "sqlglotrs-0.3.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:8fe9440a8d9cbe9e710d18be6ce624347b5054cf3e4d489243515e8f8af78ac0"}, + {file = "sqlglotrs-0.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:74df14bfc1ca3fe5333e738a3af1423f1e1b6ce75ac7972cb891059752272eb1"}, + {file = "sqlglotrs-0.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af5e533c8f6a46c351bcc67a68ad1bab9f238cb1950483d5fee540ae1f18110a"}, + {file = "sqlglotrs-0.3.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1fbe17ea29952cd6e7e05afe7d34687b9e2e041ecf4a6aec3b1defc0b629b888"}, + {file = "sqlglotrs-0.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a49ff2ce642e9157f701333bdcff378d9bd74a24a8f0eaf74fe76baf743b5f04"}, + {file = "sqlglotrs-0.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9a8f65b664bd99d803e39e188a455503374c40b156aafb94a6843b29fa84d8a2"}, + {file = "sqlglotrs-0.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d524351c38755009e13e67c2a8045cd1d6d3c86fa33b9a568560b2f2559a2c95"}, + {file = "sqlglotrs-0.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e9aaec2773f2042d22ad0bd7c06d1b03cf2f98f584f7862d20ec2c303b16180d"}, + {file = "sqlglotrs-0.3.0-cp38-none-win32.whl", hash = "sha256:8a913bb6f5588d0a670778f9b10124956a87203df41e166512d4574027aaaf6f"}, + {file = "sqlglotrs-0.3.0-cp38-none-win_amd64.whl", hash = "sha256:dfbe3a404e201cdbbc0179da17074240ee4dd74bfc5ad75c9bcc3666c8435f7a"}, + {file = "sqlglotrs-0.3.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9aa376d3a0709746791c645858f7d59e32c0e489ee1fba82ca738901f7cd5181"}, + {file = "sqlglotrs-0.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:490189f2c30e1461b9195d2e5417d6293e75f7a28917f41f2ef3689cc4539644"}, + {file = "sqlglotrs-0.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b5cc3bbcf9c38e1e9154f08ceebbbf92fd80f9efa0cc4e1513302f368db09cd"}, + {file = "sqlglotrs-0.3.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d205ed27aec521943f5aba28bc7f252adf8abbbfff88df2dfce4c4be6dbbbae9"}, + {file = "sqlglotrs-0.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66503cf6afeb39fd7187b0b4db3eac4e7f715756f8f2422f2308d72284f07d84"}, + {file = "sqlglotrs-0.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10bbd5f041a005a1e289039cedfdd5e1132ed621344e63cd9d3ba32026c48537"}, + {file = "sqlglotrs-0.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:facac3f0136fcb3220493fd4df556f01c5c0b97fb4c5fafd9f344b9128fef72b"}, + {file = "sqlglotrs-0.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8b7e159803f17f827f691b5b818740c6f1b233588f8a2dc0a73391db14e5a54"}, + {file = "sqlglotrs-0.3.0-cp39-none-win32.whl", hash = "sha256:d9a127109e27ccbd0bd3fd2fc66ceb25da00254d60e57985feab202df4e171dd"}, + {file = "sqlglotrs-0.3.0-cp39-none-win_amd64.whl", hash = "sha256:dcd9300361a4c8a4719c340df669693fcff5fd6a04571378cf18c83d9b516e05"}, + {file = "sqlglotrs-0.3.0.tar.gz", hash = "sha256:e77deb4ad2a94024e07ad9c1a15ad573b5503cacc9a948b0f5fd2d6df32156de"}, ] [[package]] name = "sqlmesh" -version = "0.129.0" +version = "0.141.1" description = "" optional = false python-versions = "*" files = [ - {file = "sqlmesh-0.129.0-py3-none-any.whl", hash = "sha256:fea4ee3a6bc1939b4b2e4239048f2fc71743674f739b6633f740a7547cbcd5de"}, - {file = "sqlmesh-0.129.0.tar.gz", hash = "sha256:0d04147be13591c51fac4c2fb51b9885a1a523e0a75e1ee4415076f746444c77"}, + {file = "sqlmesh-0.141.1-py3-none-any.whl", hash = "sha256:8fdcf3d0a871dd0862d1ac253f68c471b44d5eeef90dc3a28f77a7844e8b7737"}, + {file = "sqlmesh-0.141.1.tar.gz", hash = "sha256:b1b789d5f97301c381b1c92b1298e99e862172ca87c905ab39c569986b614717"}, ] [package.dependencies] @@ -6570,7 +6559,6 @@ click = "*" croniter = "*" dateparser = "*" duckdb = "!=0.10.3" -freezegun = "*" hyperscript = ">=0.1.0" ipywidgets = "*" jinja2 = "*" @@ -6579,18 +6567,20 @@ pydantic = "*" requests = "*" rich = {version = "*", extras = ["jupyter"]} "ruamel.yaml" = "*" -sqlglot = {version = ">=25.27.0,<25.28.0", extras = ["rs"]} +setuptools = {version = "*", markers = "python_version >= \"3.12\""} +sqlglot = {version = ">=26.0.1,<26.1.0", extras = ["rs"]} tenacity = "*" -trino = {version = "*", optional = true, markers = "extra == \"trino\""} +time-machine = "*" [package.extras] athena = ["PyAthena[pandas]"] +azuresql = ["pymssql"] bigquery = ["google-cloud-bigquery-storage", "google-cloud-bigquery[pandas]"] -cicdtest = ["dbt-athena-community", "dbt-databricks", "dbt-redshift", "dbt-sqlserver (>=1.7.0)", "dbt-trino"] +cicdtest = ["dbt-athena-community", "dbt-clickhouse", "dbt-databricks", "dbt-redshift", "dbt-sqlserver (>=1.7.0)", "dbt-trino"] clickhouse = ["clickhouse-connect"] databricks = ["databricks-sql-connector"] dbt = ["dbt-core (<2)"] -dev = ["Faker", "PyGithub", "agate (==1.7.1)", "apache-airflow (==2.9.1)", "beautifulsoup4", "cryptography (>=42.0.4,<42.1.0)", "custom-materializations", "dbt-bigquery", "dbt-core", "dbt-duckdb (>=1.7.1)", "dbt-snowflake", "google-auth", "google-cloud-bigquery", "google-cloud-bigquery-storage", "mypy (>=1.10.0,<1.11.0)", "pandas-stubs", "pre-commit", "psycopg2-binary", "pydantic (<2.6.0)", "pyspark (>=3.5.0,<3.6.0)", "pytest", "pytest-asyncio (<0.23.0)", "pytest-mock", "pytest-retry", "pytest-xdist", "pytz", "ruff (>=0.4.0,<0.5.0)", "snowflake-connector-python[pandas,secure-local-storage] (>=3.0.2)", "sqlalchemy-stubs", "types-croniter", "types-dateparser", "types-python-dateutil", "types-pytz", "types-requests (==2.28.8)", "typing-extensions"] +dev = ["Faker", "PyAthena[pandas]", "PyGithub", "agate (==1.7.1)", "apache-airflow (==2.9.1)", "beautifulsoup4", "clickhouse-connect", "cryptography (>=42.0.4,<42.1.0)", "custom-materializations", "databricks-sql-connector", "dbt-bigquery", "dbt-core", "dbt-duckdb (>=1.7.1)", "dbt-snowflake", "google-auth", "google-cloud-bigquery", "google-cloud-bigquery-storage", "mypy (>=1.13.0,<1.14.0)", "opentelemetry-proto (==1.27.0)", "pandas-stubs", "pre-commit", "psycopg2-binary", "pydantic (<2.6.0)", "pyspark (>=3.5.0,<3.6.0)", "pytest", "pytest-asyncio (<0.23.0)", "pytest-mock", "pytest-retry", "pytest-xdist", "pytz", "ruff (>=0.7.0,<0.8.0)", "snowflake-connector-python[pandas,secure-local-storage] (>=3.0.2)", "sqlalchemy-stubs", "types-croniter", "types-dateparser", "types-python-dateutil", "types-pytz", "types-requests (==2.28.8)", "typing-extensions"] dlt = ["dlt"] gcppostgres = ["cloud-sql-python-connector[pg8000]"] github = ["PyGithub"] @@ -6599,11 +6589,11 @@ mssql = ["pymssql"] mwaa = ["boto3"] mysql = ["mysql-connector-python"] postgres = ["psycopg2"] -redshift = ["redshift-connector"] -slack = ["slack-sdk"] +redshift = ["redshift_connector"] +slack = ["slack_sdk"] snowflake = ["cryptography (>=42.0.4,<42.1.0)", "snowflake-connector-python[pandas,secure-local-storage]", "snowflake-snowpark-python"] trino = ["trino"] -web = ["fastapi (==0.110.2)", "pyarrow", "sse-starlette (>=0.2.2)", "uvicorn[standard] (==0.22.0)", "watchfiles (>=0.19.0)"] +web = ["fastapi (==0.115.5)", "pyarrow", "sse-starlette (>=0.2.2)", "uvicorn[standard] (==0.22.0)", "watchfiles (>=0.19.0)"] [[package]] name = "sqlparse" @@ -6775,6 +6765,74 @@ all = ["tornado (>=4.0)", "twisted"] tornado = ["tornado (>=4.0)"] twisted = ["twisted"] +[[package]] +name = "time-machine" +version = "2.16.0" +description = "Travel through time in your tests." +optional = false +python-versions = ">=3.9" +files = [ + {file = "time_machine-2.16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:09531af59fdfb39bfd24d28bd1e837eff5a5d98318509a31b6cfd57d27801e52"}, + {file = "time_machine-2.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:92d0b0f3c49f34dd76eb462f0afdc61ed1cb318c06c46d03e99b44ebb489bdad"}, + {file = "time_machine-2.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c29616e18e2349a8766d5b6817920fc74e39c00fa375d202231e9d525a1b882"}, + {file = "time_machine-2.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1ceb6035a64cb00650e3ab203cf3faffac18576a3f3125c24df468b784077c7"}, + {file = "time_machine-2.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64c205ea37b8c4ba232645335fc3b75bc2d03ce30f0a34649e36cae85652ee96"}, + {file = "time_machine-2.16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dfe92412bd11104c4f0fb2da68653e6c45b41f7217319a83a8b66ed4f20148b3"}, + {file = "time_machine-2.16.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d5fe7a6284e3dce87ae13a25029c53542dd27a28d151f3ef362ec4dd9c3e45fd"}, + {file = "time_machine-2.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0fca3025266d88d1b48be162a43b7c2d91c81cc5b3bee9f01194678ffb9969a"}, + {file = "time_machine-2.16.0-cp310-cp310-win32.whl", hash = "sha256:4149e17018af07a5756a1df84aea71e6e178598c358c860c6bfec42170fa7970"}, + {file = "time_machine-2.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:01bc257e9418980a4922de94775be42a966e1a082fb01a1635917f9afc7b84ca"}, + {file = "time_machine-2.16.0-cp310-cp310-win_arm64.whl", hash = "sha256:6895e3e84119594ab12847c928f619d40ae9cedd0755515dc154a5b5dc6edd9f"}, + {file = "time_machine-2.16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8f936566ef9f09136a3d5db305961ef6d897b76b240c9ff4199144aed6dd4fe5"}, + {file = "time_machine-2.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5886e23ede3478ca2a3e0a641f5d09dd784dfa9e48c96e8e5e31fc4fe77b6dc0"}, + {file = "time_machine-2.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c76caf539fa4941e1817b7c482c87c65c52a1903fea761e84525955c6106fafb"}, + {file = "time_machine-2.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:298aa423e07c8b21b991782f01d7749c871c792319c2af3e9755f9ab49033212"}, + {file = "time_machine-2.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3391ae9c484736850bb44ef125cbad52fe2d1b69e42c95dc88c43af8ead2cc7"}, + {file = "time_machine-2.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:503e7ff507c2089699d91885fc5b9c8ff16774a7b6aff48b4dcee0c0a0685b61"}, + {file = "time_machine-2.16.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eee7b0fc4fbab2c6585ea17606c6548be83919c70deea0865409fe9fc2d8cdce"}, + {file = "time_machine-2.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9db5e5b3ccdadaafa5730c2f9db44c38b013234c9ad01f87738907e19bdba268"}, + {file = "time_machine-2.16.0-cp311-cp311-win32.whl", hash = "sha256:2552f0767bc10c9d668f108fef9b487809cdeb772439ce932e74136365c69baf"}, + {file = "time_machine-2.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:12474fcdbc475aa6fe5275fe7224e685c5b9777f5939647f35980e9614ae7558"}, + {file = "time_machine-2.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:ac2df0fa564356384515ed62cb6679f33f1f529435b16b0ec0f88414635dbe39"}, + {file = "time_machine-2.16.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:84788f4d62a8b1bf5e499bb9b0e23ceceea21c415ad6030be6267ce3d639842f"}, + {file = "time_machine-2.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:15ec236b6571730236a193d9d6c11d472432fc6ab54e85eac1c16d98ddcd71bf"}, + {file = "time_machine-2.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cedc989717c8b44a3881ac3d68ab5a95820448796c550de6a2149ed1525157f0"}, + {file = "time_machine-2.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9d26d79de1c63a8c6586c75967e09b0ff306aa7e944a1eaddb74595c9b1839ca"}, + {file = "time_machine-2.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:317b68b56a9c3731e0cf8886e0f94230727159e375988b36c60edce0ddbcb44a"}, + {file = "time_machine-2.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:43e1e18279759897be3293a255d53e6b1cb0364b69d9591d0b80c51e461c94b0"}, + {file = "time_machine-2.16.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e43adb22def972a29d2b147999b56897116085777a0fea182fd93ee45730611e"}, + {file = "time_machine-2.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0c766bea27a0600e36806d628ebc4b47178b12fcdfb6c24dc0a566a9c06bfe7f"}, + {file = "time_machine-2.16.0-cp312-cp312-win32.whl", hash = "sha256:6dae82ab647d107817e013db82223e20a9853fa88543fec853ae326382d03c2e"}, + {file = "time_machine-2.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:265462c77dc9576267c3c7f20707780a171a9fdbac93ac22e608c309efd68c33"}, + {file = "time_machine-2.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:ef768e14768eebe3bb1196c0dece8e14c1c6991605721214a0c3c68cf77eb216"}, + {file = "time_machine-2.16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7751bf745d54e9e8b358c0afa332815da9b8a6194b26d0fd62876ab6c4d5c9c0"}, + {file = "time_machine-2.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1784edf173ca840ba154de6eed000b5727f65ab92972c2f88cec5c4d6349c5f2"}, + {file = "time_machine-2.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f5876a5682ce1f517e55d7ace2383432627889f6f7e338b961f99d684fd9e8d"}, + {file = "time_machine-2.16.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:806672529a2e255cd901f244c9033767dc1fa53466d0d3e3e49565a1572a64fe"}, + {file = "time_machine-2.16.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:667b150fedb54acdca2a4bea5bf6da837b43e6dd12857301b48191f8803ba93f"}, + {file = "time_machine-2.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:da3ae1028af240c0c46c79adf9c1acffecc6ed1701f2863b8132f5ceae6ae4b5"}, + {file = "time_machine-2.16.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:520a814ea1b2706c89ab260a54023033d3015abef25c77873b83e3d7c1fafbb2"}, + {file = "time_machine-2.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8243664438bb468408b29c6865958662d75e51f79c91842d2794fa22629eb697"}, + {file = "time_machine-2.16.0-cp313-cp313-win32.whl", hash = "sha256:32d445ce20d25c60ab92153c073942b0bac9815bfbfd152ce3dcc225d15ce988"}, + {file = "time_machine-2.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:f6927dda86425f97ffda36131f297b1a601c64a6ee6838bfa0e6d3149c2f0d9f"}, + {file = "time_machine-2.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:4d3843143c46dddca6491a954bbd0abfd435681512ac343169560e9bab504129"}, + {file = "time_machine-2.16.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:23c5283c01b4f80b7dfbc88f3d8088c06c301b94b7c35366be498c2d7b308549"}, + {file = "time_machine-2.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ac95ae4529d7d85b251f9cf0f961a8a408ba285875811268f469d824a3b0b15a"}, + {file = "time_machine-2.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfb76674db946a74f0ca6e3b81caa8265e35dafe9b7005c7d2b8dd5bbd3825cf"}, + {file = "time_machine-2.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0b6ff3ccde9b16bbc694a2b5facf2d8890554f3135ff626ed1429e270e3cc4f"}, + {file = "time_machine-2.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1906ec6e26e6b803cd6aab28d420c87285b9c209ff2a69f82d12f82278f78bb"}, + {file = "time_machine-2.16.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e46bd09c944ec7a20868abd2b83d7d7abdaf427775e9df3089b9226a122b340f"}, + {file = "time_machine-2.16.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cac3e2b4101db296b150cb665e5461c03621e6ede6117fc9d5048c0ec96d6e7c"}, + {file = "time_machine-2.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e0dcc97cfec12ae306e3036746e7631cc7ef65c31889f7264c25217d4938367"}, + {file = "time_machine-2.16.0-cp39-cp39-win32.whl", hash = "sha256:c761d32d0c5d1fe5b71ac502e1bd5edec4598a7fc6f607b9b906b98e911148ce"}, + {file = "time_machine-2.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:ddfab1c622342f2945942c5c2d6be327656980e8f2d2b2ce0c022d0aa3711361"}, + {file = "time_machine-2.16.0-cp39-cp39-win_arm64.whl", hash = "sha256:2e08a4015d5d1aab2cb46c780e85b33efcd5cbe880bb363b282a6972e617b8bb"}, + {file = "time_machine-2.16.0.tar.gz", hash = "sha256:4a99acc273d2f98add23a89b94d4dd9e14969c01214c8514bfa78e4e9364c7e2"}, +] + +[package.dependencies] +python-dateutil = "*" + [[package]] name = "toml" version = "0.10.2" @@ -6916,31 +6974,6 @@ files = [ docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] -[[package]] -name = "trino" -version = "0.331.0" -description = "Client for the Trino distributed SQL Engine" -optional = false -python-versions = ">=3.9" -files = [ - {file = "trino-0.331.0-py3-none-any.whl", hash = "sha256:4f909e6c2966d23917e2538bc7f342d5dcc6e512102811fb1e53bdaf15bd49e3"}, - {file = "trino-0.331.0.tar.gz", hash = "sha256:2d9acdf7b19d136c97c98e55599fb9a5556e124282b0a40afb93bdfbb5371708"}, -] - -[package.dependencies] -python-dateutil = "*" -pytz = "*" -requests = ">=2.31.0" -tzlocal = "*" - -[package.extras] -all = ["requests_kerberos", "sqlalchemy (>=1.3)"] -external-authentication-token-cache = ["keyring"] -gssapi = ["krb5 (==0.5.1)", "requests_gssapi"] -kerberos = ["requests_kerberos"] -sqlalchemy = ["sqlalchemy (>=1.3)"] -tests = ["black", "httpretty (<1.1)", "isort", "keyring", "krb5 (==0.5.1)", "pre-commit", "pytest", "pytest-runner", "requests_gssapi", "requests_kerberos", "sqlalchemy (>=1.3)"] - [[package]] name = "typer" version = "0.15.1" @@ -7684,4 +7717,4 @@ cffi = ["cffi (>=1.11)"] [metadata] lock-version = "2.0" python-versions = "^3.12,<3.13" -content-hash = "d34c20fd2b3ef341b2a4fb6d418a4ac512e03eb76ea55210f03322c00477ad83" +content-hash = "862623b53b4d026ad2cb7bdd8e2409e047593008c8f2cfc455c42e4c558ffae6" diff --git a/pyproject.toml b/pyproject.toml index 189b0d2b3..08dd5949f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -59,7 +59,7 @@ sqlalchemy = "^2.0.25" textual = "^0.52.1" redis = "^5.0.7" githubkit = "^0.11.6" -sqlmesh = { extras = ["trino"], version = "^0.129.0" } +sqlmesh = "^0.141.1" dagster-duckdb = "^0.24.0" dagster-duckdb-polars = "^0.24.0" google-cloud-bigquery-storage = "^2.25.0" diff --git a/warehouse/metrics_mesh/config.py b/warehouse/metrics_mesh/config.py index f27971ee2..d00deca21 100644 --- a/warehouse/metrics_mesh/config.py +++ b/warehouse/metrics_mesh/config.py @@ -21,6 +21,9 @@ connection=DuckDBConnectionConfig( database=os.environ.get("SQLMESH_DUCKDB_LOCAL_PATH") ), + test_connection=DuckDBConnectionConfig( + database="/Users/raven/testing-duckdb.db", + ), variables={ "oso_source_db": "sources", }, diff --git a/warehouse/metrics_mesh/models/events_daily_to_artifact.sql b/warehouse/metrics_mesh/models/events_daily_to_artifact.sql index ac40d881d..20b472192 100644 --- a/warehouse/metrics_mesh/models/events_daily_to_artifact.sql +++ b/warehouse/metrics_mesh/models/events_daily_to_artifact.sql @@ -36,4 +36,4 @@ GROUP BY to_artifact_id, event_source, event_type, - DATE_TRUNC('DAY', time::DATE) \ No newline at end of file + DATE_TRUNC('DAY', time::DATE) diff --git a/warehouse/metrics_mesh/tests/test_events_daily_to_artifact.yml b/warehouse/metrics_mesh/tests/test_events_daily_to_artifact.yml index d78446d09..3b4951d31 100644 --- a/warehouse/metrics_mesh/tests/test_events_daily_to_artifact.yml +++ b/warehouse/metrics_mesh/tests/test_events_daily_to_artifact.yml @@ -11,43 +11,43 @@ test_events_daily_to_artifact: from_artifact_id: user_0 event_source: BLOCKCHAIN event_type: CONTRACT_INVOCATION_SUCCESS_DAILY_COUNT - time: 2024-01-01T00:00:00Z + time: "2024-01-01 00:00:00+00:00" amount: 10 - to_artifact_id: contract_1 from_artifact_id: user_0 event_source: BLOCKCHAIN event_type: CONTRACT_INVOCATION_SUCCESS_DAILY_COUNT - time: 2024-01-01T00:00:00Z + time: "2024-01-01 00:00:00+00:00" amount: 10 - to_artifact_id: repo_0 from_artifact_id: dev_0 event_source: SOURCE_PROVIDER event_type: COMMIT_CODE - time: 2024-01-01T02:00:00Z + time: "2024-01-01 02:00:00+00:00" amount: 1 - to_artifact_id: repo_0 from_artifact_id: dev_0 event_source: SOURCE_PROVIDER event_type: COMMIT_CODE - time: 2024-01-01T03:00:00Z + time: "2024-01-01 03:00:00+00:00" amount: 1 - to_artifact_id: repo_0 from_artifact_id: dev_0 event_source: SOURCE_PROVIDER event_type: COMMIT_CODE - time: 2024-01-01T04:00:00Z + time: "2024-01-01 04:00:00+00:00" amount: 1 - to_artifact_id: repo_0 from_artifact_id: dev_1 event_source: SOURCE_PROVIDER event_type: COMMIT_CODE - time: 2024-01-01T04:00:00Z + time: "2024-01-01 04:00:00+00:00" amount: 1 - to_artifact_id: repo_0 from_artifact_id: dev_1 event_source: SOURCE_PROVIDER event_type: COMMIT_CODE - time: 2024-01-02T04:00:00Z + time: "2024-01-02 04:00:00+00:00" amount: 1 outputs: query: diff --git a/warehouse/metrics_tools/factory/__init__.py b/warehouse/metrics_tools/factory/__init__.py index f0caa6c32..48978f0c7 100644 --- a/warehouse/metrics_tools/factory/__init__.py +++ b/warehouse/metrics_tools/factory/__init__.py @@ -1,4 +1,4 @@ # ruff: noqa: F403 -from .factory import * from ..definition import * +from .factory import * diff --git a/warehouse/metrics_tools/factory/constants.py b/warehouse/metrics_tools/factory/constants.py new file mode 100644 index 000000000..0bd1cbb21 --- /dev/null +++ b/warehouse/metrics_tools/factory/constants.py @@ -0,0 +1,35 @@ +import typing as t + +from sqlglot import exp + +TIME_AGGREGATION_TO_CRON = { + "daily": "@daily", + "monthly": "@monthly", + "weekly": "@weekly", +} +METRICS_COLUMNS_BY_ENTITY: t.Dict[str, t.Dict[str, exp.DataType]] = { + "artifact": { + "metrics_sample_date": exp.DataType.build("DATE", dialect="duckdb"), + "event_source": exp.DataType.build("STRING", dialect="duckdb"), + "to_artifact_id": exp.DataType.build("STRING", dialect="duckdb"), + "from_artifact_id": exp.DataType.build("STRING", dialect="duckdb"), + "metric": exp.DataType.build("STRING", dialect="duckdb"), + "amount": exp.DataType.build("DOUBLE", dialect="duckdb"), + }, + "project": { + "metrics_sample_date": exp.DataType.build("DATE", dialect="duckdb"), + "event_source": exp.DataType.build("STRING", dialect="duckdb"), + "to_project_id": exp.DataType.build("STRING", dialect="duckdb"), + "from_artifact_id": exp.DataType.build("STRING", dialect="duckdb"), + "metric": exp.DataType.build("STRING", dialect="duckdb"), + "amount": exp.DataType.build("DOUBLE", dialect="duckdb"), + }, + "collection": { + "metrics_sample_date": exp.DataType.build("DATE", dialect="duckdb"), + "event_source": exp.DataType.build("STRING", dialect="duckdb"), + "to_collection_id": exp.DataType.build("STRING", dialect="duckdb"), + "from_artifact_id": exp.DataType.build("STRING", dialect="duckdb"), + "metric": exp.DataType.build("STRING", dialect="duckdb"), + "amount": exp.DataType.build("DOUBLE", dialect="duckdb"), + }, +} diff --git a/warehouse/metrics_tools/factory/factory.py b/warehouse/metrics_tools/factory/factory.py index faed05716..8940fc8a8 100644 --- a/warehouse/metrics_tools/factory/factory.py +++ b/warehouse/metrics_tools/factory/factory.py @@ -1,23 +1,19 @@ -import contextlib import inspect import logging import os import textwrap import typing as t from dataclasses import dataclass, field -from datetime import datetime +from pathlib import Path from queue import PriorityQueue -import pandas as pd -import sqlglot as sql -from metrics_tools.compute.client import Client -from metrics_tools.compute.types import ExportType from metrics_tools.definition import ( MetricQuery, PeerMetricDependencyRef, TimeseriesMetricsOptions, reference_to_str, ) +from metrics_tools.factory import constants from metrics_tools.joiner import JoinerTransform from metrics_tools.macros import ( metrics_end, @@ -30,21 +26,14 @@ metrics_start, relative_window_sample_date, ) -from metrics_tools.models import GeneratedModel, GeneratedPythonModel -from metrics_tools.runner import MetricsRunner +from metrics_tools.models import MacroOverridingModel from metrics_tools.transformer import ( IntermediateMacroEvaluatorTransform, SQLTransformer, ) from metrics_tools.transformer.qualify import QualifyTransform -from metrics_tools.transformer.tables import ExecutionContextTableTransform -from metrics_tools.utils import env from metrics_tools.utils.logging import add_metrics_tools_to_sqlmesh_logging -from metrics_tools.utils.tables import create_dependent_tables_map from sqlglot import exp -from sqlmesh import ExecutionContext -from sqlmesh.core.dialect import parse_one -from sqlmesh.core.macros import MacroEvaluator from sqlmesh.core.model import ModelKindName logger = logging.getLogger(__name__) @@ -55,60 +44,6 @@ CURR_DIR = os.path.dirname(__file__) QUERIES_DIR = os.path.abspath(os.path.join(CURR_DIR, "../../metrics_mesh/oso_metrics")) -TIME_AGGREGATION_TO_CRON = { - "daily": "@daily", - "monthly": "@monthly", - "weekly": "@weekly", -} -METRICS_COLUMNS_BY_ENTITY: t.Dict[str, t.Dict[str, exp.DataType]] = { - "artifact": { - "metrics_sample_date": exp.DataType.build("DATE", dialect="duckdb"), - "event_source": exp.DataType.build("STRING", dialect="duckdb"), - "to_artifact_id": exp.DataType.build("STRING", dialect="duckdb"), - "from_artifact_id": exp.DataType.build("STRING", dialect="duckdb"), - "metric": exp.DataType.build("STRING", dialect="duckdb"), - "amount": exp.DataType.build("DOUBLE", dialect="duckdb"), - }, - "project": { - "metrics_sample_date": exp.DataType.build("DATE", dialect="duckdb"), - "event_source": exp.DataType.build("STRING", dialect="duckdb"), - "to_project_id": exp.DataType.build("STRING", dialect="duckdb"), - "from_artifact_id": exp.DataType.build("STRING", dialect="duckdb"), - "metric": exp.DataType.build("STRING", dialect="duckdb"), - "amount": exp.DataType.build("DOUBLE", dialect="duckdb"), - }, - "collection": { - "metrics_sample_date": exp.DataType.build("DATE", dialect="duckdb"), - "event_source": exp.DataType.build("STRING", dialect="duckdb"), - "to_collection_id": exp.DataType.build("STRING", dialect="duckdb"), - "from_artifact_id": exp.DataType.build("STRING", dialect="duckdb"), - "metric": exp.DataType.build("STRING", dialect="duckdb"), - "amount": exp.DataType.build("DOUBLE", dialect="duckdb"), - }, -} - - -@contextlib.contextmanager -def metric_ref_evaluator_context( - evaluator: MacroEvaluator, - ref: PeerMetricDependencyRef, - extra_vars: t.Optional[t.Dict[str, t.Any]] = None, -): - before = evaluator.locals.copy() - evaluator.locals.update(extra_vars or {}) - evaluator.locals.update( - { - "rolling_window": ref.get("window"), - "rolling_unit": ref.get("unit"), - "time_aggregation": ref.get("time_aggregation"), - "entity_type": ref.get("entity_type"), - } - ) - try: - yield - finally: - evaluator.locals = before - class MetricQueryConfig(t.TypedDict): table_name: str @@ -351,6 +286,8 @@ def queue_query(name: str): def generate_models(self, calling_file: str): """Generates sqlmesh models for all the configured metrics definitions""" + from metrics_tools.factory.proxy.proxies import join_all_of_entity_type + # Generate the models for _, query_config, dependencies in self.generate_ordered_queries(): @@ -359,28 +296,38 @@ def generate_models(self, calling_file: str): ) # Join all of the models of the same entity type into the same view model + override_path = Path(inspect.getfile(join_all_of_entity_type)) + override_module_path = Path( + os.path.dirname(inspect.getfile(join_all_of_entity_type)) + ) for entity_type, tables in self._marts_tables.items(): - GeneratedModel.create( - func=join_all_of_entity_type, - entrypoint_path=calling_file, - config={ - "db": self.catalog, - "tables": tables, - "columns": list(METRICS_COLUMNS_BY_ENTITY[entity_type].keys()), - }, + MacroOverridingModel( + additional_macros=[], + override_module_path=override_module_path, + override_path=override_path, + locals=dict( + config={ + "db": self.catalog, + "tables": tables, + "columns": list( + constants.METRICS_COLUMNS_BY_ENTITY[entity_type].keys() + ), + } + ), name=f"metrics.timeseries_metrics_to_{entity_type}", + is_sql=True, kind="VIEW", dialect="clickhouse", start=self._raw_options["start"], columns={ - k: METRICS_COLUMNS_BY_ENTITY[entity_type][k] + k: constants.METRICS_COLUMNS_BY_ENTITY[entity_type][k] for k in filter( lambda col: col not in ["event_source"], - METRICS_COLUMNS_BY_ENTITY[entity_type].keys(), + constants.METRICS_COLUMNS_BY_ENTITY[entity_type].keys(), ) }, enabled=self._raw_options.get("enabled", True), - ) + )(join_all_of_entity_type) logger.info("model generation complete") def generate_model_for_rendered_query( @@ -406,6 +353,8 @@ def generate_rolling_python_model_for_rendered_query( query_config: MetricQueryConfig, dependencies: t.Set[str], ): + from metrics_tools.factory.proxy.proxies import generated_rolling_query_proxy + depends_on = set() for dep in dependencies: depends_on.add(f"{self.catalog}.{dep}") @@ -413,7 +362,7 @@ def generate_rolling_python_model_for_rendered_query( ref = query_config["ref"] query = query_config["query"] - columns = METRICS_COLUMNS_BY_ENTITY[ref["entity_type"]] + columns = constants.METRICS_COLUMNS_BY_ENTITY[ref["entity_type"]] kind_common = { "batch_size": ref.get("batch_size", 365), @@ -435,12 +384,15 @@ def generate_rolling_python_model_for_rendered_query( "metrics_sample_date", ] - return GeneratedPythonModel.create( + # Override the path and module so that sqlmesh generates the + # proper python_env for the model + override_path = Path(inspect.getfile(generated_rolling_query_proxy)) + override_module_path = Path( + os.path.dirname(inspect.getfile(generated_rolling_query_proxy)) + ) + return MacroOverridingModel( name=f"{self.catalog}.{query_config['table_name']}", - func=generated_rolling_query_proxy, - entrypoint_path=calling_file, - additional_macros=self.generated_model_additional_macros, - variables=self.serializable_config(query_config), + is_sql=False, depends_on=depends_on, columns=columns, kind={ @@ -452,9 +404,12 @@ def generate_rolling_python_model_for_rendered_query( cron=cron, start=self._raw_options["start"], grain=grain, - imports={"pd": pd, "generated_rolling_query": generated_rolling_query}, enabled=self._raw_options.get("enabled", True), - ) + additional_macros=self.generated_model_additional_macros, + locals=self.serializable_config(query_config), + override_module_path=override_module_path, + override_path=override_path, + )(generated_rolling_query_proxy) def generate_time_aggregation_model_for_rendered_query( self, @@ -463,12 +418,12 @@ def generate_time_aggregation_model_for_rendered_query( dependencies: t.Set[str], ): """Generate model for time aggregation models""" - # Use a simple python sql model to generate the time_aggregation model - config = self.serializable_config(query_config) + from metrics_tools.factory.proxy.proxies import generated_query + # Use a simple python sql model to generate the time_aggregation model ref = query_config["ref"] - columns = METRICS_COLUMNS_BY_ENTITY[ref["entity_type"]] + columns = constants.METRICS_COLUMNS_BY_ENTITY[ref["entity_type"]] time_aggregation = ref.get("time_aggregation") assert time_aggregation is not None @@ -493,12 +448,13 @@ def generate_time_aggregation_model_for_rendered_query( "event_source", "metrics_sample_date", ] - cron = TIME_AGGREGATION_TO_CRON[time_aggregation] + cron = constants.TIME_AGGREGATION_TO_CRON[time_aggregation] - GeneratedModel.create( - func=generated_query, - entrypoint_path=calling_file, - config=config, + # Override the path and module so that sqlmesh generates the + # proper python_env for the model + override_path = Path(inspect.getfile(generated_query)) + override_module_path = Path(os.path.dirname(inspect.getfile(generated_query))) + return MacroOverridingModel( name=f"{self.catalog}.{query_config['table_name']}", kind={ "name": ModelKindName.INCREMENTAL_BY_TIME_RANGE, @@ -506,14 +462,18 @@ def generate_time_aggregation_model_for_rendered_query( **kind_options, }, dialect="clickhouse", + is_sql=True, columns=columns, grain=grain, cron=cron, start=self._raw_options["start"], - additional_macros=self.generated_model_additional_macros, partitioned_by=partitioned_by, enabled=self._raw_options.get("enabled", True), - ) + additional_macros=self.generated_model_additional_macros, + locals=self.serializable_config(query_config), + override_module_path=override_module_path, + override_path=override_path, + )(generated_query) def serializable_config(self, query_config: MetricQueryConfig): # Use a simple python sql model to generate the time_aggregation model @@ -558,195 +518,3 @@ def timeseries_metrics( GLOBAL_TIMESERIES_METRICS[calling_file] = timeseries_metrics return timeseries_metrics.generate_models(calling_file) - - -def join_all_of_entity_type( - evaluator: MacroEvaluator, *, db: str, tables: t.List[str], columns: t.List[str] -): - # A bit of a hack but we know we have a "metric" column. We want to - # transform this metric id to also include the event_source as a prefix to - # that metric id in the joined table - transformed_columns = [] - for column in columns: - if column == "event_source": - continue - if column == "metric": - transformed_columns.append( - exp.alias_( - exp.Concat( - expressions=[ - exp.to_column("event_source"), - exp.Literal(this="_", is_string=True), - exp.to_column(column), - ], - safe=False, - coalesce=False, - ), - alias="metric", - ) - ) - else: - transformed_columns.append(column) - - query = exp.select(*transformed_columns).from_(sql.to_table(f"{db}.{tables[0]}")) - for table in tables[1:]: - query = query.union( - exp.select(*transformed_columns).from_(sql.to_table(f"{db}.{table}")), - distinct=False, - ) - # Calculate the correct metric_id for all of the entity types - return query - - -def generated_query( - evaluator: MacroEvaluator, - *, - rendered_query_str: str, - ref: PeerMetricDependencyRef, - table_name: str, - vars: t.Dict[str, t.Any], -): - """Simple generated query executor for metrics queries""" - - with metric_ref_evaluator_context(evaluator, ref, vars): - result = evaluator.transform(parse_one(rendered_query_str)) - return result - - -def generated_rolling_query( - context: ExecutionContext, - start: datetime, - end: datetime, - execution_time: datetime, - ref: PeerMetricDependencyRef, - vars: t.Dict[str, t.Any], - rendered_query_str: str, - table_name: str, - sqlmesh_vars: t.Dict[str, t.Any], - gateway: str | None, - *_ignored, -): - """Generates a rolling query for the given metrics query - - If SQLMESH_MCS_ENABLED is set to true, the query will be sent to the metrics - calculation service. Otherwise, the query will be executed as a rolling - query using dataframes (this can be very slow on remote data sources of - non-trivial size). - - This currently takes advantage of a potential hack in sqlmesh. The snapshot - evaluator nor the scheduler in sqlmesh seem to care what the response is - from the python model as long as it's either a dataframe OR a sqlglot - expression. This means we can return a sqlglot expression that takes the - ExportReference from the metrics calculation service and use it as a table - in the sqlmesh query. - - If configured correctly, the metrics calculation service will export a trino - database in production and if testing, it can export a "LOCALFS" export - which gives you a path to parquet file with random data (that satisfies the - requested schema). - """ - # Transform the query for the current context - transformer = SQLTransformer(transforms=[ExecutionContextTableTransform(context)]) - query = transformer.transform(rendered_query_str) - locals = vars.copy() - locals.update(sqlmesh_vars) - - mcs_enabled = env.ensure_bool("SQLMESH_MCS_ENABLED", False) - if not mcs_enabled: - runner = MetricsRunner.from_sqlmesh_context(context, query, ref, locals) - df = runner.run_rolling(start, end) - # If the rolling window is empty we need to yield from an empty tuple - # otherwise sqlmesh fails. See: - # https://sqlmesh.readthedocs.io/en/latest/concepts/models/python_models/#returning-empty-dataframes - total = 0 - if df.empty: - yield from () - else: - count = len(df) - total += count - logger.debug(f"table={table_name} yielding rows {count}") - yield df - logger.debug(f"table={table_name} yielded rows{total}") - else: - logger.info("metrics calculation service enabled") - - mcs_url = env.required_str("SQLMESH_MCS_URL") - mcs_client = Client.from_url(url=mcs_url) - - columns = [ - (col_name, col_type.sql(dialect="duckdb")) - for col_name, col_type in METRICS_COLUMNS_BY_ENTITY[ - ref["entity_type"] - ].items() - ] - - response = mcs_client.calculate_metrics( - query_str=rendered_query_str, - start=start, - end=end, - dialect="duckdb", - batch_size=env.ensure_int("SQLMESH_MCS_BATCH_SIZE", 10), - columns=columns, - ref=ref, - slots=ref.get("slots", env.ensure_int("SQLMESH_DEFAULT_MCS_SLOTS", 2)), - locals=sqlmesh_vars, - dependent_tables_map=create_dependent_tables_map( - context, rendered_query_str - ), - job_retries=env.ensure_int("SQLMESH_MCS_JOB_RETRIES", 5), - cluster_min_size=env.ensure_int("SQLMESH_MCS_CLUSTER_MIN_SIZE", 0), - cluster_max_size=env.ensure_int("SQLMESH_MCS_CLUSTER_MAX_SIZE", 30), - ) - - column_names = list(map(lambda col: col[0], columns)) - engine_dialect = context.engine_adapter.dialect - - if engine_dialect == "duckdb": - if response.type not in [ExportType.GCS, ExportType.LOCALFS]: - raise Exception(f"ExportType={response.type} not supported for duckdb") - # Create a select query from the exported data - path = response.payload.get("local_path", response.payload.get("gcs_path")) - select_query = exp.select(*column_names).from_( - exp.Anonymous( - this="read_parquet", - expressions=[exp.Literal(this=path, is_string=True)], - ), - ) - elif engine_dialect == "trino": - if response.type not in [ExportType.TRINO]: - raise Exception(f"ExportType={response.type} not supported for trino") - select_query = exp.select(*column_names).from_(response.table_fqn()) - else: - raise Exception(f"Dialect={context.engine_adapter.dialect} not supported") - yield select_query - - -def generated_rolling_query_proxy( - context: ExecutionContext, - start: datetime, - end: datetime, - execution_time: datetime, - ref: PeerMetricDependencyRef, - vars: t.Dict[str, t.Any], - rendered_query_str: str, - table_name: str, - sqlmesh_vars: t.Dict[str, t.Any], - **kwargs, -) -> t.Iterator[pd.DataFrame | exp.Expression]: - """This acts as the proxy to the actual function that we'd call for - the metrics model.""" - - yield from generated_rolling_query( - context, - start, - end, - execution_time, - ref, - vars, - rendered_query_str, - table_name, - sqlmesh_vars, - context.gateway, - # Change the following variable to force reevaluation. Hack for now. - "version=v5", - ) diff --git a/warehouse/metrics_tools/factory/generated.py b/warehouse/metrics_tools/factory/generated.py new file mode 100644 index 000000000..200447757 --- /dev/null +++ b/warehouse/metrics_tools/factory/generated.py @@ -0,0 +1,124 @@ +import logging +import typing as t +from datetime import datetime + +from metrics_tools.compute.client import Client +from metrics_tools.compute.types import ExportType +from metrics_tools.definition import PeerMetricDependencyRef +from metrics_tools.factory.constants import METRICS_COLUMNS_BY_ENTITY +from metrics_tools.runner import MetricsRunner +from metrics_tools.transformer import SQLTransformer +from metrics_tools.transformer.tables import ExecutionContextTableTransform +from metrics_tools.utils import env +from metrics_tools.utils.tables import create_dependent_tables_map +from sqlglot import exp +from sqlmesh import ExecutionContext + +logger = logging.getLogger(__name__) + + +def generated_rolling_query( + context: ExecutionContext, + start: datetime, + end: datetime, + execution_time: datetime, + ref: PeerMetricDependencyRef, + vars: t.Dict[str, t.Any], + rendered_query_str: str, + table_name: str, + gateway: str | None, + *_ignored, +): + """Generates a rolling query for the given metrics query + + If SQLMESH_MCS_ENABLED is set to true, the query will be sent to the metrics + calculation service. Otherwise, the query will be executed as a rolling + query using dataframes (this can be very slow on remote data sources of + non-trivial size). + + This currently takes advantage of a potential hack in sqlmesh. The snapshot + evaluator nor the scheduler in sqlmesh seem to care what the response is + from the python model as long as it's either a dataframe OR a sqlglot + expression. This means we can return a sqlglot expression that takes the + ExportReference from the metrics calculation service and use it as a table + in the sqlmesh query. + + If configured correctly, the metrics calculation service will export a trino + database in production and if testing, it can export a "LOCALFS" export + which gives you a path to parquet file with random data (that satisfies the + requested schema). + """ + # Transform the query for the current context + transformer = SQLTransformer(transforms=[ExecutionContextTableTransform(context)]) + query = transformer.transform(rendered_query_str) + + mcs_enabled = env.ensure_bool("SQLMESH_MCS_ENABLED", False) + if not mcs_enabled: + runner = MetricsRunner.from_sqlmesh_context( + context, query, ref, context._variables.copy() + ) + df = runner.run_rolling(start, end) + # If the rolling window is empty we need to yield from an empty tuple + # otherwise sqlmesh fails. See: + # https://sqlmesh.readthedocs.io/en/latest/concepts/models/python_models/#returning-empty-dataframes + total = 0 + if df.empty: + yield from () + else: + count = len(df) + total += count + logger.debug(f"table={table_name} yielding rows {count}") + yield df + logger.debug(f"table={table_name} yielded rows{total}") + else: + logger.info("metrics calculation service enabled") + + mcs_url = env.required_str("SQLMESH_MCS_URL") + mcs_client = Client.from_url(url=mcs_url) + + columns = [ + (col_name, col_type.sql(dialect="duckdb")) + for col_name, col_type in METRICS_COLUMNS_BY_ENTITY[ + ref["entity_type"] + ].items() + ] + + response = mcs_client.calculate_metrics( + query_str=rendered_query_str, + start=start, + end=end, + dialect="duckdb", + batch_size=env.ensure_int("SQLMESH_MCS_BATCH_SIZE", 10), + columns=columns, + ref=ref, + slots=ref.get("slots", env.ensure_int("SQLMESH_DEFAULT_MCS_SLOTS", 2)), + locals=context._variables, + dependent_tables_map=create_dependent_tables_map( + context, rendered_query_str + ), + job_retries=env.ensure_int("SQLMESH_MCS_JOB_RETRIES", 5), + cluster_min_size=env.ensure_int("SQLMESH_MCS_CLUSTER_MIN_SIZE", 0), + cluster_max_size=env.ensure_int("SQLMESH_MCS_CLUSTER_MAX_SIZE", 30), + ) + + column_names = list(map(lambda col: col[0], columns)) + engine_dialect = context.engine_adapter.dialect + + if engine_dialect == "duckdb": + if response.type not in [ExportType.GCS, ExportType.LOCALFS]: + raise Exception(f"ExportType={response.type} not supported for duckdb") + # Create a select query from the exported data + path = response.payload.get("local_path", response.payload.get("gcs_path")) + select_query = exp.select(*column_names).from_( + exp.Anonymous( + this="read_parquet", + expressions=[exp.Literal(this=path, is_string=True)], + ), + ) + elif engine_dialect == "trino": + if response.type not in [ExportType.TRINO]: + raise Exception(f"ExportType={response.type} not supported for trino") + select_query = exp.select(*column_names).from_(response.table_fqn()) + else: + raise Exception(f"Dialect={context.engine_adapter.dialect} not supported") + yield select_query diff --git a/warehouse/metrics_tools/factory/proxy/__init__.py b/warehouse/metrics_tools/factory/proxy/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/warehouse/metrics_tools/factory/proxy/proxies.py b/warehouse/metrics_tools/factory/proxy/proxies.py new file mode 100644 index 000000000..9628129f1 --- /dev/null +++ b/warehouse/metrics_tools/factory/proxy/proxies.py @@ -0,0 +1,102 @@ +import typing as t +from datetime import datetime + +import pandas as pd +import sqlglot as sql +from metrics_tools.definition import PeerMetricDependencyRef +from metrics_tools.factory.generated import generated_rolling_query +from metrics_tools.factory.utils import metric_ref_evaluator_context +from sqlglot import exp +from sqlmesh import ExecutionContext +from sqlmesh.core.dialect import parse_one +from sqlmesh.core.macros import MacroEvaluator + + +def generated_query( + evaluator: MacroEvaluator, +): + """Simple generated query executor for metrics queries""" + rendered_query_str = t.cast(str, evaluator.var("rendered_query_str")) + ref = t.cast(PeerMetricDependencyRef, evaluator.var("ref")) + + with metric_ref_evaluator_context(evaluator, ref): + result = evaluator.transform(parse_one(rendered_query_str)) + return result + + +def generated_rolling_query_proxy( + context: ExecutionContext, + start: datetime, + end: datetime, + execution_time: datetime, + # *, + # ref: PeerMetricDependencyRef, + # vars: t.Dict[str, t.Any], + # rendered_query_str: str, + # table_name: str, + # sqlmesh_vars: t.Dict[str, t.Any], + **kwargs, +) -> t.Iterator[pd.DataFrame | exp.Expression]: + """This acts as the proxy to the actual function that we'd call for + the metrics model.""" + ref = t.cast(PeerMetricDependencyRef, context.var("ref")) + vars = t.cast(t.Dict[str, t.Any], context.var("vars")) + rendered_query_str = t.cast(str, context.var("rendered_query_str")) + table_name = t.cast(str, context.var("table_name")) + + yield from generated_rolling_query( + context, + start, + end, + execution_time, + ref, + vars, + rendered_query_str, + table_name, + context.gateway, + # Change the following variable to force reevaluation. Hack for now. + "version=v5", + ) + + +def join_all_of_entity_type( + evaluator: MacroEvaluator, +): + # A bit of a hack but we know we have a "metric" column. We want to + # transform this metric id to also include the event_source as a prefix to + # that metric id in the joined table + + db = t.cast(str, evaluator.var("db")) + tables: t.List[str] = t.cast(t.List[str], evaluator.var("tables")) + columns: t.List[str] = t.cast(t.List[str], evaluator.var("columns")) + + transformed_columns = [] + for column in columns: + if column == "event_source": + continue + if column == "metric": + transformed_columns.append( + exp.alias_( + exp.Concat( + expressions=[ + exp.to_column("event_source"), + exp.Literal(this="_", is_string=True), + exp.to_column(column), + ], + safe=False, + coalesce=False, + ), + alias="metric", + ) + ) + else: + transformed_columns.append(column) + + query = exp.select(*transformed_columns).from_(sql.to_table(f"{db}.{tables[0]}")) + for table in tables[1:]: + query = query.union( + exp.select(*transformed_columns).from_(sql.to_table(f"{db}.{table}")), + distinct=False, + ) + # Calculate the correct metric_id for all of the entity types + return query diff --git a/warehouse/metrics_tools/factory/utils.py b/warehouse/metrics_tools/factory/utils.py new file mode 100644 index 000000000..3a1d7fd8a --- /dev/null +++ b/warehouse/metrics_tools/factory/utils.py @@ -0,0 +1,27 @@ +import typing as t +from contextlib import contextmanager + +from metrics_tools.definition import PeerMetricDependencyRef +from sqlmesh.core.macros import MacroEvaluator + + +@contextmanager +def metric_ref_evaluator_context( + evaluator: MacroEvaluator, + ref: PeerMetricDependencyRef, + extra_vars: t.Optional[t.Dict[str, t.Any]] = None, +): + before = evaluator.locals.copy() + evaluator.locals.update(extra_vars or {}) + evaluator.locals.update( + { + "rolling_window": ref.get("window"), + "rolling_unit": ref.get("unit"), + "time_aggregation": ref.get("time_aggregation"), + "entity_type": ref.get("entity_type"), + } + ) + try: + yield + finally: + evaluator.locals = before diff --git a/warehouse/metrics_tools/models.py b/warehouse/metrics_tools/models.py index 22fff8646..f2be3e152 100644 --- a/warehouse/metrics_tools/models.py +++ b/warehouse/metrics_tools/models.py @@ -1,19 +1,14 @@ import inspect import json import logging -import re import textwrap import typing as t import uuid from pathlib import Path -from sqlglot import exp from sqlmesh.core import constants as c -from sqlmesh.core.dialect import MacroFunc from sqlmesh.core.macros import ExecutableOrMacro, MacroRegistry, macro from sqlmesh.core.model.decorator import model -from sqlmesh.core.model.definition import create_python_model, create_sql_model -from sqlmesh.utils.jinja import JinjaMacroRegistry from sqlmesh.utils.metaprogramming import ( Executable, ExecutableKind, @@ -27,248 +22,39 @@ CallableAliasList = t.List[t.Callable | t.Tuple[t.Callable, t.List[str]]] -class GeneratedPythonModel: - @classmethod - def create( - cls, - *, - name: str, - entrypoint_path: str, - func: t.Callable, - columns: t.Dict[str, exp.DataType], - additional_macros: t.Optional[CallableAliasList] = None, - variables: t.Optional[t.Dict[str, t.Any]] = None, - imports: t.Optional[t.Dict[str, t.Any]] = None, - **kwargs, - ): - instance = cls( - name=name, - entrypoint_path=entrypoint_path, - func=func, - additional_macros=additional_macros or [], - variables=variables or {}, - columns=columns, - imports=imports or {}, - **kwargs, - ) - registry = model.registry() - registry[name] = instance - return instance - +class MacroOverridingModel(model): def __init__( self, - *, - name: str, - entrypoint_path: str, - func: t.Callable, + override_module_path: Path, + override_path: Path, + locals: t.Dict[str, t.Any], additional_macros: CallableAliasList, - variables: t.Dict[str, t.Any], - columns: t.Dict[str, exp.DataType], - imports: t.Dict[str, t.Any], **kwargs, ): - self.name = name - self._func = func - self._entrypoint_path = entrypoint_path + super().__init__(**kwargs) self._additional_macros = additional_macros - self._variables = variables - self._kwargs = kwargs - self._columns = columns - self._imports = imports + self._locals = locals + self._override_module_path = override_module_path + self._override_path = override_path - def model( - self, - module_path: Path, - path: Path, - defaults: t.Optional[t.Dict[str, t.Any]] = None, - macros: t.Optional[MacroRegistry] = None, - jinja_macros: t.Optional[JinjaMacroRegistry] = None, - dialect: t.Optional[str] = None, - time_column_format: str = c.DEFAULT_TIME_COLUMN_FORMAT, - physical_schema_mapping: t.Optional[t.Dict[re.Pattern, str]] = None, - project: str = "", - default_catalog: t.Optional[str] = None, - variables: t.Optional[t.Dict[str, t.Any]] = None, - infer_names: t.Optional[bool] = False, - ): - fake_module_path = Path(self._entrypoint_path) - macros = MacroRegistry(f"macros_for_{self.name}") - macros.update(macros or macro.get_registry()) - - if self._additional_macros: - macros.update(create_macro_registry_from_list(self._additional_macros)) - - all_vars = self._variables.copy() - global_variables = variables or {} - all_vars.update(global_variables) - all_vars["sqlmesh_vars"] = global_variables - - common_kwargs: t.Dict[str, t.Any] = dict( - defaults=defaults, - path=path, - time_column_format=time_column_format, - physical_schema_mapping=physical_schema_mapping, - project=project, - default_catalog=default_catalog, - variables=all_vars, - **self._kwargs, - ) + def model(self, *args, **kwargs): + if len(self._additional_macros) > 0: + macros = MacroRegistry(f"macros_for_{self.name}") + system_macros = kwargs.get("macros", macros) + macros.update(system_macros or macro.get_registry()) - env = {} - python_env = create_basic_python_env( - env, - self._entrypoint_path, - module_path, - macros=macros, - callables=[self._func], - imports=self._imports, - ) + macros = create_macro_registry_from_list(self._additional_macros) + kwargs["macros"] = macros - return create_python_model( - self.name, - self._func.__name__, - python_env, - macros=macros, - module_path=fake_module_path, - jinja_macros=jinja_macros, - columns=self._columns, - dialect=dialect, - **common_kwargs, - ) + vars = kwargs.get("variables", {}) + if len(self._locals) > 0: + vars.update(self._locals) + kwargs["variables"] = vars + kwargs["module_path"] = self._override_module_path + kwargs["path"] = self._override_path -class GeneratedModel: - @classmethod - def create( - cls, - *, - func: t.Callable[..., t.Any], - config: t.Mapping[str, t.Any], - name: str, - columns: t.Dict[str, exp.DataType], - entrypoint_path: str, - source: t.Optional[str] = None, - source_loader: t.Optional[t.Callable[[], str]] = None, - additional_macros: t.Optional[CallableAliasList] = None, - **kwargs, - ): - if not source and not source_loader: - try: - source = inspect.getsource(func) - except: # noqa: E722 - pass - - assert ( - source is not None or source_loader is not None - ), "Must have a way to load the source for state diffs" - - instance = cls( - func_name=func.__name__, - import_module=func.__module__, - config=config, - name=name, - columns=columns, - entrypoint_path=entrypoint_path, - source=source, - source_loader=source_loader, - additional_macros=additional_macros, - **kwargs, - ) - registry = model.registry() - registry[name] = instance - return instance - - def __init__( - self, - *, - func_name: str, - import_module: str, - config: t.Mapping[str, t.Any], - name: str, - columns: t.Dict[str, exp.DataType], - entrypoint_path: str, - source: t.Optional[str] = None, - source_loader: t.Optional[t.Callable[[], str]] = None, - additional_macros: t.Optional[CallableAliasList] = None, - **kwargs, - ): - self.kwargs = kwargs - self.func_name = func_name - self.import_module = import_module - self.config = config - self.name = name - self.columns = columns - self.entrypoint_path = entrypoint_path - self.source_loader = source_loader - self.source = source - self.additional_macros = additional_macros or [] - - def model( - self, - *, - module_path: Path, - path: Path, - defaults: t.Optional[t.Dict[str, t.Any]] = None, - macros: t.Optional[MacroRegistry] = None, - jinja_macros: t.Optional[JinjaMacroRegistry] = None, - dialect: t.Optional[str] = None, - time_column_format: str = c.DEFAULT_TIME_COLUMN_FORMAT, - physical_schema_mapping: t.Optional[t.Dict[re.Pattern, str]] = None, - project: str = "", - default_catalog: t.Optional[str] = None, - variables: t.Optional[t.Dict[str, t.Any]] = None, - infer_names: t.Optional[bool] = False, - ): - macros = macros or macro.get_registry() - fake_module_path = Path(self.entrypoint_path) - - if self.additional_macros: - macros = t.cast(MacroRegistry, macros.copy()) - macros.update(create_macro_registry_from_list(self.additional_macros)) - - common_kwargs: t.Dict[str, t.Any] = dict( - defaults=defaults, - path=fake_module_path, - time_column_format=time_column_format, - physical_schema_mapping=physical_schema_mapping, - project=project, - default_catalog=default_catalog, - variables=variables, - **self.kwargs, - ) - - source = self.source - if not source: - if self.source_loader: - source = self.source_loader() - assert source is not None, "source cannot be empty" - - env = {} - - entrypoint_name, env = create_import_call_env( - self.func_name, - self.import_module, - self.config, - source, - env, - fake_module_path, - project_path=module_path, - macros=macros, - variables=variables, - ) - common_kwargs["python_env"] = env - - query = MacroFunc(this=exp.Anonymous(this=entrypoint_name)) - if self.columns: - common_kwargs["columns"] = self.columns - - return create_sql_model( - self.name, - query, - module_path=fake_module_path, - jinja_macros=jinja_macros, - **common_kwargs, - ) + return super().model(*args, **kwargs) def escape_triple_quotes(input_string: str) -> str: diff --git a/warehouse/metrics_tools/transformer/tables.py b/warehouse/metrics_tools/transformer/tables.py index 09cf39c43..300fcab72 100644 --- a/warehouse/metrics_tools/transformer/tables.py +++ b/warehouse/metrics_tools/transformer/tables.py @@ -6,6 +6,7 @@ from sqlglot import exp from sqlmesh.core.context import ExecutionContext + from .base import Transform logger = logging.getLogger(__name__) @@ -56,8 +57,8 @@ def transform_table_name(self, table: exp.Table) -> exp.Table | None: table_name = f"{table.db}.{table.this.this}" try: logger.debug( - f"Transforming tables for query {self._context.table(table_name)}" + f"Transforming tables for query {self._context.resolve_table(table_name)}" ) - return exp.to_table(self._context.table(table_name)) + return exp.to_table(self._context.resolve_table(table_name)) except KeyError: return None diff --git a/warehouse/metrics_tools/utils/tables.py b/warehouse/metrics_tools/utils/tables.py index 1226f39da..856552067 100644 --- a/warehouse/metrics_tools/utils/tables.py +++ b/warehouse/metrics_tools/utils/tables.py @@ -26,7 +26,7 @@ def resolve_table_name( ) -> t.Tuple[str, str]: table_fqn = resolve_table_fqn(table) - return (table_fqn, context.table(table_fqn)) + return (table_fqn, context.resolve_table(table_fqn)) def list_query_table_dependencies( @@ -92,6 +92,6 @@ def create_dependent_tables_map( raise ValueError("Failed to build scope") # tables_map = resolve_table_map_from_scope(context, scope) tables = list_query_table_dependencies(query, {}) - tables_map = {table: context.table(table) for table in tables} + tables_map = {table: context.resolve_table(table) for table in tables} return tables_map diff --git a/warehouse/metrics_tools/utils/test_tables.py b/warehouse/metrics_tools/utils/test_tables.py index 4db0b6a81..7415465cb 100644 --- a/warehouse/metrics_tools/utils/test_tables.py +++ b/warehouse/metrics_tools/utils/test_tables.py @@ -7,7 +7,7 @@ def test_create_dependent_tables_map(): mock = MagicMock(name="context") - mock.table.return_value = "test_table" + mock.resolve_table.return_value = "test_table" actual_tables_map = create_dependent_tables_map(mock, "select * from foo") expected_tables_map = { @@ -125,7 +125,7 @@ def test_create_dependent_tables_map_parameterized( input: str, expected: t.Dict[str, str] ): mock = MagicMock(name="context") - mock.table.return_value = "test_table" + mock.resolve_table.return_value = "test_table" actual_tables_map = create_dependent_tables_map(mock, input) assert actual_tables_map == expected diff --git a/warehouse/oso_dagster/cbt/transforms/test_transforms.py b/warehouse/oso_dagster/cbt/transforms/test_transforms.py index 5aa4dac7d..ff58af0bc 100644 --- a/warehouse/oso_dagster/cbt/transforms/test_transforms.py +++ b/warehouse/oso_dagster/cbt/transforms/test_transforms.py @@ -39,18 +39,18 @@ def db(): { "time_and_id": [ ["time", "id"], - [arrow.get("2024-01-01").datetime, 1], - [arrow.get("2024-02-01").datetime, 2], - [arrow.get("2024-03-01").datetime, 3], - [arrow.get("2024-04-01").datetime, 4], + [arrow.get("2024-01-01", tzinfo="UTC").datetime, 1], + [arrow.get("2024-02-01", tzinfo="UTC").datetime, 2], + [arrow.get("2024-03-01", tzinfo="UTC").datetime, 3], + [arrow.get("2024-04-01", tzinfo="UTC").datetime, 4], ], "time_id_and_name": [ ["time", "id", "name"], - [arrow.get("2024-01-01").datetime, 1, "alpha"], - [arrow.get("2024-02-01").datetime, 2, "bravo"], - [arrow.get("2024-03-01").datetime, 3, "charlie"], - [arrow.get("2024-04-01").datetime, 4, "delta"], - [arrow.get("2024-02-01").datetime, 5, "foxtrot"], + [arrow.get("2024-01-01", tzinfo="UTC").datetime, 1, "alpha"], + [arrow.get("2024-02-01", tzinfo="UTC").datetime, 2, "bravo"], + [arrow.get("2024-03-01", tzinfo="UTC").datetime, 3, "charlie"], + [arrow.get("2024-04-01", tzinfo="UTC").datetime, 4, "delta"], + [arrow.get("2024-02-01", tzinfo="UTC").datetime, 5, "foxtrot"], ], } ) @@ -63,12 +63,15 @@ def db(): [ ( SELECT_NO_CTE, - dict(start=arrow.get("2024-02-01"), end=arrow.get("2024-04-01")), + dict( + start=arrow.get("2024-02-01", tzinfo="UTC"), + end=arrow.get("2024-04-01", tzinfo="UTC"), + ), 2, ), ( SELECT_WITH_CTE, - dict(start=arrow.get("2024-02-01")), + dict(start=arrow.get("2024-02-01", tzinfo="UTC")), 3, ), ], @@ -93,7 +96,10 @@ def test_time_constrain_succeed( ( SELECT_WITH_JOIN, "time_id_and_name", - dict(start=arrow.get("2024-02-01"), end=arrow.get("2024-04-01")), + dict( + start=arrow.get("2024-02-01", tzinfo="UTC"), + end=arrow.get("2024-04-01", tzinfo="UTC"), + ), 2, ), ], diff --git a/warehouse/oso_dagster/utils/testing/duckdb.py b/warehouse/oso_dagster/utils/testing/duckdb.py index 06d8e1cf5..353997c50 100644 --- a/warehouse/oso_dagster/utils/testing/duckdb.py +++ b/warehouse/oso_dagster/utils/testing/duckdb.py @@ -1,7 +1,7 @@ -from typing import Optional, Dict, List +from typing import Dict, List, Optional -import pandas import duckdb +import pandas class DuckDbFixture: @@ -12,6 +12,7 @@ def setup(cls, tables: Optional[Dict[str, List[List]]] = None): tables = tables or dict() db = duckdb.connect() fixture = cls(db) + fixture.set_timezone() fixture.add_tables(tables) fixture.set_memory_limit("2MB") return fixture @@ -36,6 +37,9 @@ def add_tables(self, tables: Dict[str, List]): def set_memory_limit(self, limit: str): self._db.sql(f"SET memory_limit = '{limit}';") + def set_timezone(self): + self._db.sql("SET TimeZone = 'UTC';") + @property def db(self): return self._db