diff --git a/poetry.lock b/poetry.lock index e3c555d..51ee2fa 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "backports-tarfile" @@ -91,14 +91,14 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "certifi" -version = "2025.1.31" +version = "2025.4.26" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" groups = ["dev"] files = [ - {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, - {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, + {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, + {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, ] [[package]] @@ -184,104 +184,104 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.4.1" +version = "3.4.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, - {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, - {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, + {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, + {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, ] [[package]] @@ -314,75 +314,79 @@ files = [ [[package]] name = "coverage" -version = "7.8.0" +version = "7.8.2" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe"}, - {file = "coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28"}, - {file = "coverage-7.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c8a5c139aae4c35cbd7cadca1df02ea8cf28a911534fc1b0456acb0b14234f3"}, - {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a26c0c795c3e0b63ec7da6efded5f0bc856d7c0b24b2ac84b4d1d7bc578d676"}, - {file = "coverage-7.8.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821f7bcbaa84318287115d54becb1915eece6918136c6f91045bb84e2f88739d"}, - {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a321c61477ff8ee705b8a5fed370b5710c56b3a52d17b983d9215861e37b642a"}, - {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ed2144b8a78f9d94d9515963ed273d620e07846acd5d4b0a642d4849e8d91a0c"}, - {file = "coverage-7.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:042e7841a26498fff7a37d6fda770d17519982f5b7d8bf5278d140b67b61095f"}, - {file = "coverage-7.8.0-cp310-cp310-win32.whl", hash = "sha256:f9983d01d7705b2d1f7a95e10bbe4091fabc03a46881a256c2787637b087003f"}, - {file = "coverage-7.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a570cd9bd20b85d1a0d7b009aaf6c110b52b5755c17be6962f8ccd65d1dbd23"}, - {file = "coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27"}, - {file = "coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea"}, - {file = "coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7"}, - {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040"}, - {file = "coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543"}, - {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2"}, - {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318"}, - {file = "coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9"}, - {file = "coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c"}, - {file = "coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78"}, - {file = "coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc"}, - {file = "coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6"}, - {file = "coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d"}, - {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05"}, - {file = "coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a"}, - {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6"}, - {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47"}, - {file = "coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe"}, - {file = "coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545"}, - {file = "coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b"}, - {file = "coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd"}, - {file = "coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00"}, - {file = "coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64"}, - {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067"}, - {file = "coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008"}, - {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733"}, - {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323"}, - {file = "coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3"}, - {file = "coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d"}, - {file = "coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487"}, - {file = "coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25"}, - {file = "coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42"}, - {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502"}, - {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1"}, - {file = "coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4"}, - {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73"}, - {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a"}, - {file = "coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883"}, - {file = "coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada"}, - {file = "coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257"}, - {file = "coverage-7.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fa260de59dfb143af06dcf30c2be0b200bed2a73737a8a59248fcb9fa601ef0f"}, - {file = "coverage-7.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:96121edfa4c2dfdda409877ea8608dd01de816a4dc4a0523356067b305e4e17a"}, - {file = "coverage-7.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8af63b9afa1031c0ef05b217faa598f3069148eeee6bb24b79da9012423b82"}, - {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89b1f4af0d4afe495cd4787a68e00f30f1d15939f550e869de90a86efa7e0814"}, - {file = "coverage-7.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94ec0be97723ae72d63d3aa41961a0b9a6f5a53ff599813c324548d18e3b9e8c"}, - {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8a1d96e780bdb2d0cbb297325711701f7c0b6f89199a57f2049e90064c29f6bd"}, - {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f1d8a2a57b47142b10374902777e798784abf400a004b14f1b0b9eaf1e528ba4"}, - {file = "coverage-7.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cf60dd2696b457b710dd40bf17ad269d5f5457b96442f7f85722bdb16fa6c899"}, - {file = "coverage-7.8.0-cp39-cp39-win32.whl", hash = "sha256:be945402e03de47ba1872cd5236395e0f4ad635526185a930735f66710e1bd3f"}, - {file = "coverage-7.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:90e7fbc6216ecaffa5a880cdc9c77b7418c1dcb166166b78dbc630d07f278cc3"}, - {file = "coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd"}, - {file = "coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7"}, - {file = "coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501"}, + {file = "coverage-7.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd8ec21e1443fd7a447881332f7ce9d35b8fbd2849e761bb290b584535636b0a"}, + {file = "coverage-7.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26c2396674816deaeae7ded0e2b42c26537280f8fe313335858ffff35019be"}, + {file = "coverage-7.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aec326ed237e5880bfe69ad41616d333712c7937bcefc1343145e972938f9b3"}, + {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e818796f71702d7a13e50c70de2a1924f729228580bcba1607cccf32eea46e6"}, + {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:546e537d9e24efc765c9c891328f30f826e3e4808e31f5d0f87c4ba12bbd1622"}, + {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab9b09a2349f58e73f8ebc06fac546dd623e23b063e5398343c5270072e3201c"}, + {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fd51355ab8a372d89fb0e6a31719e825cf8df8b6724bee942fb5b92c3f016ba3"}, + {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0774df1e093acb6c9e4d58bce7f86656aeed6c132a16e2337692c12786b32404"}, + {file = "coverage-7.8.2-cp310-cp310-win32.whl", hash = "sha256:00f2e2f2e37f47e5f54423aeefd6c32a7dbcedc033fcd3928a4f4948e8b96af7"}, + {file = "coverage-7.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:145b07bea229821d51811bf15eeab346c236d523838eda395ea969d120d13347"}, + {file = "coverage-7.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b99058eef42e6a8dcd135afb068b3d53aff3921ce699e127602efff9956457a9"}, + {file = "coverage-7.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5feb7f2c3e6ea94d3b877def0270dff0947b8d8c04cfa34a17be0a4dc1836879"}, + {file = "coverage-7.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670a13249b957bb9050fab12d86acef7bf8f6a879b9d1a883799276e0d4c674a"}, + {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdc8bf760459a4a4187b452213e04d039990211f98644c7292adf1e471162b5"}, + {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07a989c867986c2a75f158f03fdb413128aad29aca9d4dbce5fc755672d96f11"}, + {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2db10dedeb619a771ef0e2949ccba7b75e33905de959c2643a4607bef2f3fb3a"}, + {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e6ea7dba4e92926b7b5f0990634b78ea02f208d04af520c73a7c876d5a8d36cb"}, + {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef2f22795a7aca99fc3c84393a55a53dd18ab8c93fb431004e4d8f0774150f54"}, + {file = "coverage-7.8.2-cp311-cp311-win32.whl", hash = "sha256:641988828bc18a6368fe72355df5f1703e44411adbe49bba5644b941ce6f2e3a"}, + {file = "coverage-7.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ab4a51cb39dc1933ba627e0875046d150e88478dbe22ce145a68393e9652975"}, + {file = "coverage-7.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:8966a821e2083c74d88cca5b7dcccc0a3a888a596a04c0b9668a891de3a0cc53"}, + {file = "coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c"}, + {file = "coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1"}, + {file = "coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279"}, + {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99"}, + {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20"}, + {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2"}, + {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57"}, + {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f"}, + {file = "coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8"}, + {file = "coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223"}, + {file = "coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f"}, + {file = "coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca"}, + {file = "coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d"}, + {file = "coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85"}, + {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257"}, + {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108"}, + {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0"}, + {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050"}, + {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48"}, + {file = "coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7"}, + {file = "coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3"}, + {file = "coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7"}, + {file = "coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008"}, + {file = "coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36"}, + {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46"}, + {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be"}, + {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740"}, + {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625"}, + {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b"}, + {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199"}, + {file = "coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8"}, + {file = "coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d"}, + {file = "coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b"}, + {file = "coverage-7.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:496948261eaac5ac9cf43f5d0a9f6eb7a6d4cb3bedb2c5d294138142f5c18f2a"}, + {file = "coverage-7.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eacd2de0d30871eff893bab0b67840a96445edcb3c8fd915e6b11ac4b2f3fa6d"}, + {file = "coverage-7.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b039ffddc99ad65d5078ef300e0c7eed08c270dc26570440e3ef18beb816c1ca"}, + {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e49824808d4375ede9dd84e9961a59c47f9113039f1a525e6be170aa4f5c34d"}, + {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b069938961dfad881dc2f8d02b47645cd2f455d3809ba92a8a687bf513839787"}, + {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:de77c3ba8bb686d1c411e78ee1b97e6e0b963fb98b1637658dd9ad2c875cf9d7"}, + {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1676628065a498943bd3f64f099bb573e08cf1bc6088bbe33cf4424e0876f4b3"}, + {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8e1a26e7e50076e35f7afafde570ca2b4d7900a491174ca357d29dece5aacee7"}, + {file = "coverage-7.8.2-cp39-cp39-win32.whl", hash = "sha256:6782a12bf76fa61ad9350d5a6ef5f3f020b57f5e6305cbc663803f2ebd0f270a"}, + {file = "coverage-7.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1efa4166ba75ccefd647f2d78b64f53f14fb82622bc94c5a5cb0a622f50f1c9e"}, + {file = "coverage-7.8.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:ec455eedf3ba0bbdf8f5a570012617eb305c63cb9f03428d39bf544cb2b94837"}, + {file = "coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32"}, + {file = "coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27"}, ] [package.dependencies] @@ -456,17 +460,20 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.2.2" +version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["dev"] markers = "python_version < \"3.11\"" files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, + {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, + {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, ] +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + [package.extras] test = ["pytest (>=6)"] @@ -522,15 +529,15 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 [[package]] name = "importlib-metadata" -version = "8.6.1" +version = "8.7.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\" or python_version < \"3.10\"" +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\" or python_version == \"3.9\"" files = [ - {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, - {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, + {file = "importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd"}, + {file = "importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000"}, ] [package.dependencies] @@ -724,15 +731,15 @@ files = [ [[package]] name = "more-itertools" -version = "10.6.0" +version = "10.7.0" description = "More routines for operating on iterables, beyond itertools" optional = false python-versions = ">=3.9" groups = ["dev"] markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\"" files = [ - {file = "more-itertools-10.6.0.tar.gz", hash = "sha256:2cd7fad1009c31cc9fb6a035108509e6547547a7a738374f10bd49a09eb3ee3b"}, - {file = "more_itertools-10.6.0-py3-none-any.whl", hash = "sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89"}, + {file = "more_itertools-10.7.0-py3-none-any.whl", hash = "sha256:d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e"}, + {file = "more_itertools-10.7.0.tar.gz", hash = "sha256:9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3"}, ] [[package]] @@ -791,14 +798,14 @@ reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "1.0.0" +version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, + {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, + {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] [[package]] @@ -837,14 +844,14 @@ files = [ [[package]] name = "packaging" -version = "24.2" +version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] [[package]] @@ -876,14 +883,14 @@ setuptools = "*" [[package]] name = "platformdirs" -version = "4.3.7" +version = "4.3.8" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94"}, - {file = "platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351"}, + {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, + {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, ] [package.extras] @@ -893,19 +900,19 @@ type = ["mypy (>=1.14.1)"] [[package]] name = "pluggy" -version = "1.5.0" +version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, ] [package.extras] dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] +testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "pycparser" @@ -960,14 +967,14 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments [[package]] name = "pytest-cov" -version = "6.1.0" +version = "6.1.1" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest_cov-6.1.0-py3-none-any.whl", hash = "sha256:cd7e1d54981d5185ef2b8d64b50172ce97e6f357e6df5cb103e828c7f993e201"}, - {file = "pytest_cov-6.1.0.tar.gz", hash = "sha256:ec55e828c66755e5b74a21bd7cc03c303a9f928389c0563e50ba454a6dbe71db"}, + {file = "pytest_cov-6.1.1-py3-none-any.whl", hash = "sha256:bddf29ed2d0ab6f4df17b4c55b0a657287db8684af9c42ea546b21b1041b3dde"}, + {file = "pytest_cov-6.1.1.tar.gz", hash = "sha256:46935f7aaefba760e716c2ebfbe1c216240b9592966e7da99ea8292d4d3e2a0a"}, ] [package.dependencies] @@ -1168,30 +1175,30 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruff" -version = "0.11.2" +version = "0.11.11" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477"}, - {file = "ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272"}, - {file = "ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9"}, - {file = "ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb"}, - {file = "ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3"}, - {file = "ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74"}, - {file = "ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608"}, - {file = "ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f"}, - {file = "ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147"}, - {file = "ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b"}, - {file = "ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9"}, - {file = "ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab"}, - {file = "ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630"}, - {file = "ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f"}, - {file = "ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc"}, - {file = "ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080"}, - {file = "ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4"}, - {file = "ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94"}, + {file = "ruff-0.11.11-py3-none-linux_armv6l.whl", hash = "sha256:9924e5ae54125ed8958a4f7de320dab7380f6e9fa3195e3dc3b137c6842a0092"}, + {file = "ruff-0.11.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8a93276393d91e952f790148eb226658dd275cddfde96c6ca304873f11d2ae4"}, + {file = "ruff-0.11.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6e333dbe2e6ae84cdedefa943dfd6434753ad321764fd937eef9d6b62022bcd"}, + {file = "ruff-0.11.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7885d9a5e4c77b24e8c88aba8c80be9255fa22ab326019dac2356cff42089fc6"}, + {file = "ruff-0.11.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b5ab797fcc09121ed82e9b12b6f27e34859e4227080a42d090881be888755d4"}, + {file = "ruff-0.11.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e231ff3132c1119ece836487a02785f099a43992b95c2f62847d29bace3c75ac"}, + {file = "ruff-0.11.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a97c9babe1d4081037a90289986925726b802d180cca784ac8da2bbbc335f709"}, + {file = "ruff-0.11.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8c4ddcbe8a19f59f57fd814b8b117d4fcea9bee7c0492e6cf5fdc22cfa563c8"}, + {file = "ruff-0.11.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6224076c344a7694c6fbbb70d4f2a7b730f6d47d2a9dc1e7f9d9bb583faf390b"}, + {file = "ruff-0.11.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:882821fcdf7ae8db7a951df1903d9cb032bbe838852e5fc3c2b6c3ab54e39875"}, + {file = "ruff-0.11.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:dcec2d50756463d9df075a26a85a6affbc1b0148873da3997286caf1ce03cae1"}, + {file = "ruff-0.11.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99c28505ecbaeb6594701a74e395b187ee083ee26478c1a795d35084d53ebd81"}, + {file = "ruff-0.11.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9263f9e5aa4ff1dec765e99810f1cc53f0c868c5329b69f13845f699fe74f639"}, + {file = "ruff-0.11.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:64ac6f885e3ecb2fdbb71de2701d4e34526651f1e8503af8fb30d4915a3fe345"}, + {file = "ruff-0.11.11-py3-none-win32.whl", hash = "sha256:1adcb9a18802268aaa891ffb67b1c94cd70578f126637118e8099b8e4adcf112"}, + {file = "ruff-0.11.11-py3-none-win_amd64.whl", hash = "sha256:748b4bb245f11e91a04a4ff0f96e386711df0a30412b9fe0c74d5bdc0e4a531f"}, + {file = "ruff-0.11.11-py3-none-win_arm64.whl", hash = "sha256:6c51f136c0364ab1b774767aa8b86331bd8e9d414e2d107db7a2189f35ea1f7b"}, + {file = "ruff-0.11.11.tar.gz", hash = "sha256:7774173cc7c1980e6bf67569ebb7085989a78a103922fb83ef3dfe230cd0687d"}, ] [[package]] @@ -1213,14 +1220,14 @@ jeepney = ">=0.6" [[package]] name = "setuptools" -version = "78.1.0" +version = "80.8.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8"}, - {file = "setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54"}, + {file = "setuptools-80.8.0-py3-none-any.whl", hash = "sha256:95a60484590d24103af13b686121328cc2736bee85de8936383111e421b9edc0"}, + {file = "setuptools-80.8.0.tar.gz", hash = "sha256:49f7af965996f26d43c8ae34539c8d99c5042fbff34302ea151eaa9c207cd257"}, ] [package.extras] @@ -1319,26 +1326,26 @@ keyring = ["keyring (>=15.1)"] [[package]] name = "typing-extensions" -version = "4.13.0" +version = "4.13.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5"}, - {file = "typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b"}, + {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, + {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, ] [[package]] name = "urllib3" -version = "2.3.0" +version = "2.4.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, - {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, + {file = "urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813"}, + {file = "urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466"}, ] [package.extras] @@ -1354,7 +1361,7 @@ description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.9" groups = ["dev"] -markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\" or python_version < \"3.10\"" +markers = "platform_machine != \"ppc64le\" and platform_machine != \"s390x\" and python_version < \"3.12\" or python_version == \"3.9\"" files = [ {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, diff --git a/pypika_tortoise/context.py b/pypika_tortoise/context.py index 4030dd0..b7d3d3d 100644 --- a/pypika_tortoise/context.py +++ b/pypika_tortoise/context.py @@ -10,13 +10,13 @@ class SqlContext: quote_char: str secondary_quote_char: str alias_quote_char: str - dialect: "Dialects" + dialect: Dialects as_keyword: bool = False subquery: bool = False with_alias: bool = False with_namespace: bool = False subcriterion: bool = False - parameterizer: "Parameterizer" | None = None + parameterizer: Parameterizer | None = None groupby_alias: bool = True orderby_alias: bool = True diff --git a/pypika_tortoise/dialects/mssql.py b/pypika_tortoise/dialects/mssql.py index 5d24e5d..39f4c36 100644 --- a/pypika_tortoise/dialects/mssql.py +++ b/pypika_tortoise/dialects/mssql.py @@ -18,7 +18,7 @@ class MSSQLQuery(Query): SQL_CONTEXT = DEFAULT_SQL_CONTEXT.copy(dialect=Dialects.MSSQL) @classmethod - def _builder(cls, **kwargs: Any) -> "MSSQLQueryBuilder": + def _builder(cls, **kwargs: Any) -> MSSQLQueryBuilder: return MSSQLQueryBuilder(**kwargs) diff --git a/pypika_tortoise/dialects/mysql.py b/pypika_tortoise/dialects/mysql.py index caf72fe..e80d9c7 100644 --- a/pypika_tortoise/dialects/mysql.py +++ b/pypika_tortoise/dialects/mysql.py @@ -19,11 +19,11 @@ class MySQLQuery(Query): SQL_CONTEXT = DEFAULT_SQL_CONTEXT.copy(dialect=Dialects.MYSQL, quote_char="`") @classmethod - def _builder(cls, **kwargs: Any) -> "MySQLQueryBuilder": + def _builder(cls, **kwargs: Any) -> MySQLQueryBuilder: return MySQLQueryBuilder(**kwargs) @classmethod - def load(cls, fp: str) -> "MySQLLoadQueryBuilder": + def load(cls, fp: str) -> MySQLLoadQueryBuilder: return MySQLLoadQueryBuilder().load(fp) diff --git a/pypika_tortoise/dialects/oracle.py b/pypika_tortoise/dialects/oracle.py index 65dd22b..8d25089 100644 --- a/pypika_tortoise/dialects/oracle.py +++ b/pypika_tortoise/dialects/oracle.py @@ -15,7 +15,7 @@ class OracleQuery(Query): SQL_CONTEXT = DEFAULT_SQL_CONTEXT.copy(dialect=Dialects.ORACLE, alias_quote_char='"') @classmethod - def _builder(cls, **kwargs: Any) -> "OracleQueryBuilder": + def _builder(cls, **kwargs: Any) -> OracleQueryBuilder: return OracleQueryBuilder(**kwargs) diff --git a/pypika_tortoise/dialects/postgresql.py b/pypika_tortoise/dialects/postgresql.py index c7d032c..c8a5e83 100644 --- a/pypika_tortoise/dialects/postgresql.py +++ b/pypika_tortoise/dialects/postgresql.py @@ -27,7 +27,7 @@ class PostgreSQLQuery(Query): SQL_CONTEXT = DEFAULT_SQL_CONTEXT.copy(dialect=Dialects.POSTGRESQL, alias_quote_char='"') @classmethod - def _builder(cls, **kwargs) -> "PostgreSQLQueryBuilder": + def _builder(cls, **kwargs) -> PostgreSQLQueryBuilder: return PostgreSQLQueryBuilder(**kwargs) @@ -41,14 +41,14 @@ def __init__(self, **kwargs: Any) -> None: self._distinct_on: list[Field | Term] = [] - def __copy__(self) -> "Self": + def __copy__(self) -> Self: newone = super().__copy__() newone._returns = copy(self._returns) newone._on_conflict_do_updates = copy(self._on_conflict_do_updates) return newone @builder - def distinct_on(self, *fields: str | Term) -> "PostgreSQLQueryBuilder": # type:ignore[return] + def distinct_on(self, *fields: str | Term) -> PostgreSQLQueryBuilder: # type:ignore[return] for field in fields: if isinstance(field, str): self._distinct_on.append(Field(field)) @@ -64,7 +64,7 @@ def _distinct_sql(self, ctx: SqlContext) -> str: return super()._distinct_sql(distinct_ctx) @builder - def returning(self, *terms: Any) -> "PostgreSQLQueryBuilder": # type:ignore[return] + def returning(self, *terms: Any) -> PostgreSQLQueryBuilder: # type:ignore[return] for term in terms: if isinstance(term, Field): self._return_field(term) diff --git a/pypika_tortoise/dialects/sqlite.py b/pypika_tortoise/dialects/sqlite.py index 38896f4..7a42c1a 100644 --- a/pypika_tortoise/dialects/sqlite.py +++ b/pypika_tortoise/dialects/sqlite.py @@ -23,7 +23,7 @@ class SQLLiteQuery(Query): SQL_CONTEXT = DEFAULT_SQL_CONTEXT.copy(dialect=Dialects.SQLITE) @classmethod - def _builder(cls, **kwargs: Any) -> "SQLLiteQueryBuilder": + def _builder(cls, **kwargs: Any) -> SQLLiteQueryBuilder: return SQLLiteQueryBuilder(**kwargs) diff --git a/pypika_tortoise/functions.py b/pypika_tortoise/functions.py index ad5969e..dd21b44 100644 --- a/pypika_tortoise/functions.py +++ b/pypika_tortoise/functions.py @@ -35,7 +35,7 @@ def get_function_sql(self, ctx: SqlContext) -> str: return s @builder - def distinct(self) -> "Self": # type:ignore[return] + def distinct(self) -> Self: # type:ignore[return] self._distinct = True diff --git a/pypika_tortoise/queries.py b/pypika_tortoise/queries.py index d9b2f96..4c8aa56 100644 --- a/pypika_tortoise/queries.py +++ b/pypika_tortoise/queries.py @@ -1,9 +1,10 @@ from __future__ import annotations import sys +from collections.abc import Sequence from copy import copy from functools import reduce -from typing import TYPE_CHECKING, Any, Sequence, Type, cast, overload +from typing import TYPE_CHECKING, Any, cast, overload from .context import DEFAULT_SQL_CONTEXT, SqlContext from .enums import Dialects, JoinType, SetOperation @@ -39,7 +40,7 @@ def __init__(self, alias: str) -> None: self.alias = alias @builder - def as_(self, alias: str) -> "Self": # type:ignore[return] + def as_(self, alias: str) -> Self: # type:ignore[return] self.alias = alias def field(self, name: str) -> Field: @@ -87,7 +88,7 @@ def __hash__(self) -> int: class Cte(AliasedQuery): - def __init__(self, name: str, query: "QueryBuilder" | None = None, *terms: Term) -> None: + def __init__(self, name: str, query: QueryBuilder | None = None, *terms: Term) -> None: super().__init__(name, query) self.query = query self.terms = terms @@ -109,7 +110,7 @@ def __ne__(self, other: Any) -> bool: return not self.__eq__(other) @ignore_copy - def __getattr__(self, item: str) -> "Table": + def __getattr__(self, item: str) -> Table: return Table(item, schema=self) def get_sql(self, ctx: SqlContext) -> str: @@ -163,7 +164,7 @@ def __init__( name: str, schema: Schema | str | None = None, alias: str | None = None, - query_cls: Type["Query"] | None = None, + query_cls: type[Query] | None = None, ) -> None: super().__init__(alias) # type:ignore[arg-type] self._table_name = name @@ -198,7 +199,7 @@ def get_sql(self, ctx: SqlContext) -> str: return format_alias_sql(table_sql, self.alias, ctx) @builder - def for_(self, temporal_criterion: Criterion) -> "Self": # type:ignore[return] + def for_(self, temporal_criterion: Criterion) -> Self: # type:ignore[return] if self._for: raise AttributeError("'Query' object already has attribute for_") if self._for_portion: @@ -206,7 +207,7 @@ def for_(self, temporal_criterion: Criterion) -> "Self": # type:ignore[return] self._for = temporal_criterion @builder - def for_portion(self, period_criterion: PeriodCriterion) -> "Self": # type:ignore[return] + def for_portion(self, period_criterion: PeriodCriterion) -> Self: # type:ignore[return] if self._for_portion: raise AttributeError("'Query' object already has attribute for_portion") if self._for: @@ -235,7 +236,7 @@ def __ne__(self, other: Any) -> bool: def __hash__(self) -> int: return hash(str(self)) - def select(self, *terms: Sequence[int | float | str | bool | Term | Field]) -> "QueryBuilder": + def select(self, *terms: Sequence[int | float | str | bool | Term | Field]) -> QueryBuilder: """ Perform a SELECT operation on the current table @@ -248,7 +249,7 @@ def select(self, *terms: Sequence[int | float | str | bool | Term | Field]) -> " """ return self._query_cls.from_(self).select(*terms) - def update(self) -> "QueryBuilder": + def update(self) -> QueryBuilder: """ Perform an UPDATE operation on the current table @@ -256,7 +257,7 @@ def update(self) -> "QueryBuilder": """ return self._query_cls.update(self) - def insert(self, *terms: int | float | str | bool | Term | Field) -> "QueryBuilder": + def insert(self, *terms: int | float | str | bool | Term | Field) -> QueryBuilder: """ Perform an INSERT operation on the current table @@ -389,11 +390,11 @@ class Query: SQL_CONTEXT: SqlContext = DEFAULT_SQL_CONTEXT @classmethod - def _builder(cls, **kwargs: Any) -> "QueryBuilder": + def _builder(cls, **kwargs: Any) -> QueryBuilder: return QueryBuilder(**kwargs) @classmethod - def from_(cls, table: Selectable | str, **kwargs: Any) -> "QueryBuilder": + def from_(cls, table: Selectable | str, **kwargs: Any) -> QueryBuilder: """ Query builder entry point. Initializes query building and sets the table to select from. When using this function, the query becomes a SELECT query. @@ -408,7 +409,7 @@ def from_(cls, table: Selectable | str, **kwargs: Any) -> "QueryBuilder": return cls._builder(**kwargs).from_(table) @classmethod - def create_table(cls, table: str | Table) -> "CreateQueryBuilder": + def create_table(cls, table: str | Table) -> CreateQueryBuilder: """ Query builder entry point. Initializes query building and sets the table name to be created. When using this function, the query becomes a CREATE statement. @@ -420,7 +421,7 @@ def create_table(cls, table: str | Table) -> "CreateQueryBuilder": return CreateQueryBuilder().create_table(table) @classmethod - def drop_table(cls, table: str | Table) -> "DropQueryBuilder": + def drop_table(cls, table: str | Table) -> DropQueryBuilder: """ Query builder entry point. Initializes query building and sets the table name to be dropped. When using this function, the query becomes a DROP statement. @@ -432,7 +433,7 @@ def drop_table(cls, table: str | Table) -> "DropQueryBuilder": return DropQueryBuilder().drop_table(table) @classmethod - def into(cls, table: Table | str, **kwargs: Any) -> "QueryBuilder": + def into(cls, table: Table | str, **kwargs: Any) -> QueryBuilder: """ Query builder entry point. Initializes query building and sets the table to insert into. When using this function, the query becomes an INSERT query. @@ -447,13 +448,11 @@ def into(cls, table: Table | str, **kwargs: Any) -> "QueryBuilder": return cls._builder(**kwargs).into(table) @classmethod - def with_( - cls, table: str | Selectable, name: str, *terms: Term, **kwargs: Any - ) -> "QueryBuilder": + def with_(cls, table: str | Selectable, name: str, *terms: Term, **kwargs: Any) -> QueryBuilder: return cls._builder(**kwargs).with_(table, name, *terms) @classmethod - def select(cls, *terms: int | float | str | bool | Term, **kwargs: Any) -> "QueryBuilder": + def select(cls, *terms: int | float | str | bool | Term, **kwargs: Any) -> QueryBuilder: """ Query builder entry point. Initializes query building without a table and selects fields. Useful when testing SQL functions. @@ -469,7 +468,7 @@ def select(cls, *terms: int | float | str | bool | Term, **kwargs: Any) -> "Quer return cls._builder(**kwargs).select(*terms) @classmethod - def update(cls, table: str | Table, **kwargs) -> "QueryBuilder": + def update(cls, table: str | Table, **kwargs) -> QueryBuilder: """ Query builder entry point. Initializes query building and sets the table to update. When using this function, the query becomes an UPDATE query. @@ -526,11 +525,11 @@ class _SetOperation(Selectable, Term): # type:ignore[misc] def __init__( self, - base_query: "QueryBuilder", - set_operation_query: "QueryBuilder", + base_query: QueryBuilder, + set_operation_query: QueryBuilder, set_operation: SetOperation, alias: str | None = None, - wrapper_cls: Type[ValueWrapper] = ValueWrapper, + wrapper_cls: type[ValueWrapper] = ValueWrapper, ) -> None: super().__init__(alias) # type:ignore[arg-type] self.base_query = base_query @@ -543,7 +542,7 @@ def __init__( self._wrapper_cls = wrapper_cls @builder - def orderby(self, *fields: Field, **kwargs: Any) -> "Self": # type:ignore[return] + def orderby(self, *fields: Field, **kwargs: Any) -> Self: # type:ignore[return] for field in fields: field = ( Field(field, table=self.base_query._from[0]) # type:ignore[assignment] @@ -554,40 +553,40 @@ def orderby(self, *fields: Field, **kwargs: Any) -> "Self": # type:ignore[retur self._orderbys.append((field, kwargs.get("order"))) @builder - def limit(self, limit: int) -> "Self": # type:ignore[return] + def limit(self, limit: int) -> Self: # type:ignore[return] self._limit = cast(ValueWrapper, self.wrap_constant(limit)) @builder - def offset(self, offset: int) -> "Self": # type:ignore[return] + def offset(self, offset: int) -> Self: # type:ignore[return] self._offset = cast(ValueWrapper, self.wrap_constant(offset)) @builder - def union(self, other: Selectable) -> "Self": # type:ignore[return] + def union(self, other: Selectable) -> Self: # type:ignore[return] self._set_operation.append((SetOperation.union, other)) # type:ignore[arg-type] @builder - def union_all(self, other: Selectable) -> "Self": # type:ignore[return] + def union_all(self, other: Selectable) -> Self: # type:ignore[return] self._set_operation.append((SetOperation.union_all, other)) # type:ignore[arg-type] @builder - def intersect(self, other: Selectable) -> "Self": # type:ignore[return] + def intersect(self, other: Selectable) -> Self: # type:ignore[return] self._set_operation.append((SetOperation.intersect, other)) # type:ignore[arg-type] @builder - def except_of(self, other: Selectable) -> "Self": # type:ignore[return] + def except_of(self, other: Selectable) -> Self: # type:ignore[return] self._set_operation.append((SetOperation.except_of, other)) # type:ignore[arg-type] @builder - def minus(self, other: Selectable) -> "Self": # type:ignore[return] + def minus(self, other: Selectable) -> Self: # type:ignore[return] self._set_operation.append((SetOperation.minus, other)) # type:ignore[arg-type] - def __add__(self, other: Selectable) -> "Self": # type:ignore[override] + def __add__(self, other: Selectable) -> Self: # type:ignore[override] return self.union(other) - def __mul__(self, other: Selectable) -> "Self": # type:ignore[override] + def __mul__(self, other: Selectable) -> Self: # type:ignore[override] return self.union_all(other) - def __sub__(self, other: "QueryBuilder") -> "Self": # type:ignore[override] + def __sub__(self, other: QueryBuilder) -> Self: # type:ignore[override] return self.minus(other) def __str__(self) -> str: @@ -687,7 +686,7 @@ class QueryBuilder(Selectable, Term): # type:ignore[misc] def __init__( self, wrap_set_operation_queries: bool = True, - wrapper_cls: Type[ValueWrapper] = ValueWrapper, + wrapper_cls: type[ValueWrapper] = ValueWrapper, immutable: bool = True, ) -> None: super().__init__(None) # type:ignore[arg-type] @@ -747,7 +746,7 @@ def __init__( self._on_conflict_wheres: Term | None = None self._on_conflict_do_update_wheres: Term | None = None - def __copy__(self) -> "Self": + def __copy__(self) -> Self: newone = type(self).__new__(type(self)) newone.__dict__.update(self.__dict__) newone._from = copy(self._from) @@ -766,7 +765,7 @@ def __copy__(self) -> "Self": return newone @builder - def on_conflict(self, *target_fields: str | Term) -> "Self": # type:ignore[return] + def on_conflict(self, *target_fields: str | Term) -> Self: # type:ignore[return] if not self._insert_table: raise QueryException("On conflict only applies to insert query") @@ -781,7 +780,7 @@ def on_conflict(self, *target_fields: str | Term) -> "Self": # type:ignore[retu @builder def do_update( # type:ignore[return] self, update_field: str | Field, update_value: Any | None = None - ) -> "Self": + ) -> Self: if self._on_conflict_do_nothing: raise QueryException("Can not have two conflict handlers") @@ -862,7 +861,7 @@ def _on_conflict_action_sql(self, ctx: SqlContext) -> str: return "" @builder - def from_(self, selectable: Selectable | Query | str) -> "Self": # type:ignore[return] + def from_(self, selectable: Selectable | Query | str) -> Self: # type:ignore[return] """ Adds a table to the query. This function can only be called once and will raise an AttributeError if called a second time. @@ -895,7 +894,7 @@ def from_(self, selectable: Selectable | Query | str) -> "Self": # type:ignore[ @builder def replace_table( # type:ignore[return] self, current_table: Table | None, new_table: Table | None - ) -> "Self": + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -951,13 +950,13 @@ def replace_table( # type:ignore[return] @builder def with_( # type:ignore[return] - self, selectable: "QueryBuilder", name: str, *terms: Term - ) -> "Self": + self, selectable: QueryBuilder, name: str, *terms: Term + ) -> Self: t = Cte(name, selectable, *terms) self._with.append(t) @builder - def into(self, table: str | Table) -> "Self": # type:ignore[return] + def into(self, table: str | Table) -> Self: # type:ignore[return] if self._insert_table is not None: raise AttributeError("'Query' object has no attribute '%s'" % "into") @@ -967,7 +966,7 @@ def into(self, table: str | Table) -> "Self": # type:ignore[return] self._insert_table = table if isinstance(table, Table) else Table(table) @builder - def select(self, *terms: Any) -> "Self": # type:ignore[return] + def select(self, *terms: Any) -> Self: # type:ignore[return] for term in terms: if isinstance(term, Field): self._select_field(term) @@ -981,21 +980,21 @@ def select(self, *terms: Any) -> "Self": # type:ignore[return] ) @builder - def delete(self) -> "Self": # type:ignore[return] + def delete(self) -> Self: # type:ignore[return] if self._delete_from or self._selects or self._update_table: raise AttributeError("'Query' object has no attribute '%s'" % "delete") self._delete_from = True @builder - def update(self, table: str | Table) -> "Self": # type:ignore[return] + def update(self, table: str | Table) -> Self: # type:ignore[return] if self._update_table is not None or self._selects or self._delete_from: raise AttributeError("'Query' object has no attribute '%s'" % "update") self._update_table = table if isinstance(table, Table) else Table(table) @builder - def columns(self, *terms: Any) -> "Self": # type:ignore[return] + def columns(self, *terms: Any) -> Self: # type:ignore[return] if self._insert_table is None: raise AttributeError("'Query' object has no attribute '%s'" % "insert") @@ -1008,7 +1007,7 @@ def columns(self, *terms: Any) -> "Self": # type:ignore[return] self._columns.append(term) @builder - def insert(self, *terms: Any) -> "Self": # type:ignore[return] + def insert(self, *terms: Any) -> Self: # type:ignore[return] if self._insert_table is None: raise AttributeError("'Query' object has no attribute '%s'" % "insert") @@ -1017,7 +1016,7 @@ def insert(self, *terms: Any) -> "Self": # type:ignore[return] self._replace = False @builder - def replace(self, *terms: Any) -> "Self": # type:ignore[return] + def replace(self, *terms: Any) -> Self: # type:ignore[return] if self._insert_table is None: raise AttributeError("'Query' object has no attribute '%s'" % "insert") @@ -1028,7 +1027,7 @@ def replace(self, *terms: Any) -> "Self": # type:ignore[return] @builder def force_index( # type:ignore[return] self, term: str | Index, *terms: str | Index - ) -> "Self": + ) -> Self: for t in (term, *terms): if isinstance(t, Index): self._force_indexes.append(t) @@ -1038,7 +1037,7 @@ def force_index( # type:ignore[return] @builder def use_index( # type:ignore[return] self, term: str | Index, *terms: str | Index - ) -> "Self": + ) -> Self: for t in (term, *terms): if isinstance(t, Index): self._use_indexes.append(t) @@ -1046,7 +1045,7 @@ def use_index( # type:ignore[return] self._use_indexes.append(Index(t)) @builder - def distinct(self) -> "Self": # type:ignore[return] + def distinct(self) -> Self: # type:ignore[return] self._distinct = True @builder @@ -1056,7 +1055,7 @@ def for_update( # type:ignore[return] skip_locked: bool = False, of: tuple[str, ...] = (), no_key: bool = False, - ) -> "Self": + ) -> Self: self._for_update = True self._for_update_skip_locked = skip_locked self._for_update_nowait = nowait @@ -1064,13 +1063,13 @@ def for_update( # type:ignore[return] self._for_update_no_key = no_key @builder - def do_nothing(self) -> "Self": # type:ignore[return] + def do_nothing(self) -> Self: # type:ignore[return] if len(self._on_conflict_do_updates) > 0: raise QueryException("Can not have two conflict handlers") self._on_conflict_do_nothing = True @builder - def prewhere(self, criterion: Criterion) -> "Self": # type:ignore[return] + def prewhere(self, criterion: Criterion) -> Self: # type:ignore[return] if not self._validate_table(criterion): self._foreign_table = True @@ -1080,7 +1079,7 @@ def prewhere(self, criterion: Criterion) -> "Self": # type:ignore[return] self._prewheres = criterion @builder - def where(self, criterion: Term | EmptyCriterion) -> "Self": # type:ignore[return] + def where(self, criterion: Term | EmptyCriterion) -> Self: # type:ignore[return] if isinstance(criterion, EmptyCriterion): return # type:ignore[return-value] if not self._on_conflict: @@ -1107,14 +1106,14 @@ def where(self, criterion: Term | EmptyCriterion) -> "Self": # type:ignore[retu raise QueryException("Can not have fieldless ON CONFLICT WHERE") @builder - def having(self, criterion: Criterion) -> "Self": # type:ignore[return] + def having(self, criterion: Criterion) -> Self: # type:ignore[return] if self._havings: self._havings &= criterion else: self._havings = criterion @builder - def groupby(self, *terms: str | int | Term) -> "Self": # type:ignore[return] + def groupby(self, *terms: str | int | Term) -> Self: # type:ignore[return] for term in terms: if isinstance(term, str): term = Field(term, table=self._from[0]) @@ -1125,13 +1124,13 @@ def groupby(self, *terms: str | int | Term) -> "Self": # type:ignore[return] self._groupbys.append(term) # type:ignore[arg-type] @builder - def with_totals(self) -> "Self": # type:ignore[return] + def with_totals(self) -> Self: # type:ignore[return] self._with_totals = True @builder def rollup( # type:ignore[return] self, *terms: list | tuple | set | Term, **kwargs: Any - ) -> "Self": + ) -> Self: for_mysql = "mysql" == kwargs.get("vendor") if self._mysql_rollup: @@ -1160,7 +1159,7 @@ def rollup( # type:ignore[return] self._groupbys.append(Rollup(*terms)) # type:ignore[arg-type] @builder - def orderby(self, *fields: Any, **kwargs: Any) -> "Self": # type:ignore[return] + def orderby(self, *fields: Any, **kwargs: Any) -> Self: # type:ignore[return] for field in fields: field = ( Field(field, table=self._from[0]) @@ -1173,9 +1172,9 @@ def orderby(self, *fields: Any, **kwargs: Any) -> "Self": # type:ignore[return] @builder def join( self, - item: Table | "QueryBuilder" | AliasedQuery | Selectable, + item: Table | QueryBuilder | AliasedQuery | Selectable, how: JoinType = JoinType.inner, - ) -> "Joiner": + ) -> Joiner: if isinstance(item, Table): return Joiner(self, item, how, type_label="table") @@ -1192,39 +1191,39 @@ def join( raise ValueError("Cannot join on type '%s'" % type(item)) - def inner_join(self, item: Table | "QueryBuilder" | AliasedQuery) -> "Joiner": + def inner_join(self, item: Table | QueryBuilder | AliasedQuery) -> Joiner: return self.join(item, JoinType.inner) - def left_join(self, item: Table | "QueryBuilder" | AliasedQuery) -> "Joiner": + def left_join(self, item: Table | QueryBuilder | AliasedQuery) -> Joiner: return self.join(item, JoinType.left) - def left_outer_join(self, item: Table | "QueryBuilder" | AliasedQuery) -> "Joiner": + def left_outer_join(self, item: Table | QueryBuilder | AliasedQuery) -> Joiner: return self.join(item, JoinType.left_outer) - def right_join(self, item: Table | "QueryBuilder" | AliasedQuery) -> "Joiner": + def right_join(self, item: Table | QueryBuilder | AliasedQuery) -> Joiner: return self.join(item, JoinType.right) - def right_outer_join(self, item: Table | "QueryBuilder" | AliasedQuery) -> "Joiner": + def right_outer_join(self, item: Table | QueryBuilder | AliasedQuery) -> Joiner: return self.join(item, JoinType.right_outer) - def outer_join(self, item: Table | "QueryBuilder" | AliasedQuery) -> "Joiner": + def outer_join(self, item: Table | QueryBuilder | AliasedQuery) -> Joiner: return self.join(item, JoinType.outer) - def full_outer_join(self, item: Table | "QueryBuilder" | AliasedQuery) -> "Joiner": + def full_outer_join(self, item: Table | QueryBuilder | AliasedQuery) -> Joiner: return self.join(item, JoinType.full_outer) - def cross_join(self, item: Table | "QueryBuilder" | AliasedQuery) -> "Joiner": + def cross_join(self, item: Table | QueryBuilder | AliasedQuery) -> Joiner: return self.join(item, JoinType.cross) - def hash_join(self, item: Table | "QueryBuilder" | AliasedQuery) -> "Joiner": + def hash_join(self, item: Table | QueryBuilder | AliasedQuery) -> Joiner: return self.join(item, JoinType.hash) @builder - def limit(self, limit: int) -> "Self": # type:ignore[return] + def limit(self, limit: int) -> Self: # type:ignore[return] self._limit = cast(ValueWrapper, self.wrap_constant(limit)) @builder - def offset(self, offset: int) -> "Self": # type:ignore[return] + def offset(self, offset: int) -> Self: # type:ignore[return] self._offset = cast(ValueWrapper, self.wrap_constant(offset)) @builder @@ -1248,7 +1247,7 @@ def minus(self, other: Self) -> _SetOperation: return _SetOperation(self, other, SetOperation.minus, wrapper_cls=self._wrapper_cls) @builder - def set(self, field: Field | str, value: Any) -> "Self": # type:ignore[return] + def set(self, field: Field | str, value: Any) -> Self: # type:ignore[return] field = Field(field) if not isinstance(field, Field) else field value = self.wrap_constant(value, wrapper_cls=self._wrapper_cls) self._updates.append((field, value)) @@ -1263,7 +1262,7 @@ def __sub__(self, other: Self) -> _SetOperation: # type:ignore[override] return self.minus(other) @builder - def slice(self, slice: slice) -> "Self": # type:ignore[return] + def slice(self, slice: slice) -> Self: # type:ignore[return] if slice.start is not None: self._offset = cast(ValueWrapper, self.wrap_constant(slice.start)) if slice.stop is not None: @@ -1315,7 +1314,7 @@ def fields_(self) -> list[Field]: # type:ignore[override] # Don't return anything here. Subqueries have their own fields. return [] - def do_join(self, join: "Join") -> None: + def do_join(self, join: Join) -> None: base_tables = self._from + [self._update_table] + self._with join.validate(base_tables, self._joins) # type:ignore[arg-type] @@ -1828,7 +1827,7 @@ def validate(self, _from: Sequence[Table], _joins: Sequence[Table]) -> None: @builder def replace_table( # type:ignore[return] self, current_table: Table | None, new_table: Table | None - ) -> "Self": + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -1879,7 +1878,7 @@ def validate(self, _from: Sequence[Table], _joins: Sequence[Table]) -> None: @builder def replace_table( # type:ignore[return] self, current_table: Table | None, new_table: Table | None - ) -> "Self": + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -1914,7 +1913,7 @@ def validate(self, _from: Sequence[Table], _joins: Sequence[Table]) -> None: @builder def replace_table( # type:ignore[return] self, current_table: Table | None, new_table: Table | None - ) -> "Self": + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -1952,7 +1951,7 @@ def __init__(self, dialect: Dialects | None = None) -> None: self.dialect = dialect @builder - def create_table(self, table: Table | str) -> "Self": # type:ignore[return] + def create_table(self, table: Table | str) -> Self: # type:ignore[return] """ Creates the table. @@ -1971,7 +1970,7 @@ def create_table(self, table: Table | str) -> "Self": # type:ignore[return] self._create_table = table if isinstance(table, Table) else Table(table) @builder - def temporary(self) -> "Self": # type:ignore[return] + def temporary(self) -> Self: # type:ignore[return] """ Makes the table temporary. @@ -1981,7 +1980,7 @@ def temporary(self) -> "Self": # type:ignore[return] self._temporary = True @builder - def unlogged(self) -> "Self": # type:ignore[return] + def unlogged(self) -> Self: # type:ignore[return] """ Makes the table unlogged. @@ -1991,7 +1990,7 @@ def unlogged(self) -> "Self": # type:ignore[return] self._unlogged = True @builder - def with_system_versioning(self) -> "Self": # type:ignore[return] + def with_system_versioning(self) -> Self: # type:ignore[return] """ Adds system versioning. @@ -2003,7 +2002,7 @@ def with_system_versioning(self) -> "Self": # type:ignore[return] @builder def columns( # type:ignore[return] self, *columns: str | tuple[str, str] | Column - ) -> "Self": + ) -> Self: """ Adds the columns. @@ -2031,7 +2030,7 @@ def columns( # type:ignore[return] @builder def period_for( # type:ignore[return] self, name, start_column: str | Column, end_column: str | Column - ) -> "Self": + ) -> Self: """ Adds a PERIOD FOR clause. @@ -2050,7 +2049,7 @@ def period_for( # type:ignore[return] self._period_fors.append(PeriodFor(name, start_column, end_column)) @builder - def unique(self, *columns: str | Column) -> "Self": # type:ignore[return] + def unique(self, *columns: str | Column) -> Self: # type:ignore[return] """ Adds a UNIQUE constraint. @@ -2067,7 +2066,7 @@ def unique(self, *columns: str | Column) -> "Self": # type:ignore[return] ) @builder - def primary_key(self, *columns: str | Column) -> "Self": # type:ignore[return] + def primary_key(self, *columns: str | Column) -> Self: # type:ignore[return] """ Adds a primary key constraint. @@ -2089,7 +2088,7 @@ def primary_key(self, *columns: str | Column) -> "Self": # type:ignore[return] ] @builder - def as_select(self, query_builder: QueryBuilder) -> "Self": # type:ignore[return] + def as_select(self, query_builder: QueryBuilder) -> Self: # type:ignore[return] """ Creates the table from a select statement. @@ -2111,7 +2110,7 @@ def as_select(self, query_builder: QueryBuilder) -> "Self": # type:ignore[retur self._as_select = query_builder @builder - def if_not_exists(self) -> "Self": # type:ignore[return] + def if_not_exists(self) -> Self: # type:ignore[return] self._if_not_exists = True def get_sql(self, ctx: SqlContext | None) -> str: @@ -2232,14 +2231,14 @@ def get_sql(self, ctx: SqlContext | None = None) -> str: return querystring @builder - def drop_table(self, table: Table | str) -> "Self": # type:ignore[return] + def drop_table(self, table: Table | str) -> Self: # type:ignore[return] if self._drop_table: raise AttributeError("'Query' object already has attribute drop_table") self._drop_table = table if isinstance(table, Table) else Table(table) @builder - def if_exists(self) -> "Self": # type:ignore[return] + def if_exists(self) -> Self: # type:ignore[return] self._if_exists = True def _drop_table_sql(self, ctx: SqlContext) -> str: diff --git a/pypika_tortoise/terms.py b/pypika_tortoise/terms.py index 3271df7..4d4b229 100644 --- a/pypika_tortoise/terms.py +++ b/pypika_tortoise/terms.py @@ -5,9 +5,10 @@ import re import sys import uuid +from collections.abc import Iterable, Iterator, Sequence from datetime import date, time from enum import Enum -from typing import TYPE_CHECKING, Any, Callable, Iterable, Iterator, Sequence, Type, TypeVar, cast +from typing import TYPE_CHECKING, Any, Callable, TypeVar, cast from .context import DEFAULT_SQL_CONTEXT, SqlContext from .enums import ( @@ -42,7 +43,7 @@ class Node: def nodes_(self) -> Iterator[NodeT]: yield self # type:ignore[misc] - def find_(self, type: Type[NodeT]) -> list[NodeT]: + def find_(self, type: type[NodeT]) -> list[NodeT]: return [ # type:ignore[var-annotated] node for node in self.nodes_() if isinstance(node, type) ] @@ -55,22 +56,22 @@ def __init__(self, alias: str | None = None) -> None: self.alias = alias @builder - def as_(self, alias: str) -> "Self": # type:ignore[return] + def as_(self, alias: str) -> Self: # type:ignore[return] self.alias = alias @property - def tables_(self) -> set["Table"]: + def tables_(self) -> set[Table]: from . import Table return set(self.find_(Table)) - def fields_(self) -> set["Field"]: + def fields_(self) -> set[Field]: return set(self.find_(Field)) @staticmethod def wrap_constant( - val, wrapper_cls: Type["Term"] | None = None - ) -> NodeT | "LiteralValue" | "Array" | "Tuple" | "ValueWrapper": + val, wrapper_cls: type[Term] | None = None + ) -> NodeT | LiteralValue | Array | Tuple | ValueWrapper: """ Used for wrapping raw inputs such as numbers in Criterions and Operator. @@ -101,8 +102,8 @@ def wrap_constant( @staticmethod def wrap_json( - val: "Term" | "QueryBuilder" | "Interval" | None | str | int | bool, wrapper_cls=None - ) -> "Term" | "QueryBuilder" | "Interval" | "NullValue" | "ValueWrapper" | "JSON": + val: Term | QueryBuilder | Interval | None | str | int | bool, wrapper_cls=None + ) -> Term | QueryBuilder | Interval | NullValue | ValueWrapper | JSON: from .queries import QueryBuilder if isinstance(val, (Term, QueryBuilder, Interval)): @@ -115,7 +116,7 @@ def wrap_json( return JSON(val) - def replace_table(self, current_table: "Table" | None, new_table: "Table" | None) -> "Self": + def replace_table(self, current_table: Table | None, new_table: Table | None) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. The base implementation returns self because not all terms have a table property. @@ -129,138 +130,138 @@ def replace_table(self, current_table: "Table" | None, new_table: "Table" | None """ return self - def eq(self, other: Any) -> "BasicCriterion": + def eq(self, other: Any) -> BasicCriterion: return self == other - def isnull(self) -> "NullCriterion": + def isnull(self) -> NullCriterion: return NullCriterion(self) - def notnull(self) -> "Not": + def notnull(self) -> Not: return self.isnull().negate() - def bitwiseand(self, value: int) -> "BitwiseAndCriterion": + def bitwiseand(self, value: int) -> BitwiseAndCriterion: return BitwiseAndCriterion(self, self.wrap_constant(value)) - def gt(self, other: Any) -> "BasicCriterion": + def gt(self, other: Any) -> BasicCriterion: return self > other - def gte(self, other: Any) -> "BasicCriterion": + def gte(self, other: Any) -> BasicCriterion: return self >= other - def lt(self, other: Any) -> "BasicCriterion": + def lt(self, other: Any) -> BasicCriterion: return self < other - def lte(self, other: Any) -> "BasicCriterion": + def lte(self, other: Any) -> BasicCriterion: return self <= other - def ne(self, other: Any) -> "BasicCriterion": + def ne(self, other: Any) -> BasicCriterion: return self != other - def glob(self, expr: str) -> "BasicCriterion": + def glob(self, expr: str) -> BasicCriterion: return BasicCriterion(Matching.glob, self, self.wrap_constant(expr)) - def like(self, expr: str) -> "BasicCriterion": + def like(self, expr: str) -> BasicCriterion: return BasicCriterion(Matching.like, self, self.wrap_constant(expr)) - def not_like(self, expr: str) -> "BasicCriterion": + def not_like(self, expr: str) -> BasicCriterion: return BasicCriterion(Matching.not_like, self, self.wrap_constant(expr)) - def ilike(self, expr: str) -> "BasicCriterion": + def ilike(self, expr: str) -> BasicCriterion: return BasicCriterion(Matching.ilike, self, self.wrap_constant(expr)) - def not_ilike(self, expr: str) -> "BasicCriterion": + def not_ilike(self, expr: str) -> BasicCriterion: return BasicCriterion(Matching.not_ilike, self, self.wrap_constant(expr)) - def rlike(self, expr: str) -> "BasicCriterion": + def rlike(self, expr: str) -> BasicCriterion: return BasicCriterion(Matching.rlike, self, self.wrap_constant(expr)) - def regex(self, pattern: str) -> "BasicCriterion": + def regex(self, pattern: str) -> BasicCriterion: return BasicCriterion(Matching.regex, self, self.wrap_constant(pattern)) - def between(self, lower: Any, upper: Any) -> "BetweenCriterion": + def between(self, lower: Any, upper: Any) -> BetweenCriterion: return BetweenCriterion(self, self.wrap_constant(lower), self.wrap_constant(upper)) - def from_to(self, start: Any, end: Any) -> "PeriodCriterion": + def from_to(self, start: Any, end: Any) -> PeriodCriterion: return PeriodCriterion(self, self.wrap_constant(start), self.wrap_constant(end)) - def as_of(self, expr: str) -> "BasicCriterion": + def as_of(self, expr: str) -> BasicCriterion: return BasicCriterion(Matching.as_of, self, self.wrap_constant(expr)) - def all_(self) -> "All": + def all_(self) -> All: return All(self) - def isin(self, arg: list | tuple | set | "Term") -> "ContainsCriterion": + def isin(self, arg: list | tuple | set | Term) -> ContainsCriterion: if isinstance(arg, (list, tuple, set)): return ContainsCriterion(self, Tuple(*arg)) return ContainsCriterion(self, arg) - def notin(self, arg: list | tuple | set | "Term") -> "ContainsCriterion": + def notin(self, arg: list | tuple | set | Term) -> ContainsCriterion: return self.isin(arg).negate() - def bin_regex(self, pattern: str) -> "BasicCriterion": + def bin_regex(self, pattern: str) -> BasicCriterion: return BasicCriterion(Matching.bin_regex, self, self.wrap_constant(pattern)) - def negate(self) -> "Not": + def negate(self) -> Not: return Not(self) - def __invert__(self) -> "Not": + def __invert__(self) -> Not: return Not(self) - def __pos__(self) -> "Self": + def __pos__(self) -> Self: return self - def __neg__(self) -> "Negative": + def __neg__(self) -> Negative: return Negative(self) - def __add__(self, other: Any) -> "ArithmeticExpression": + def __add__(self, other: Any) -> ArithmeticExpression: return ArithmeticExpression(Arithmetic.add, self, self.wrap_constant(other)) - def __sub__(self, other: Any) -> "ArithmeticExpression": + def __sub__(self, other: Any) -> ArithmeticExpression: return ArithmeticExpression(Arithmetic.sub, self, self.wrap_constant(other)) - def __mul__(self, other: Any) -> "ArithmeticExpression": + def __mul__(self, other: Any) -> ArithmeticExpression: return ArithmeticExpression(Arithmetic.mul, self, self.wrap_constant(other)) - def __truediv__(self, other: Any) -> "ArithmeticExpression": + def __truediv__(self, other: Any) -> ArithmeticExpression: return ArithmeticExpression(Arithmetic.div, self, self.wrap_constant(other)) - def __pow__(self, other: Any) -> "Pow": + def __pow__(self, other: Any) -> Pow: return Pow(self, other) - def __mod__(self, other: Any) -> "Mod": + def __mod__(self, other: Any) -> Mod: return Mod(self, other) - def __radd__(self, other: Any) -> "ArithmeticExpression": + def __radd__(self, other: Any) -> ArithmeticExpression: return ArithmeticExpression(Arithmetic.add, self.wrap_constant(other), self) - def __rsub__(self, other: Any) -> "ArithmeticExpression": + def __rsub__(self, other: Any) -> ArithmeticExpression: return ArithmeticExpression(Arithmetic.sub, self.wrap_constant(other), self) - def __rmul__(self, other: Any) -> "ArithmeticExpression": + def __rmul__(self, other: Any) -> ArithmeticExpression: return ArithmeticExpression(Arithmetic.mul, self.wrap_constant(other), self) - def __rtruediv__(self, other: Any) -> "ArithmeticExpression": + def __rtruediv__(self, other: Any) -> ArithmeticExpression: return ArithmeticExpression(Arithmetic.div, self.wrap_constant(other), self) - def __eq__(self, other: Any) -> "BasicCriterion": # type:ignore[override] + def __eq__(self, other: Any) -> BasicCriterion: # type:ignore[override] return BasicCriterion(Equality.eq, self, self.wrap_constant(other)) - def __ne__(self, other: Any) -> "BasicCriterion": # type:ignore[override] + def __ne__(self, other: Any) -> BasicCriterion: # type:ignore[override] return BasicCriterion(Equality.ne, self, self.wrap_constant(other)) - def __gt__(self, other: Any) -> "BasicCriterion": + def __gt__(self, other: Any) -> BasicCriterion: return BasicCriterion(Equality.gt, self, self.wrap_constant(other)) - def __ge__(self, other: Any) -> "BasicCriterion": + def __ge__(self, other: Any) -> BasicCriterion: return BasicCriterion(Equality.gte, self, self.wrap_constant(other)) - def __lt__(self, other: Any) -> "BasicCriterion": + def __lt__(self, other: Any) -> BasicCriterion: return BasicCriterion(Equality.lt, self, self.wrap_constant(other)) - def __le__(self, other: Any) -> "BasicCriterion": + def __le__(self, other: Any) -> BasicCriterion: return BasicCriterion(Equality.lte, self, self.wrap_constant(other)) - def __getitem__(self, item: slice) -> "BetweenCriterion": + def __getitem__(self, item: slice) -> BetweenCriterion: if not isinstance(item, slice): raise TypeError("Field' object is not subscriptable") return self.between(item.start, item.stop) @@ -429,7 +430,7 @@ def get_sql( class JSON(Term): - table: "Table" | None = None + table: Table | None = None def __init__(self, value: Any = None, alias: str | None = None) -> None: super().__init__(alias) @@ -466,64 +467,64 @@ def get_sql(self, ctx: SqlContext) -> str: sql = format_quotes(self._recursive_get_sql(self.value), ctx.secondary_quote_char) return format_alias_sql(sql, self.alias, ctx) - def get_json_value(self, key_or_index: str | int) -> "BasicCriterion": + def get_json_value(self, key_or_index: str | int) -> BasicCriterion: return BasicCriterion( JSONOperators.GET_JSON_VALUE, self, self.wrap_constant(key_or_index), ) - def get_text_value(self, key_or_index: str | int) -> "BasicCriterion": + def get_text_value(self, key_or_index: str | int) -> BasicCriterion: return BasicCriterion( JSONOperators.GET_TEXT_VALUE, self, self.wrap_constant(key_or_index), ) - def get_path_json_value(self, path_json: str) -> "BasicCriterion": + def get_path_json_value(self, path_json: str) -> BasicCriterion: return BasicCriterion( JSONOperators.GET_PATH_JSON_VALUE, self, self.wrap_json(path_json), # type:ignore[arg-type] ) - def get_path_text_value(self, path_json: str) -> "BasicCriterion": + def get_path_text_value(self, path_json: str) -> BasicCriterion: return BasicCriterion( JSONOperators.GET_PATH_TEXT_VALUE, self, self.wrap_json(path_json), # type:ignore[arg-type] ) - def has_key(self, other: Any) -> "BasicCriterion": + def has_key(self, other: Any) -> BasicCriterion: return BasicCriterion( JSONOperators.HAS_KEY, self, self.wrap_json(other), # type:ignore[arg-type] ) - def contains(self, other: Any) -> "BasicCriterion": + def contains(self, other: Any) -> BasicCriterion: return BasicCriterion( JSONOperators.CONTAINS, self, self.wrap_json(other), # type:ignore[arg-type] ) - def contained_by(self, other: Any) -> "BasicCriterion": + def contained_by(self, other: Any) -> BasicCriterion: return BasicCriterion( JSONOperators.CONTAINED_BY, self, self.wrap_json(other), # type:ignore[arg-type] ) - def has_keys(self, other: Iterable) -> "BasicCriterion": + def has_keys(self, other: Iterable) -> BasicCriterion: return BasicCriterion(JSONOperators.HAS_KEYS, self, Array(*other)) - def has_any_keys(self, other: Iterable) -> "BasicCriterion": + def has_any_keys(self, other: Iterable) -> BasicCriterion: return BasicCriterion(JSONOperators.HAS_ANY_KEYS, self, Array(*other)) class Values(Term): - def __init__(self, field: str | "Field") -> None: + def __init__(self, field: str | Field) -> None: super().__init__(None) self.field = Field(field) if not isinstance(field, Field) else field @@ -551,17 +552,17 @@ def __init__(self, alias: str | None = None) -> None: class Criterion(Term): - def __and__(self, other: Any) -> "ComplexCriterion": + def __and__(self, other: Any) -> ComplexCriterion: return ComplexCriterion(Boolean.and_, self, other) - def __or__(self, other: Any) -> "ComplexCriterion": + def __or__(self, other: Any) -> ComplexCriterion: return ComplexCriterion(Boolean.or_, self, other) - def __xor__(self, other: Any) -> "ComplexCriterion": + def __xor__(self, other: Any) -> ComplexCriterion: return ComplexCriterion(Boolean.xor_, self, other) @staticmethod - def any(terms: Iterable[Term] = ()) -> "EmptyCriterion": + def any(terms: Iterable[Term] = ()) -> EmptyCriterion: crit = EmptyCriterion() for term in terms: @@ -570,7 +571,7 @@ def any(terms: Iterable[Term] = ()) -> "EmptyCriterion": return crit @staticmethod - def all(terms: Iterable[Any] = ()) -> "EmptyCriterion": + def all(terms: Iterable[Any] = ()) -> EmptyCriterion: crit = EmptyCriterion() for term in terms: @@ -584,9 +585,9 @@ def get_sql(self, ctx: SqlContext) -> str: class EmptyCriterion: is_aggregate: bool | None = None - tables_: set["Table"] = set() + tables_: set[Table] = set() - def fields_(self) -> set["Field"]: + def fields_(self) -> set[Field]: return set() def __and__(self, other: T) -> T: @@ -604,7 +605,7 @@ def __init__( self, name: str, alias: str | None = None, - table: str | "Selectable" | None = None, + table: str | Selectable | None = None, ) -> None: super().__init__(alias=alias) self.name = name @@ -617,8 +618,8 @@ def nodes_(self) -> Iterator[NodeT]: @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -659,7 +660,7 @@ def get_sql(self, ctx: SqlContext) -> str: class Star(Field): - def __init__(self, table: str | "Selectable" | None = None) -> None: + def __init__(self, table: str | Selectable | None = None) -> None: super().__init__("*", table=table) def nodes_(self) -> Iterator[NodeT]: @@ -695,8 +696,8 @@ def is_aggregate(self) -> bool | None: # type:ignore[override] @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -740,7 +741,7 @@ class NestedCriterion(Criterion): def __init__( self, comparator: Comparator, - nested_comparator: "ComplexCriterion", + nested_comparator: ComplexCriterion, left: Any, right: Any, nested: Any, @@ -767,8 +768,8 @@ def is_aggregate(self) -> bool | None: # type:ignore[override] @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -836,8 +837,8 @@ def is_aggregate(self) -> bool | None: # type:ignore[override] @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -890,8 +891,8 @@ def is_aggregate(self) -> bool | None: # type:ignore[override] @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -914,7 +915,7 @@ def get_sql(self, ctx: SqlContext) -> str: return format_alias_sql(sql, self.alias, ctx) @builder - def negate(self) -> "Self": # type:ignore[return,override] + def negate(self) -> Self: # type:ignore[return,override] self._is_negated = True @@ -939,8 +940,8 @@ def is_aggregate(self) -> bool | None: # type:ignore[override] class BetweenCriterion(RangeCriterion): @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -986,8 +987,8 @@ def nodes_(self) -> Iterator[NodeT]: @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -1019,8 +1020,8 @@ def nodes_(self) -> Iterator[NodeT]: @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -1102,8 +1103,8 @@ def is_aggregate(self) -> bool | None: # type:ignore[override] @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -1204,13 +1205,13 @@ def is_aggregate(self) -> bool | None: # type:ignore[override] ) @builder - def when(self, criterion: Any, term: Any) -> "Self": # type:ignore[return] + def when(self, criterion: Any, term: Any) -> Self: # type:ignore[return] self._cases.append((criterion, self.wrap_constant(term))) @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -1231,7 +1232,7 @@ def replace_table( # type:ignore[return] self._else = self._else.replace_table(current_table, new_table) if self._else else None @builder - def else_(self, term: Any) -> "Self": + def else_(self, term: Any) -> Self: self._else = self.wrap_constant(term) return self @@ -1290,8 +1291,8 @@ def inner(inner_self, *args, **kwargs) -> Not | T: @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -1324,7 +1325,7 @@ def __init__(self, name: str, params: Sequence | None = None) -> None: self.name = name self.params = params - def __call__(self, *args: Any, **kwargs: Any) -> "Function": + def __call__(self, *args: Any, **kwargs: Any) -> Function: if not self._has_params(): return Function(self.name, alias=kwargs.get("alias")) @@ -1370,8 +1371,8 @@ def is_aggregate(self) -> bool | None: # type:ignore[override] @builder def replace_table( # type:ignore[return] - self, current_table: "Table" | None, new_table: "Table" | None - ) -> "Self": + self, current_table: Table | None, new_table: Table | None + ) -> Self: """ Replaces all occurrences of the specified table with the new table. Useful when reusing fields across queries. @@ -1461,12 +1462,12 @@ def __init__(self, name: str, *args: Any, **kwargs: Any) -> None: self._include_over = False @builder - def over(self, *terms: Any) -> "Self": # type:ignore[return] + def over(self, *terms: Any) -> Self: # type:ignore[return] self._include_over = True self._partition += terms @builder - def orderby(self, *terms: Any, **kwargs: Any) -> "Self": # type:ignore[return] + def orderby(self, *terms: Any, **kwargs: Any) -> Self: # type:ignore[return] self._include_over = True self._orderbys += [(term, kwargs.get("order")) for term in terms] @@ -1544,13 +1545,13 @@ def _set_frame_and_bounds( @builder def rows( # type:ignore[return] self, bound: str | EdgeT, and_bound: EdgeT | None = None - ) -> "Self": + ) -> Self: self._set_frame_and_bounds("ROWS", bound, and_bound) @builder def range( # type:ignore[return] self, bound: str | EdgeT, and_bound: EdgeT | None = None - ) -> "Self": + ) -> Self: self._set_frame_and_bounds("RANGE", bound, and_bound) def get_frame_sql(self) -> str: @@ -1579,7 +1580,7 @@ def __init__(self, name: str, *args: Any, **kwargs: Any) -> None: self._ignore_nulls = False @builder - def ignore_nulls(self) -> "Self": # type:ignore[return] + def ignore_nulls(self) -> Self: # type:ignore[return] self._ignore_nulls = True def get_special_params_sql(self, ctx: SqlContext) -> str | None: diff --git a/pypika_tortoise/utils.py b/pypika_tortoise/utils.py index fc03be7..8db9b78 100644 --- a/pypika_tortoise/utils.py +++ b/pypika_tortoise/utils.py @@ -1,6 +1,6 @@ from __future__ import annotations -from typing import Any, Callable, Type, TypeVar +from typing import Any, Callable, TypeVar from .context import SqlContext @@ -91,7 +91,7 @@ def format_alias_sql( ) -def validate(*args: Any, exc: Exception | None = None, type: Type | None = None) -> None: +def validate(*args: Any, exc: Exception | None = None, type: type | None = None) -> None: if type is not None: for arg in args: if not isinstance(arg, type): diff --git a/pyproject.toml b/pyproject.toml index 3461f78..69c32a7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,9 +47,19 @@ warn_unused_ignores = true [tool.ruff] line-length = 100 +[tool.ruff.lint] +extend-select = [ + "FA", # https://docs.astral.sh/ruff/rules/#flake8-future-annotations-fa + "UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up + "RUF100", # https://docs.astral.sh/ruff/rules/#ruff-specific-rules-ruf +] +ignore = ["UP031", "UP032"] # https://docs.astral.sh/ruff/rules/printf-string-formatting/ + [tool.ruff.lint.per-file-ignores] 'pypika_tortoise/__init__.py' = ['F401'] 'pypika_tortoise/dialects/__init__.py' = ['F401'] +'tests/test_functions.py' = ['UP034'] +'tests/dialects/test_postgresql.py' = ['RUF100'] [tool.bandit] exclude_dirs = ["tests", "conftest.py"]