diff --git a/Pipfile b/Pipfile index bba99edd0..7a8e66320 100644 --- a/Pipfile +++ b/Pipfile @@ -10,6 +10,7 @@ pylint = "==2.10.2" coverage = "~=5.5" # api-server api-server = {editable = true, path = "./packages/api-server"} +httpx = "~=0.26.0" asyncpg = "~=0.25.0" datamodel-code-generator = "==0.11.19" requests = "~=2.25" diff --git a/Pipfile.lock b/Pipfile.lock index 6c419fd53..431412c5a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "dbd27618330e225946b91e4be322e7c258abc9b8a3772ffaf7ef93eeaa9ef4b3" + "sha256": "ed96c413cc4942791c034f90cf34b2b774f5d48909217aea620b24fa0b394a81" }, "pipfile-spec": 6, "requires": { @@ -35,11 +35,11 @@ }, "anyio": { "hashes": [ - "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421", - "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3" + "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee", + "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f" ], - "markers": "python_full_version >= '3.6.2'", - "version": "==3.6.2" + "markers": "python_version >= '3.8'", + "version": "==4.2.0" }, "api-server": { "editable": true, @@ -47,11 +47,11 @@ }, "argcomplete": { "hashes": [ - "sha256:6372ad78c89d662035101418ae253668445b391755cfe94ea52f1b9d22425b20", - "sha256:cffa11ea77999bb0dd27bb25ff6dc142a6796142f68d45b1a26b11f58724561e" + "sha256:4ba9cdaa28c361d251edce884cd50b4b1215d65cdc881bd204426cdde9f52731", + "sha256:fc82ef070c607b1559b5c720529d63b54d9dcf2dcfc2632b10e6372314a34457" ], "markers": "python_version >= '3.6'", - "version": "==2.0.0" + "version": "==2.1.2" }, "astroid": { "hashes": [ @@ -95,11 +95,11 @@ }, "attrs": { "hashes": [ - "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", - "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], - "markers": "python_version >= '3.6'", - "version": "==22.2.0" + "markers": "python_version >= '3.7'", + "version": "==23.2.0" }, "bidict": { "hashes": [ @@ -140,80 +140,69 @@ }, "certifi": { "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2022.12.7" + "version": "==2023.11.17" }, "cffi": { "hashes": [ - "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", - "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", - "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", - "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", - "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", - "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", - "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", - "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", - "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", - "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", - "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", - "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", - "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", - "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", - "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", - "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", - "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", - "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", - "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", - "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", - "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", - "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", - "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", - "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", - "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", - "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", - "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", - "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", - "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", - "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", - "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", - "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", - "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", - "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", - "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", - "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", - "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", - "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", - "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", - "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", - "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", - "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", - "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", - "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", - "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", - "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", - "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", - "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", - "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", - "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", - "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", - "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", - "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", - "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", - "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", - "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", - "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", - "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", - "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", - "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", - "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", - "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", - "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" - ], - "version": "==1.15.1" + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + ], + "markers": "platform_python_implementation != 'PyPy'", + "version": "==1.16.0" }, "chardet": { "hashes": [ @@ -225,104 +214,107 @@ }, "charset-normalizer": { "hashes": [ - "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b", - "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42", - "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d", - "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b", - "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a", - "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59", - "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154", - "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1", - "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c", - "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a", - "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d", - "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6", - "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b", - "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b", - "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783", - "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5", - "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918", - "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555", - "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639", - "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786", - "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e", - "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed", - "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820", - "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8", - "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3", - "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541", - "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14", - "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be", - "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e", - "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76", - "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", - "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c", - "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b", - "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3", - "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc", - "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6", - "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59", - "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4", - "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d", - "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d", - "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3", - "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a", - "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea", - "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6", - "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e", - "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", - "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24", - "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a", - "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58", - "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678", - "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a", - "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c", - "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6", - "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18", - "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174", - "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", - "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f", - "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc", - "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837", - "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41", - "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c", - "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579", - "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753", - "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8", - "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291", - "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087", - "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866", - "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3", - "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d", - "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1", - "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca", - "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e", - "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db", - "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72", - "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d", - "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc", - "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539", - "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d", - "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af", - "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b", - "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602", - "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", - "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478", - "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c", - "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e", - "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479", - "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7", - "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8" - ], - "version": "==3.0.1" + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" }, "click": { "hashes": [ - "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", - "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], "markers": "python_version >= '3.7'", - "version": "==8.1.3" + "version": "==8.1.7" }, "coverage": { "hashes": [ @@ -384,31 +376,40 @@ }, "cryptography": { "hashes": [ - "sha256:1a6915075c6d3a5e1215eab5d99bcec0da26036ff2102a1038401d6ef5bef25b", - "sha256:1ee1fd0de9851ff32dbbb9362a4d833b579b4a6cc96883e8e6d2ff2a6bc7104f", - "sha256:407cec680e811b4fc829de966f88a7c62a596faa250fc1a4b520a0355b9bc190", - "sha256:50386acb40fbabbceeb2986332f0287f50f29ccf1497bae31cf5c3e7b4f4b34f", - "sha256:6f97109336df5c178ee7c9c711b264c502b905c2d2a29ace99ed761533a3460f", - "sha256:754978da4d0457e7ca176f58c57b1f9de6556591c19b25b8bcce3c77d314f5eb", - "sha256:76c24dd4fd196a80f9f2f5405a778a8ca132f16b10af113474005635fe7e066c", - "sha256:7dacfdeee048814563eaaec7c4743c8aea529fe3dd53127313a792f0dadc1773", - "sha256:80ee674c08aaef194bc4627b7f2956e5ba7ef29c3cc3ca488cf15854838a8f72", - "sha256:844ad4d7c3850081dffba91cdd91950038ee4ac525c575509a42d3fc806b83c8", - "sha256:875aea1039d78557c7c6b4db2fe0e9d2413439f4676310a5f269dd342ca7a717", - "sha256:887cbc1ea60786e534b00ba8b04d1095f4272d380ebd5f7a7eb4cc274710fad9", - "sha256:ad04f413436b0781f20c52a661660f1e23bcd89a0e9bb1d6d20822d048cf2856", - "sha256:bae6c7f4a36a25291b619ad064a30a07110a805d08dc89984f4f441f6c1f3f96", - "sha256:c52a1a6f81e738d07f43dab57831c29e57d21c81a942f4602fac7ee21b27f288", - "sha256:e0a05aee6a82d944f9b4edd6a001178787d1546ec7c6223ee9a848a7ade92e39", - "sha256:e324de6972b151f99dc078defe8fb1b0a82c6498e37bff335f5bc6b1e3ab5a1e", - "sha256:e5d71c5d5bd5b5c3eebcf7c5c2bb332d62ec68921a8c593bea8c394911a005ce", - "sha256:f3ed2d864a2fa1666e749fe52fb8e23d8e06b8012e8bd8147c73797c506e86f1", - "sha256:f671c1bb0d6088e94d61d80c606d65baacc0d374e67bf895148883461cd848de", - "sha256:f6c0db08d81ead9576c4d94bbb27aed8d7a430fa27890f39084c2d0e2ec6b0df", - "sha256:f964c7dcf7802d133e8dbd1565914fa0194f9d683d82411989889ecd701e8adf", - "sha256:fec8b932f51ae245121c4671b4bbc030880f363354b2f0e0bd1366017d891458" - ], - "version": "==39.0.0" + "sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b", + "sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd", + "sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94", + "sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221", + "sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e", + "sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513", + "sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d", + "sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc", + "sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0", + "sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2", + "sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87", + "sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01", + "sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0", + "sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4", + "sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b", + "sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81", + "sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3", + "sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4", + "sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf", + "sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec", + "sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce", + "sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0", + "sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f", + "sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f", + "sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3", + "sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689", + "sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08", + "sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139", + "sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434", + "sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17", + "sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8", + "sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440" + ], + "version": "==42.0.0" }, "datamodel-code-generator": { "hashes": [ @@ -420,26 +421,34 @@ }, "dnspython": { "hashes": [ - "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9", - "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46" + "sha256:6facdf76b73c742ccf2d07add296f178e629da60be23ce4b0a9c927b1e02c3a6", + "sha256:a0034815a59ba9ae888946be7ccca8f7c157b286f8455b379c692efb51022a15" ], - "markers": "python_version >= '3.7' and python_version < '4.0'", - "version": "==2.3.0" + "markers": "python_version >= '3.8'", + "version": "==2.5.0" }, "email-validator": { "hashes": [ - "sha256:553a66f8be2ec2dea641ae1d3f29017ab89e9d603d4a25cdaac39eefa283d769", - "sha256:816073f2a7cffef786b29928f58ec16cdac42710a53bb18aa94317e3e145ec5c" + "sha256:a4b0bd1cf55f073b924258d19321b1f3aa74b4b5a71a42c305575dba920e1a44", + "sha256:c973053efbeddfef924dc0bd93f6e77a1ea7ee0fce935aea7103c7a3d6d2d637" ], - "version": "==1.3.0" + "version": "==2.1.0.post1" + }, + "exceptiongroup": { + "hashes": [ + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.0" }, "fastapi": { "hashes": [ - "sha256:15fcabd5c78c266fa7ae7d8de9b384bfc2375ee0503463a6febbe3bab69d6f65", - "sha256:3233d4a789ba018578658e2af1a4bb5e38bdd122ff722b313666a9b2c6786a83" + "sha256:8c77515984cd8e8cfeb58364f8cc7a28f0692088475e2614f7bf03275eba9093", + "sha256:b978095b9ee01a5cf49b19f4bc1ac9b8ca83aa076e770ef8fd9af09a2b88d191" ], - "markers": "python_full_version >= '3.6.1'", - "version": "==0.78.0" + "markers": "python_version >= '3.8'", + "version": "==0.109.0" }, "genson": { "hashes": [ @@ -455,59 +464,70 @@ "markers": "python_version >= '3.7'", "version": "==0.14.0" }, + "httpcore": { + "hashes": [ + "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7", + "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.2" + }, "httptools": { "hashes": [ - "sha256:0297822cea9f90a38df29f48e40b42ac3d48a28637368f3ec6d15eebefd182f9", - "sha256:1af91b3650ce518d226466f30bbba5b6376dbd3ddb1b2be8b0658c6799dd450b", - "sha256:1f90cd6fd97c9a1b7fe9215e60c3bd97336742a0857f00a4cb31547bc22560c2", - "sha256:24bb4bb8ac3882f90aa95403a1cb48465de877e2d5298ad6ddcfdebec060787d", - "sha256:295874861c173f9101960bba332429bb77ed4dcd8cdf5cee9922eb00e4f6bc09", - "sha256:3625a55886257755cb15194efbf209584754e31d336e09e2ffe0685a76cb4b60", - "sha256:3a47a34f6015dd52c9eb629c0f5a8a5193e47bf2a12d9a3194d231eaf1bc451a", - "sha256:3cb8acf8f951363b617a8420768a9f249099b92e703c052f9a51b66342eea89b", - "sha256:4b098e4bb1174096a93f48f6193e7d9aa7071506a5877da09a783509ca5fff42", - "sha256:4d9ebac23d2de960726ce45f49d70eb5466725c0087a078866043dad115f850f", - "sha256:50d4613025f15f4b11f1c54bbed4761c0020f7f921b95143ad6d58c151198142", - "sha256:5230a99e724a1bdbbf236a1b58d6e8504b912b0552721c7c6b8570925ee0ccde", - "sha256:54465401dbbec9a6a42cf737627fb0f014d50dc7365a6b6cd57753f151a86ff0", - "sha256:550059885dc9c19a072ca6d6735739d879be3b5959ec218ba3e013fd2255a11b", - "sha256:557be7fbf2bfa4a2ec65192c254e151684545ebab45eca5d50477d562c40f986", - "sha256:5b65be160adcd9de7a7e6413a4966665756e263f0d5ddeffde277ffeee0576a5", - "sha256:64eba6f168803a7469866a9c9b5263a7463fa8b7a25b35e547492aa7322036b6", - "sha256:72ad589ba5e4a87e1d404cc1cb1b5780bfcb16e2aec957b88ce15fe879cc08ca", - "sha256:7d0c1044bce274ec6711f0770fd2d5544fe392591d204c68328e60a46f88843b", - "sha256:7e5eefc58d20e4c2da82c78d91b2906f1a947ef42bd668db05f4ab4201a99f49", - "sha256:850fec36c48df5a790aa735417dca8ce7d4b48d59b3ebd6f83e88a8125cde324", - "sha256:85b392aba273566c3d5596a0a490978c085b79700814fb22bfd537d381dd230c", - "sha256:8c2a56b6aad7cc8f5551d8e04ff5a319d203f9d870398b94702300de50190f63", - "sha256:8f470c79061599a126d74385623ff4744c4e0f4a0997a353a44923c0b561ee51", - "sha256:8ffce9d81c825ac1deaa13bc9694c0562e2840a48ba21cfc9f3b4c922c16f372", - "sha256:9423a2de923820c7e82e18980b937893f4aa8251c43684fa1772e341f6e06887", - "sha256:9b571b281a19762adb3f48a7731f6842f920fa71108aff9be49888320ac3e24d", - "sha256:a04fe458a4597aa559b79c7f48fe3dceabef0f69f562daf5c5e926b153817281", - "sha256:aa47ffcf70ba6f7848349b8a6f9b481ee0f7637931d91a9860a1838bfc586901", - "sha256:bede7ee075e54b9a5bde695b4fc8f569f30185891796b2e4e09e2226801d09bd", - "sha256:c1d2357f791b12d86faced7b5736dea9ef4f5ecdc6c3f253e445ee82da579449", - "sha256:c6eeefd4435055a8ebb6c5cc36111b8591c192c56a95b45fe2af22d9881eee25", - "sha256:ca1b7becf7d9d3ccdbb2f038f665c0f4857e08e1d8481cbcc1a86a0afcfb62b2", - "sha256:e67d4f8734f8054d2c4858570cc4b233bf753f56e85217de4dfb2495904cf02e", - "sha256:e8a34e4c0ab7b1ca17b8763613783e2458e77938092c18ac919420ab8655c8c1", - "sha256:e90491a4d77d0cb82e0e7a9cb35d86284c677402e4ce7ba6b448ccc7325c5421", - "sha256:ef1616b3ba965cd68e6f759eeb5d34fbf596a79e84215eeceebf34ba3f61fdc7", - "sha256:f222e1e9d3f13b68ff8a835574eda02e67277d51631d69d7cf7f8e07df678c86", - "sha256:f5e3088f4ed33947e16fd865b8200f9cfae1144f41b64a8cf19b599508e096bc", - "sha256:f659d7a48401158c59933904040085c200b4be631cb5f23a7d561fbae593ec1f", - "sha256:fe9c766a0c35b7e3d6b6939393c8dfdd5da3ac5dec7f971ec9134f284c6c36d6" - ], - "version": "==0.5.0" + "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563", + "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142", + "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d", + "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b", + "sha256:3c3b214ce057c54675b00108ac42bacf2ab8f85c58e3f324a4e963bbc46424f4", + "sha256:3e802e0b2378ade99cd666b5bffb8b2a7cc8f3d28988685dc300469ea8dd86cb", + "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658", + "sha256:405784577ba6540fa7d6ff49e37daf104e04f4b4ff2d1ac0469eaa6a20fde084", + "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2", + "sha256:4bd3e488b447046e386a30f07af05f9b38d3d368d1f7b4d8f7e10af85393db97", + "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837", + "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3", + "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58", + "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da", + "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d", + "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90", + "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0", + "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1", + "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2", + "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e", + "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0", + "sha256:8ae5b97f690badd2ca27cbf668494ee1b6d34cf1c464271ef7bfa9ca6b83ffaf", + "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc", + "sha256:8e216a038d2d52ea13fdd9b9c9c7459fb80d78302b257828285eca1c773b99b3", + "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503", + "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a", + "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3", + "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949", + "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84", + "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb", + "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a", + "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f", + "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e", + "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81", + "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185", + "sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3" + ], + "version": "==0.6.1" + }, + "httpx": { + "hashes": [ + "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf", + "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd" + ], + "index": "pypi", + "version": "==0.26.0" }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "inflect": { "hashes": [ @@ -522,6 +542,7 @@ "sha256:36532f77cc800594e8f16641edae7f1baf7932f05d8e508545b95fc53c6dc85b", "sha256:906714829fedbc89955d52806c903f2332e3948ed94e31e85037f9e0226b8376" ], + "markers": "python_version < '4.0' and python_full_version >= '3.6.2'", "version": "==0.1.16" }, "isodate": { @@ -533,19 +554,19 @@ }, "isort": { "hashes": [ - "sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6", - "sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b" + "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109", + "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" ], "index": "pypi", - "version": "==5.11.4" + "version": "==5.13.2" }, "jinja2": { "hashes": [ - "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", - "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], "markers": "python_version >= '3.7'", - "version": "==3.1.2" + "version": "==3.1.3" }, "jsonschema": { "hashes": [ @@ -556,101 +577,112 @@ }, "lazy-object-proxy": { "hashes": [ - "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382", - "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82", - "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9", - "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494", - "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46", - "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30", - "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63", - "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4", - "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae", - "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be", - "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701", - "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd", - "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006", - "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a", - "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586", - "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8", - "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821", - "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07", - "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b", - "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171", - "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b", - "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2", - "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7", - "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4", - "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8", - "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e", - "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f", - "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda", - "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4", - "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e", - "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671", - "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11", - "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455", - "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734", - "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb", - "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59" - ], - "markers": "python_version >= '3.7'", - "version": "==1.9.0" + "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56", + "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4", + "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8", + "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282", + "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757", + "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424", + "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b", + "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255", + "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70", + "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94", + "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074", + "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c", + "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee", + "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9", + "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9", + "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69", + "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f", + "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3", + "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9", + "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d", + "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977", + "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b", + "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43", + "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658", + "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a", + "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd", + "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83", + "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4", + "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696", + "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05", + "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3", + "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6", + "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895", + "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4", + "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba", + "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03", + "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c" + ], + "markers": "python_version >= '3.8'", + "version": "==1.10.0" }, "markupsafe": { "hashes": [ - "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed", - "sha256:085fd3201e7b12809f9e6e9bc1e5c96a368c8523fad5afb02afe3c051ae4afcc", - "sha256:090376d812fb6ac5f171e5938e82e7f2d7adc2b629101cec0db8b267815c85e2", - "sha256:0b462104ba25f1ac006fdab8b6a01ebbfbce9ed37fd37fd4acd70c67c973e460", - "sha256:137678c63c977754abe9086a3ec011e8fd985ab90631145dfb9294ad09c102a7", - "sha256:1bea30e9bf331f3fef67e0a3877b2288593c98a21ccb2cf29b74c581a4eb3af0", - "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1", - "sha256:22731d79ed2eb25059ae3df1dfc9cb1546691cc41f4e3130fe6bfbc3ecbbecfa", - "sha256:2298c859cfc5463f1b64bd55cb3e602528db6fa0f3cfd568d3605c50678f8f03", - "sha256:28057e985dace2f478e042eaa15606c7efccb700797660629da387eb289b9323", - "sha256:2e7821bffe00aa6bd07a23913b7f4e01328c3d5cc0b40b36c0bd81d362faeb65", - "sha256:2ec4f2d48ae59bbb9d1f9d7efb9236ab81429a764dedca114f5fdabbc3788013", - "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036", - "sha256:40627dcf047dadb22cd25ea7ecfe9cbf3bbbad0482ee5920b582f3809c97654f", - "sha256:40dfd3fefbef579ee058f139733ac336312663c6706d1163b82b3003fb1925c4", - "sha256:4cf06cdc1dda95223e9d2d3c58d3b178aa5dacb35ee7e3bbac10e4e1faacb419", - "sha256:50c42830a633fa0cf9e7d27664637532791bfc31c731a87b202d2d8ac40c3ea2", - "sha256:55f44b440d491028addb3b88f72207d71eeebfb7b5dbf0643f7c023ae1fba619", - "sha256:608e7073dfa9e38a85d38474c082d4281f4ce276ac0010224eaba11e929dd53a", - "sha256:63ba06c9941e46fa389d389644e2d8225e0e3e5ebcc4ff1ea8506dce646f8c8a", - "sha256:65608c35bfb8a76763f37036547f7adfd09270fbdbf96608be2bead319728fcd", - "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7", - "sha256:6d6607f98fcf17e534162f0709aaad3ab7a96032723d8ac8750ffe17ae5a0666", - "sha256:7313ce6a199651c4ed9d7e4cfb4aa56fe923b1adf9af3b420ee14e6d9a73df65", - "sha256:7668b52e102d0ed87cb082380a7e2e1e78737ddecdde129acadb0eccc5423859", - "sha256:7df70907e00c970c60b9ef2938d894a9381f38e6b9db73c5be35e59d92e06625", - "sha256:7e007132af78ea9df29495dbf7b5824cb71648d7133cf7848a2a5dd00d36f9ff", - "sha256:835fb5e38fd89328e9c81067fd642b3593c33e1e17e2fdbf77f5676abb14a156", - "sha256:8bca7e26c1dd751236cfb0c6c72d4ad61d986e9a41bbf76cb445f69488b2a2bd", - "sha256:8db032bf0ce9022a8e41a22598eefc802314e81b879ae093f36ce9ddf39ab1ba", - "sha256:99625a92da8229df6d44335e6fcc558a5037dd0a760e11d84be2260e6f37002f", - "sha256:9cad97ab29dfc3f0249b483412c85c8ef4766d96cdf9dcf5a1e3caa3f3661cf1", - "sha256:a4abaec6ca3ad8660690236d11bfe28dfd707778e2442b45addd2f086d6ef094", - "sha256:a6e40afa7f45939ca356f348c8e23048e02cb109ced1eb8420961b2f40fb373a", - "sha256:a6f2fcca746e8d5910e18782f976489939d54a91f9411c32051b4aab2bd7c513", - "sha256:a806db027852538d2ad7555b203300173dd1b77ba116de92da9afbc3a3be3eed", - "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d", - "sha256:b8526c6d437855442cdd3d87eede9c425c4445ea011ca38d937db299382e6fa3", - "sha256:bb06feb762bade6bf3c8b844462274db0c76acc95c52abe8dbed28ae3d44a147", - "sha256:c0a33bc9f02c2b17c3ea382f91b4db0e6cde90b63b296422a939886a7a80de1c", - "sha256:c4a549890a45f57f1ebf99c067a4ad0cb423a05544accaf2b065246827ed9603", - "sha256:ca244fa73f50a800cf8c3ebf7fd93149ec37f5cb9596aa8873ae2c1d23498601", - "sha256:cf877ab4ed6e302ec1d04952ca358b381a882fbd9d1b07cccbfd61783561f98a", - "sha256:d9d971ec1e79906046aa3ca266de79eac42f1dbf3612a05dc9368125952bd1a1", - "sha256:da25303d91526aac3672ee6d49a2f3db2d9502a4a60b55519feb1a4c7714e07d", - "sha256:e55e40ff0cc8cc5c07996915ad367fa47da6b3fc091fdadca7f5403239c5fec3", - "sha256:f03a532d7dee1bed20bc4884194a16160a2de9ffc6354b3878ec9682bb623c54", - "sha256:f1cd098434e83e656abf198f103a8207a8187c0fc110306691a2e94a78d0abb2", - "sha256:f2bfb563d0211ce16b63c7cb9395d2c682a23187f54c3d79bfec33e6705473c6", - "sha256:f8ffb705ffcf5ddd0e80b65ddf7bed7ee4f5a441ea7d3419e861a12eaf41af58" + "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69", + "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0", + "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d", + "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec", + "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5", + "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411", + "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3", + "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74", + "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0", + "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949", + "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d", + "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279", + "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f", + "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6", + "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc", + "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e", + "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954", + "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656", + "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc", + "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518", + "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56", + "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc", + "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa", + "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565", + "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4", + "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb", + "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250", + "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4", + "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959", + "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc", + "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474", + "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863", + "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8", + "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f", + "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2", + "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e", + "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e", + "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb", + "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f", + "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a", + "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26", + "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d", + "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2", + "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131", + "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789", + "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6", + "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a", + "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858", + "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e", + "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb", + "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e", + "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84", + "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7", + "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea", + "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b", + "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6", + "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475", + "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74", + "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a", + "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00" ], "markers": "python_version >= '3.7'", - "version": "==2.1.2" + "version": "==2.1.4" }, "mccabe": { "hashes": [ @@ -661,10 +693,11 @@ }, "mypy-extensions": { "hashes": [ - "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", - "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" ], - "version": "==0.4.3" + "markers": "python_version >= '3.5'", + "version": "==1.0.0" }, "openapi-schema-validator": { "hashes": [ @@ -693,19 +726,19 @@ }, "pathspec": { "hashes": [ - "sha256:3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6", - "sha256:56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], - "markers": "python_version >= '3.7'", - "version": "==0.10.3" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "platformdirs": { "hashes": [ - "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490", - "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2" + "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", + "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" ], - "markers": "python_version >= '3.7'", - "version": "==2.6.2" + "markers": "python_version >= '3.8'", + "version": "==4.1.0" }, "prance": { "hashes": [ @@ -724,56 +757,56 @@ }, "pydantic": { "hashes": [ - "sha256:05a81b006be15655b2a1bae5faa4280cf7c81d0e09fcb49b342ebf826abe5a72", - "sha256:0b53e1d41e97063d51a02821b80538053ee4608b9a181c1005441f1673c55423", - "sha256:2b3ce5f16deb45c472dde1a0ee05619298c864a20cded09c4edd820e1454129f", - "sha256:2e82a6d37a95e0b1b42b82ab340ada3963aea1317fd7f888bb6b9dfbf4fff57c", - "sha256:301d626a59edbe5dfb48fcae245896379a450d04baeed50ef40d8199f2733b06", - "sha256:39f4a73e5342b25c2959529f07f026ef58147249f9b7431e1ba8414a36761f53", - "sha256:4948f264678c703f3877d1c8877c4e3b2e12e549c57795107f08cf70c6ec7774", - "sha256:4b05697738e7d2040696b0a66d9f0a10bec0efa1883ca75ee9e55baf511909d6", - "sha256:51bdeb10d2db0f288e71d49c9cefa609bca271720ecd0c58009bd7504a0c464c", - "sha256:55b1625899acd33229c4352ce0ae54038529b412bd51c4915349b49ca575258f", - "sha256:572066051eeac73d23f95ba9a71349c42a3e05999d0ee1572b7860235b850cc6", - "sha256:6a05a9db1ef5be0fe63e988f9617ca2551013f55000289c671f71ec16f4985e3", - "sha256:6dc1cc241440ed7ca9ab59d9929075445da6b7c94ced281b3dd4cfe6c8cff817", - "sha256:6e7124d6855b2780611d9f5e1e145e86667eaa3bd9459192c8dc1a097f5e9903", - "sha256:75d52162fe6b2b55964fbb0af2ee58e99791a3138588c482572bb6087953113a", - "sha256:78cec42b95dbb500a1f7120bdf95c401f6abb616bbe8785ef09887306792e66e", - "sha256:7feb6a2d401f4d6863050f58325b8d99c1e56f4512d98b11ac64ad1751dc647d", - "sha256:8775d4ef5e7299a2f4699501077a0defdaac5b6c4321173bcb0f3c496fbadf85", - "sha256:887ca463c3bc47103c123bc06919c86720e80e1214aab79e9b779cda0ff92a00", - "sha256:9193d4f4ee8feca58bc56c8306bcb820f5c7905fd919e0750acdeeeef0615b28", - "sha256:983e720704431a6573d626b00662eb78a07148c9115129f9b4351091ec95ecc3", - "sha256:990406d226dea0e8f25f643b370224771878142155b879784ce89f633541a024", - "sha256:9cbdc268a62d9a98c56e2452d6c41c0263d64a2009aac69246486f01b4f594c4", - "sha256:a48f1953c4a1d9bd0b5167ac50da9a79f6072c63c4cef4cf2a3736994903583e", - "sha256:a9a6747cac06c2beb466064dda999a13176b23535e4c496c9d48e6406f92d42d", - "sha256:a9f2de23bec87ff306aef658384b02aa7c32389766af3c5dee9ce33e80222dfa", - "sha256:b5635de53e6686fe7a44b5cf25fcc419a0d5e5c1a1efe73d49d48fe7586db854", - "sha256:b6f9d649892a6f54a39ed56b8dfd5e08b5f3be5f893da430bed76975f3735d15", - "sha256:b9a3859f24eb4e097502a3be1fb4b2abb79b6103dd9e2e0edb70613a4459a648", - "sha256:cd8702c5142afda03dc2b1ee6bc358b62b3735b2cce53fc77b31ca9f728e4bc8", - "sha256:d7b5a3821225f5c43496c324b0d6875fde910a1c2933d726a743ce328fbb2a8c", - "sha256:d88c4c0e5c5dfd05092a4b271282ef0588e5f4aaf345778056fc5259ba098857", - "sha256:eb992a1ef739cc7b543576337bebfc62c0e6567434e522e97291b251a41dad7f", - "sha256:f2f7eb6273dd12472d7f218e1fef6f7c7c2f00ac2e1ecde4db8824c457300416", - "sha256:fdf88ab63c3ee282c76d652fc86518aacb737ff35796023fae56a65ced1a5978", - "sha256:fdf8d759ef326962b4678d89e275ffc55b7ce59d917d9f72233762061fd04a2d" + "sha256:08b6ec0917c30861e3fe71a93be1648a2aa4f62f866142ba21670b24444d7fd8", + "sha256:0fbb503bbbbab0c588ed3cd21975a1d0d4163b87e360fec17a792f7d8c4ff29f", + "sha256:1245f4f61f467cb3dfeced2b119afef3db386aec3d24a22a1de08c65038b255f", + "sha256:13e86a19dca96373dcf3190fcb8797d40a6f12f154a244a8d1e8e03b8f280593", + "sha256:21efacc678a11114c765eb52ec0db62edffa89e9a562a94cbf8fa10b5db5c046", + "sha256:23d47a4b57a38e8652bcab15a658fdb13c785b9ce217cc3a729504ab4e1d6bc9", + "sha256:24a7679fab2e0eeedb5a8924fc4a694b3bcaac7d305aeeac72dd7d4e05ecbebf", + "sha256:282613a5969c47c83a8710cc8bfd1e70c9223feb76566f74683af889faadc0ea", + "sha256:336709883c15c050b9c55a63d6c7ff09be883dbc17805d2b063395dd9d9d0022", + "sha256:412ab4a3f6dbd2bf18aefa9f79c7cca23744846b31f1d6555c2ee2b05a2e14ca", + "sha256:466669501d08ad8eb3c4fecd991c5e793c4e0bbd62299d05111d4f827cded64f", + "sha256:46f17b832fe27de7850896f3afee50ea682220dd218f7e9c88d436788419dca6", + "sha256:49a46a0994dd551ec051986806122767cf144b9702e31d47f6d493c336462597", + "sha256:4ae57b4d8e3312d486e2498d42aed3ece7b51848336964e43abbf9671584e67f", + "sha256:53e3819bd20a42470d6dd0fe7fc1c121c92247bca104ce608e609b59bc7a77ee", + "sha256:596f12a1085e38dbda5cbb874d0973303e34227b400b6414782bf205cc14940c", + "sha256:646b2b12df4295b4c3148850c85bff29ef6d0d9621a8d091e98094871a62e5c7", + "sha256:798a3d05ee3b71967844a1164fd5bdb8c22c6d674f26274e78b9f29d81770c4e", + "sha256:7f4fcec873f90537c382840f330b90f4715eebc2bc9925f04cb92de593eae054", + "sha256:82d886bd3c3fbeaa963692ef6b643159ccb4b4cefaf7ff1617720cbead04fd1d", + "sha256:8e3a76f571970fcd3c43ad982daf936ae39b3e90b8a2e96c04113a369869dc87", + "sha256:8ee853cd12ac2ddbf0ecbac1c289f95882b2d4482258048079d13be700aa114c", + "sha256:9d578ac4bf7fdf10ce14caba6f734c178379bd35c486c6deb6f49006e1ba78a7", + "sha256:a42c7d17706911199798d4c464b352e640cab4351efe69c2267823d619a937e5", + "sha256:aad4e10efa5474ed1a611b6d7f0d130f4aafadceb73c11d9e72823e8f508e663", + "sha256:ad8c2bc677ae5f6dbd3cf92f2c7dc613507eafe8f71719727cbc0a7dec9a8c01", + "sha256:bc3ed06ab13660b565eed80887fcfbc0070f0aa0691fbb351657041d3e874efe", + "sha256:bfb113860e9288d0886e3b9e49d9cf4a9d48b441f52ded7d96db7819028514cc", + "sha256:c37c28449752bb1f47975d22ef2882d70513c546f8f37201e0fec3a97b816eee", + "sha256:c66609e138c31cba607d8e2a7b6a5dc38979a06c900815495b2d90ce6ded35b4", + "sha256:d604be0f0b44d473e54fdcb12302495fe0467c56509a2f80483476f3ba92b33c", + "sha256:d986e115e0b39604b9eee3507987368ff8148222da213cd38c359f6f57b3b347", + "sha256:dba49d52500c35cfec0b28aa8b3ea5c37c9df183ffc7210b10ff2a415c125c4a", + "sha256:e897c9f35281f7889873a3e6d6b69aa1447ceb024e8495a5f0d02ecd17742a7f", + "sha256:f9f674b5c3bebc2eba401de64f29948ae1e646ba2735f884d1594c5f675d6f2a", + "sha256:fa7790e94c60f809c95602a26d906eba01a0abee9cc24150e4ce2189352deb1b" ], "markers": "python_version >= '3.7'", - "version": "==1.10.4" + "version": "==1.10.14" }, "pyjwt": { "extras": [ "crypto" ], "hashes": [ - "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd", - "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14" + "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", + "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" ], "markers": "python_version >= '3.7'", - "version": "==2.6.0" + "version": "==2.8.0" }, "pylint": { "hashes": [ @@ -785,11 +818,11 @@ }, "pyparsing": { "hashes": [ - "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", - "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" + "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", + "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db" ], "markers": "python_full_version >= '3.6.8'", - "version": "==3.0.9" + "version": "==3.1.1" }, "pypika-tortoise": { "hashes": [ @@ -808,93 +841,112 @@ }, "pysnooper": { "hashes": [ - "sha256:378f13d731a3e04d3d0350e5f295bdd0f1b49fc8a8b8bf2067fe1e5290bd20be", - "sha256:d17dc91cca1593c10230dce45e46b1d3ff0f8910f0c38e941edf6ba1260b3820" + "sha256:810669e162a250a066d8662e573adbc5af770e937c5b5578f28bb7355d1c859b", + "sha256:aa859aa9a746cffc1f35e4ee469d49c3cc5185b5fc0c571feb3af3c94d2eb625" ], - "version": "==1.1.1" + "version": "==1.2.0" }, "python-dotenv": { "hashes": [ - "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5", - "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045" + "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", + "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" ], - "version": "==0.21.0" + "version": "==1.0.1" }, "python-engineio": { "hashes": [ - "sha256:7454314a529bba20e745928601ffeaf101c1b5aca9a6c4e48ad397803d10ea0c", - "sha256:d8d8b072799c36cadcdcc2b40d2a560ce09797ab3d2d596b2ad519a5e4df19ae" + "sha256:a357f0aba275c311b66f22181472ed5b174bbc541742eea1d16feae2fa1afabd", + "sha256:f8609e3afdda318fdc336b4ba2de8dd397bb8f9b8a1b43e56c27330e32c2e34c" ], "markers": "python_version >= '3.6'", - "version": "==4.3.4" + "version": "==4.8.2" }, "python-socketio": { "hashes": [ - "sha256:92395062d9db3c13d30e7cdedaa0e1330bba78505645db695415f9a3c628d097", - "sha256:d9a9f047e6fdd306c852fbac36516f4b495c2096f8ad9ceb8803b8e5ff5622e3" + "sha256:b03186e04b942088781f6286c13604a853e5e35ed59158c51ff7af22fa032e6f", + "sha256:cfcb0163d77c8d23b98285754e79016786740dd901268654a52823da0bc73382" ], "markers": "python_version >= '3.6'", - "version": "==5.7.2" + "version": "==5.11.0" }, "pytz": { "hashes": [ - "sha256:01a0681c4b9684a28304615eba55d1ab31ae00bf68ec157ec3708a8182dbbcd0", - "sha256:78f4f37d8198e0627c5f1143240bb0206b8691d8d7ac6d78fee88b78733f8c4a" + "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", + "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" ], - "version": "==2022.7.1" + "version": "==2023.3.post1" }, "pyyaml": { "hashes": [ - "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf", - "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293", - "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b", - "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57", - "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b", - "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4", - "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07", - "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba", - "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9", - "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287", - "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513", - "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0", - "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782", - "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0", - "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92", - "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f", - "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2", - "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc", - "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1", - "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c", - "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86", - "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4", - "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c", - "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34", - "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b", - "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d", - "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c", - "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb", - "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7", - "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737", - "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3", - "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d", - "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358", - "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53", - "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78", - "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803", - "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a", - "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f", - "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174", - "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5" - ], - "version": "==6.0" + "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", + "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", + "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", + "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", + "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", + "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", + "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", + "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", + "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", + "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", + "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", + "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", + "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", + "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", + "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", + "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", + "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", + "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", + "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", + "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", + "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", + "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", + "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", + "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", + "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", + "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", + "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", + "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", + "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", + "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", + "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", + "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", + "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", + "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", + "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", + "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", + "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", + "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", + "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", + "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", + "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", + "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", + "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", + "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", + "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", + "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + ], + "version": "==6.0.1" + }, + "reactivex": { + "hashes": [ + "sha256:0004796c420bd9e68aad8e65627d85a8e13f293de76656165dffbcb3a0e3fb6a", + "sha256:e912e6591022ab9176df8348a653fe8c8fa7a301f26f9931c9d8c78a650e04e8" + ], + "markers": "python_version >= '3.7' and python_version < '4.0'", + "version": "==4.0.4" }, "requests": { "hashes": [ - "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", - "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf" + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], "index": "pypi", - "version": "==2.28.2" + "version": "==2.31.0" }, "ros-translator": { "editable": true, @@ -902,59 +954,67 @@ }, "ruamel.yaml": { "hashes": [ - "sha256:742b35d3d665023981bd6d16b3d24248ce5df75fdb4e2924e93a05c1f8b61ca7", - "sha256:8b7ce697a2f212752a35c1ac414471dc16c424c9573be4926b56ff3f5d23b7af" + "sha256:6024b986f06765d482b5b07e086cc4b4cd05dd22ddcbc758fa23d54873cf313d", + "sha256:b16b6c3816dff0a93dca12acf5e70afd089fa5acb80604afd1ffa8b465b7722c" ], "markers": "python_version >= '3'", - "version": "==0.17.21" + "version": "==0.17.40" }, "ruamel.yaml.clib": { "hashes": [ - "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e", - "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3", - "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5", - "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497", - "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f", - "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac", - "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697", - "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763", - "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282", - "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94", - "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1", - "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072", - "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9", - "sha256:721bc4ba4525f53f6a611ec0967bdcee61b31df5a56801281027a3a6d1c2daf5", - "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231", - "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93", - "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b", - "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb", - "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f", - "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307", - "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8", - "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b", - "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b", - "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640", - "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7", - "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a", - "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71", - "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8", - "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7", - "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80", - "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e", - "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab", - "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0", - "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646" - ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.11'", - "version": "==0.2.7" - }, - "rx": { - "hashes": [ - "sha256:922c5f4edb3aa1beaa47bf61d65d5380011ff6adcd527f26377d05cb73ed8ec8", - "sha256:b657ca2b45aa485da2f7dcfd09fac2e554f7ac51ff3c2f8f2ff962ecd963d91c" - ], - "markers": "python_full_version >= '3.6.0'", - "version": "==3.2.0" + "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", + "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", + "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", + "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", + "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", + "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", + "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", + "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", + "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", + "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", + "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", + "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", + "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", + "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", + "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", + "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", + "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", + "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", + "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", + "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", + "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", + "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", + "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", + "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", + "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", + "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", + "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", + "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", + "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", + "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", + "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", + "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", + "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", + "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", + "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", + "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", + "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", + "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", + "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", + "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", + "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", + "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", + "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", + "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", + "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", + "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", + "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", + "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", + "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", + "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" + ], + "markers": "python_version < '3.13' and platform_python_implementation == 'CPython'", + "version": "==0.2.8" }, "schedule": { "hashes": [ @@ -974,18 +1034,26 @@ }, "setuptools": { "hashes": [ - "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54", - "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], - "markers": "python_version >= '3.7'", - "version": "==65.6.3" + "markers": "python_version >= '3.8'", + "version": "==69.0.3" + }, + "simple-websocket": { + "hashes": [ + "sha256:17d2c72f4a2bd85174a97e3e4c88b01c40c3f81b7b648b0cc3ce1305968928c8", + "sha256:1d5bf585e415eaa2083e2bcf02a3ecf91f9712e7b3e6b9fa0b461ad04e0837bc" + ], + "markers": "python_version >= '3.6'", + "version": "==1.0.0" }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "sniffio": { @@ -998,18 +1066,18 @@ }, "starlette": { "hashes": [ - "sha256:5a60c5c2d051f3a8eb546136aa0c9399773a689595e099e0877704d5888279bf", - "sha256:c6d21096774ecb9639acad41b86b7706e52ba3bf1dc13ea4ed9ad593d47e24c7" + "sha256:3e2639dac3520e4f58734ed22553f950d3f3cb1001cd2eaac4d57e8cdc5f66bc", + "sha256:50bbbda9baa098e361f398fda0928062abbaf1f54f4fadcbe17c092a01eb9a25" ], - "markers": "python_version >= '3.6'", - "version": "==0.19.1" + "markers": "python_version >= '3.8'", + "version": "==0.35.1" }, "toml": { "hashes": [ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" }, "tomli": { @@ -1030,49 +1098,66 @@ }, "typed-ast": { "hashes": [ - "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2", - "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1", - "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6", - "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62", - "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac", - "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d", - "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc", - "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2", - "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97", - "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35", - "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6", - "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1", - "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4", - "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c", - "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e", - "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec", - "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f", - "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72", - "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47", - "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72", - "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe", - "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6", - "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3", - "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66" + "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10", + "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede", + "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e", + "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c", + "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d", + "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8", + "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e", + "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5", + "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155", + "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4", + "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba", + "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5", + "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a", + "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b", + "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311", + "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769", + "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686", + "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d", + "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2", + "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814", + "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9", + "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b", + "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b", + "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4", + "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd", + "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18", + "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa", + "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6", + "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee", + "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88", + "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4", + "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431", + "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04", + "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d", + "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02", + "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8", + "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437", + "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274", + "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f", + "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a", + "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2" ], "markers": "python_full_version >= '3.9.8'", - "version": "==1.5.4" + "version": "==1.5.5" }, "typing-extensions": { "hashes": [ - "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", - "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], - "markers": "python_version >= '3.7'", - "version": "==4.4.0" + "markers": "python_version >= '3.8'", + "version": "==4.9.0" }, "urllib3": { "hashes": [ - "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", - "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1" + "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", + "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.14" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" }, "uvicorn": { "extras": [ @@ -1087,61 +1172,119 @@ }, "uvloop": { "hashes": [ - "sha256:0949caf774b9fcefc7c5756bacbbbd3fc4c05a6b7eebc7c7ad6f825b23998d6d", - "sha256:0ddf6baf9cf11a1a22c71487f39f15b2cf78eb5bde7e5b45fbb99e8a9d91b9e1", - "sha256:1436c8673c1563422213ac6907789ecb2b070f5939b9cbff9ef7113f2b531595", - "sha256:23609ca361a7fc587031429fa25ad2ed7242941adec948f9d10c045bfecab06b", - "sha256:2a6149e1defac0faf505406259561bc14b034cdf1d4711a3ddcdfbaa8d825a05", - "sha256:2deae0b0fb00a6af41fe60a675cec079615b01d68beb4cc7b722424406b126a8", - "sha256:307958f9fc5c8bb01fad752d1345168c0abc5d62c1b72a4a8c6c06f042b45b20", - "sha256:30babd84706115626ea78ea5dbc7dd8d0d01a2e9f9b306d24ca4ed5796c66ded", - "sha256:3378eb62c63bf336ae2070599e49089005771cc651c8769aaad72d1bd9385a7c", - "sha256:3d97672dc709fa4447ab83276f344a165075fd9f366a97b712bdd3fee05efae8", - "sha256:3db8de10ed684995a7f34a001f15b374c230f7655ae840964d51496e2f8a8474", - "sha256:3ebeeec6a6641d0adb2ea71dcfb76017602ee2bfd8213e3fcc18d8f699c5104f", - "sha256:45cea33b208971e87a31c17622e4b440cac231766ec11e5d22c76fab3bf9df62", - "sha256:6708f30db9117f115eadc4f125c2a10c1a50d711461699a0cbfaa45b9a78e376", - "sha256:68532f4349fd3900b839f588972b3392ee56042e440dd5873dfbbcd2cc67617c", - "sha256:6aafa5a78b9e62493539456f8b646f85abc7093dd997f4976bb105537cf2635e", - "sha256:7d37dccc7ae63e61f7b96ee2e19c40f153ba6ce730d8ba4d3b4e9738c1dccc1b", - "sha256:864e1197139d651a76c81757db5eb199db8866e13acb0dfe96e6fc5d1cf45fc4", - "sha256:8887d675a64cfc59f4ecd34382e5b4f0ef4ae1da37ed665adba0c2badf0d6578", - "sha256:8efcadc5a0003d3a6e887ccc1fb44dec25594f117a94e3127954c05cf144d811", - "sha256:9b09e0f0ac29eee0451d71798878eae5a4e6a91aa275e114037b27f7db72702d", - "sha256:a4aee22ece20958888eedbad20e4dbb03c37533e010fb824161b4f05e641f738", - "sha256:a5abddb3558d3f0a78949c750644a67be31e47936042d4f6c888dd6f3c95f4aa", - "sha256:c092a2c1e736086d59ac8e41f9c98f26bbf9b9222a76f21af9dfe949b99b2eb9", - "sha256:c686a47d57ca910a2572fddfe9912819880b8765e2f01dc0dd12a9bf8573e539", - "sha256:cbbe908fda687e39afd6ea2a2f14c2c3e43f2ca88e3a11964b297822358d0e6c", - "sha256:ce9f61938d7155f79d3cb2ffa663147d4a76d16e08f65e2c66b77bd41b356718", - "sha256:dbbaf9da2ee98ee2531e0c780455f2841e4675ff580ecf93fe5c48fe733b5667", - "sha256:f1e507c9ee39c61bfddd79714e4f85900656db1aec4d40c6de55648e85c2799c", - "sha256:ff3d00b70ce95adce264462c930fbaecb29718ba6563db354608f37e49e09024" - ], - "version": "==0.17.0" + "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd", + "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec", + "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b", + "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc", + "sha256:271718e26b3e17906b28b67314c45d19106112067205119dddbd834c2b7ce797", + "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5", + "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2", + "sha256:34175c9fd2a4bc3adc1380e1261f60306344e3407c20a4d684fd5f3be010fa3d", + "sha256:45bf4c24c19fb8a50902ae37c5de50da81de4922af65baf760f7c0c42e1088be", + "sha256:472d61143059c84947aa8bb74eabbace30d577a03a1805b77933d6bd13ddebbd", + "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12", + "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17", + "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef", + "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24", + "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428", + "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1", + "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849", + "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593", + "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd", + "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67", + "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6", + "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3", + "sha256:78ab247f0b5671cc887c31d33f9b3abfb88d2614b84e4303f1a63b46c046c8bd", + "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8", + "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7", + "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533", + "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957", + "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650", + "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e", + "sha256:e27f100e1ff17f6feeb1f33968bc185bf8ce41ca557deee9d9bbbffeb72030b7", + "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256" + ], + "version": "==0.19.0" }, "watchfiles": { "hashes": [ - "sha256:00ea0081eca5e8e695cffbc3a726bb90da77f4e3f78ce29b86f0d95db4e70ef7", - "sha256:0f9a22fff1745e2bb930b1e971c4c5b67ea3b38ae17a6adb9019371f80961219", - "sha256:1b8e6db99e49cd7125d8a4c9d33c0735eea7b75a942c6ad68b75be3e91c242fb", - "sha256:4ec0134a5e31797eb3c6c624dbe9354f2a8ee9c720e0b46fc5b7bab472b7c6d4", - "sha256:548d6b42303d40264118178053c78820533b683b20dfbb254a8706ca48467357", - "sha256:6e0d8fdfebc50ac7569358f5c75f2b98bb473befccf9498cf23b3e39993bb45a", - "sha256:7102342d60207fa635e24c02a51c6628bf0472e5fef067f78a612386840407fc", - "sha256:888db233e06907c555eccd10da99b9cd5ed45deca47e41766954292dc9f7b198", - "sha256:9891d3c94272108bcecf5597a592e61105279def1313521e637f2d5acbe08bc9", - "sha256:9a26272ef3e930330fc0c2c148cc29706cc2c40d25760c7ccea8d768a8feef8b", - "sha256:9fb12a5e2b42e0b53769455ff93546e6bc9ab14007fbd436978d827a95ca5bd1", - "sha256:a868ce2c7565137f852bd4c863a164dc81306cae7378dbdbe4e2aca51ddb8857", - "sha256:b02e7fa03cd4059dd61ff0600080a5a9e7a893a85cb8e5178943533656eec65e", - "sha256:bc7c726855f04f22ac79131b51bf0c9f728cb2117419ed830a43828b2c4a5fcb", - "sha256:c541e0f2c3e95e83e4f84561c893284ba984e9d0025352057396d96dceb09f44", - "sha256:cbaff354d12235002e62d9d3fa8bcf326a8490c1179aa5c17195a300a9e5952f", - "sha256:dde79930d1b28f15994ad6613aa2865fc7a403d2bb14585a8714a53233b15717", - "sha256:e2b2bdd26bf8d6ed90763e6020b475f7634f919dbd1730ea1b6f8cb88e21de5d" + "sha256:02b73130687bc3f6bb79d8a170959042eb56eb3a42df3671c79b428cd73f17cc", + "sha256:02d91cbac553a3ad141db016e3350b03184deaafeba09b9d6439826ee594b365", + "sha256:06247538e8253975bdb328e7683f8515ff5ff041f43be6c40bff62d989b7d0b0", + "sha256:08dca260e85ffae975448e344834d765983237ad6dc308231aa16e7933db763e", + "sha256:0d9ac347653ebd95839a7c607608703b20bc07e577e870d824fa4801bc1cb124", + "sha256:0dd5fad9b9c0dd89904bbdea978ce89a2b692a7ee8a0ce19b940e538c88a809c", + "sha256:11cd0c3100e2233e9c53106265da31d574355c288e15259c0d40a4405cbae317", + "sha256:18722b50783b5e30a18a8a5db3006bab146d2b705c92eb9a94f78c72beb94094", + "sha256:18d5b4da8cf3e41895b34e8c37d13c9ed294954907929aacd95153508d5d89d7", + "sha256:1ad7247d79f9f55bb25ab1778fd47f32d70cf36053941f07de0b7c4e96b5d235", + "sha256:1b8d1eae0f65441963d805f766c7e9cd092f91e0c600c820c764a4ff71a0764c", + "sha256:1bd467213195e76f838caf2c28cd65e58302d0254e636e7c0fca81efa4a2e62c", + "sha256:1c9198c989f47898b2c22201756f73249de3748e0fc9de44adaf54a8b259cc0c", + "sha256:1fd9a5205139f3c6bb60d11f6072e0552f0a20b712c85f43d42342d162be1235", + "sha256:214cee7f9e09150d4fb42e24919a1e74d8c9b8a9306ed1474ecaddcd5479c293", + "sha256:27b4035013f1ea49c6c0b42d983133b136637a527e48c132d368eb19bf1ac6aa", + "sha256:3a23092a992e61c3a6a70f350a56db7197242f3490da9c87b500f389b2d01eef", + "sha256:3ad692bc7792be8c32918c699638b660c0de078a6cbe464c46e1340dadb94c19", + "sha256:3ccceb50c611c433145502735e0370877cced72a6c70fd2410238bcbc7fe51d8", + "sha256:3d0f32ebfaa9c6011f8454994f86108c2eb9c79b8b7de00b36d558cadcedaa3d", + "sha256:3f92944efc564867bbf841c823c8b71bb0be75e06b8ce45c084b46411475a915", + "sha256:40bca549fdc929b470dd1dbfcb47b3295cb46a6d2c90e50588b0a1b3bd98f429", + "sha256:43babacef21c519bc6631c5fce2a61eccdfc011b4bcb9047255e9620732c8097", + "sha256:4566006aa44cb0d21b8ab53baf4b9c667a0ed23efe4aaad8c227bfba0bf15cbe", + "sha256:49f56e6ecc2503e7dbe233fa328b2be1a7797d31548e7a193237dcdf1ad0eee0", + "sha256:4c48a10d17571d1275701e14a601e36959ffada3add8cdbc9e5061a6e3579a5d", + "sha256:4ea10a29aa5de67de02256a28d1bf53d21322295cb00bd2d57fcd19b850ebd99", + "sha256:511f0b034120cd1989932bf1e9081aa9fb00f1f949fbd2d9cab6264916ae89b1", + "sha256:51ddac60b96a42c15d24fbdc7a4bfcd02b5a29c047b7f8bf63d3f6f5a860949a", + "sha256:57d430f5fb63fea141ab71ca9c064e80de3a20b427ca2febcbfcef70ff0ce895", + "sha256:59137c0c6826bd56c710d1d2bda81553b5e6b7c84d5a676747d80caf0409ad94", + "sha256:5a03651352fc20975ee2a707cd2d74a386cd303cc688f407296064ad1e6d1562", + "sha256:5eb86c6acb498208e7663ca22dbe68ca2cf42ab5bf1c776670a50919a56e64ab", + "sha256:642d66b75eda909fd1112d35c53816d59789a4b38c141a96d62f50a3ef9b3360", + "sha256:6674b00b9756b0af620aa2a3346b01f8e2a3dc729d25617e1b89cf6af4a54eb1", + "sha256:668c265d90de8ae914f860d3eeb164534ba2e836811f91fecc7050416ee70aa7", + "sha256:66fac0c238ab9a2e72d026b5fb91cb902c146202bbd29a9a1a44e8db7b710b6f", + "sha256:6c107ea3cf2bd07199d66f156e3ea756d1b84dfd43b542b2d870b77868c98c03", + "sha256:6c889025f59884423428c261f212e04d438de865beda0b1e1babab85ef4c0f01", + "sha256:6cb8fdc044909e2078c248986f2fc76f911f72b51ea4a4fbbf472e01d14faa58", + "sha256:6e9be3ef84e2bb9710f3f777accce25556f4a71e15d2b73223788d528fcc2052", + "sha256:7f762a1a85a12cc3484f77eee7be87b10f8c50b0b787bb02f4e357403cad0c0e", + "sha256:83a696da8922314ff2aec02987eefb03784f473281d740bf9170181829133765", + "sha256:853853cbf7bf9408b404754b92512ebe3e3a83587503d766d23e6bf83d092ee6", + "sha256:8ad3fe0a3567c2f0f629d800409cd528cb6251da12e81a1f765e5c5345fd0137", + "sha256:8c6ed10c2497e5fedadf61e465b3ca12a19f96004c15dcffe4bd442ebadc2d85", + "sha256:8d5f400326840934e3507701f9f7269247f7c026d1b6cfd49477d2be0933cfca", + "sha256:927c589500f9f41e370b0125c12ac9e7d3a2fd166b89e9ee2828b3dda20bfe6f", + "sha256:9a0aa47f94ea9a0b39dd30850b0adf2e1cd32a8b4f9c7aa443d852aacf9ca214", + "sha256:9b37a7ba223b2f26122c148bb8d09a9ff312afca998c48c725ff5a0a632145f7", + "sha256:9c873345680c1b87f1e09e0eaf8cf6c891b9851d8b4d3645e7efe2ec20a20cc7", + "sha256:9d09869f2c5a6f2d9df50ce3064b3391d3ecb6dced708ad64467b9e4f2c9bef3", + "sha256:9d353c4cfda586db2a176ce42c88f2fc31ec25e50212650c89fdd0f560ee507b", + "sha256:a1e3014a625bcf107fbf38eece0e47fa0190e52e45dc6eee5a8265ddc6dc5ea7", + "sha256:a3b9bec9579a15fb3ca2d9878deae789df72f2b0fdaf90ad49ee389cad5edab6", + "sha256:ab03a90b305d2588e8352168e8c5a1520b721d2d367f31e9332c4235b30b8994", + "sha256:aff06b2cac3ef4616e26ba17a9c250c1fe9dd8a5d907d0193f84c499b1b6e6a9", + "sha256:b3cab0e06143768499384a8a5efb9c4dc53e19382952859e4802f294214f36ec", + "sha256:b4a21f71885aa2744719459951819e7bf5a906a6448a6b2bbce8e9cc9f2c8128", + "sha256:b6d45d9b699ecbac6c7bd8e0a2609767491540403610962968d258fd6405c17c", + "sha256:be6dd5d52b73018b21adc1c5d28ac0c68184a64769052dfeb0c5d9998e7f56a2", + "sha256:c550a56bf209a3d987d5a975cdf2063b3389a5d16caf29db4bdddeae49f22078", + "sha256:c76c635fabf542bb78524905718c39f736a98e5ab25b23ec6d4abede1a85a6a3", + "sha256:c81818595eff6e92535ff32825f31c116f867f64ff8cdf6562cd1d6b2e1e8f3e", + "sha256:cfb92d49dbb95ec7a07511bc9efb0faff8fe24ef3805662b8d6808ba8409a71a", + "sha256:d23bcd6c8eaa6324fe109d8cac01b41fe9a54b8c498af9ce464c1aeeb99903d6", + "sha256:d5b1dc0e708fad9f92c296ab2f948af403bf201db8fb2eb4c8179db143732e49", + "sha256:d78f30cbe8b2ce770160d3c08cff01b2ae9306fe66ce899b73f0409dc1846c1b", + "sha256:d8f57c4461cd24fda22493109c45b3980863c58a25b8bec885ca8bea6b8d4b28", + "sha256:d9792dff410f266051025ecfaa927078b94cc7478954b06796a9756ccc7e14a9", + "sha256:e7941bbcfdded9c26b0bf720cb7e6fd803d95a55d2c14b4bd1f6a2772230c586", + "sha256:ebe684d7d26239e23d102a2bad2a358dedf18e462e8808778703427d1f584400", + "sha256:ec8c8900dc5c83650a63dd48c4d1d245343f904c4b64b48798c67a3767d7e165", + "sha256:f564bf68404144ea6b87a78a3f910cc8de216c6b12a4cf0b27718bf4ec38d303", + "sha256:fd7ac678b92b29ba630d8c842d8ad6c555abda1b9ef044d6cc092dacbfc9719d" ], - "version": "==0.18.1" + "version": "==0.21.0" }, "websocket-client": { "hashes": [ @@ -1153,83 +1296,94 @@ }, "websockets": { "hashes": [ - "sha256:00213676a2e46b6ebf6045bc11d0f529d9120baa6f58d122b4021ad92adabd41", - "sha256:00c870522cdb69cd625b93f002961ffb0c095394f06ba8c48f17eef7c1541f96", - "sha256:0154f7691e4fe6c2b2bc275b5701e8b158dae92a1ab229e2b940efe11905dff4", - "sha256:05a7233089f8bd355e8cbe127c2e8ca0b4ea55467861906b80d2ebc7db4d6b72", - "sha256:09a1814bb15eff7069e51fed0826df0bc0702652b5cb8f87697d469d79c23576", - "sha256:0cff816f51fb33c26d6e2b16b5c7d48eaa31dae5488ace6aae468b361f422b63", - "sha256:185929b4808b36a79c65b7865783b87b6841e852ef5407a2fb0c03381092fa3b", - "sha256:2fc8709c00704194213d45e455adc106ff9e87658297f72d544220e32029cd3d", - "sha256:33d69ca7612f0ddff3316b0c7b33ca180d464ecac2d115805c044bf0a3b0d032", - "sha256:389f8dbb5c489e305fb113ca1b6bdcdaa130923f77485db5b189de343a179393", - "sha256:38ea7b82bfcae927eeffc55d2ffa31665dc7fec7b8dc654506b8e5a518eb4d50", - "sha256:3d3cac3e32b2c8414f4f87c1b2ab686fa6284a980ba283617404377cd448f631", - "sha256:40e826de3085721dabc7cf9bfd41682dadc02286d8cf149b3ad05bff89311e4f", - "sha256:4239b6027e3d66a89446908ff3027d2737afc1a375f8fd3eea630a4842ec9a0c", - "sha256:45ec8e75b7dbc9539cbfafa570742fe4f676eb8b0d3694b67dabe2f2ceed8aa6", - "sha256:47a2964021f2110116cc1125b3e6d87ab5ad16dea161949e7244ec583b905bb4", - "sha256:48c08473563323f9c9debac781ecf66f94ad5a3680a38fe84dee5388cf5acaf6", - "sha256:4c6d2264f485f0b53adf22697ac11e261ce84805c232ed5dbe6b1bcb84b00ff0", - "sha256:4f72e5cd0f18f262f5da20efa9e241699e0cf3a766317a17392550c9ad7b37d8", - "sha256:56029457f219ade1f2fc12a6504ea61e14ee227a815531f9738e41203a429112", - "sha256:5c1289596042fad2cdceb05e1ebf7aadf9995c928e0da2b7a4e99494953b1b94", - "sha256:62e627f6b6d4aed919a2052efc408da7a545c606268d5ab5bfab4432734b82b4", - "sha256:74de2b894b47f1d21cbd0b37a5e2b2392ad95d17ae983e64727e18eb281fe7cb", - "sha256:7c584f366f46ba667cfa66020344886cf47088e79c9b9d39c84ce9ea98aaa331", - "sha256:7d27a7e34c313b3a7f91adcd05134315002aaf8540d7b4f90336beafaea6217c", - "sha256:7d3f0b61c45c3fa9a349cf484962c559a8a1d80dae6977276df8fd1fa5e3cb8c", - "sha256:82ff5e1cae4e855147fd57a2863376ed7454134c2bf49ec604dfe71e446e2193", - "sha256:84bc2a7d075f32f6ed98652db3a680a17a4edb21ca7f80fe42e38753a58ee02b", - "sha256:884be66c76a444c59f801ac13f40c76f176f1bfa815ef5b8ed44321e74f1600b", - "sha256:8a5cc00546e0a701da4639aa0bbcb0ae2bb678c87f46da01ac2d789e1f2d2038", - "sha256:8dc96f64ae43dde92530775e9cb169979f414dcf5cff670455d81a6823b42089", - "sha256:8f38706e0b15d3c20ef6259fd4bc1700cd133b06c3c1bb108ffe3f8947be15fa", - "sha256:90fcf8929836d4a0e964d799a58823547df5a5e9afa83081761630553be731f9", - "sha256:931c039af54fc195fe6ad536fde4b0de04da9d5916e78e55405436348cfb0e56", - "sha256:932af322458da7e4e35df32f050389e13d3d96b09d274b22a7aa1808f292fee4", - "sha256:942de28af58f352a6f588bc72490ae0f4ccd6dfc2bd3de5945b882a078e4e179", - "sha256:9bc42e8402dc5e9905fb8b9649f57efcb2056693b7e88faa8fb029256ba9c68c", - "sha256:a7a240d7a74bf8d5cb3bfe6be7f21697a28ec4b1a437607bae08ac7acf5b4882", - "sha256:a9f9a735deaf9a0cadc2d8c50d1a5bcdbae8b6e539c6e08237bc4082d7c13f28", - "sha256:ae5e95cfb53ab1da62185e23b3130e11d64431179debac6dc3c6acf08760e9b1", - "sha256:b029fb2032ae4724d8ae8d4f6b363f2cc39e4c7b12454df8df7f0f563ed3e61a", - "sha256:b0d15c968ea7a65211e084f523151dbf8ae44634de03c801b8bd070b74e85033", - "sha256:b343f521b047493dc4022dd338fc6db9d9282658862756b4f6fd0e996c1380e1", - "sha256:b627c266f295de9dea86bd1112ed3d5fafb69a348af30a2422e16590a8ecba13", - "sha256:b9968694c5f467bf67ef97ae7ad4d56d14be2751000c1207d31bf3bb8860bae8", - "sha256:ba089c499e1f4155d2a3c2a05d2878a3428cf321c848f2b5a45ce55f0d7d310c", - "sha256:bbccd847aa0c3a69b5f691a84d2341a4f8a629c6922558f2a70611305f902d74", - "sha256:bc0b82d728fe21a0d03e65f81980abbbcb13b5387f733a1a870672c5be26edab", - "sha256:c57e4c1349fbe0e446c9fa7b19ed2f8a4417233b6984277cce392819123142d3", - "sha256:c94ae4faf2d09f7c81847c63843f84fe47bf6253c9d60b20f25edfd30fb12588", - "sha256:c9b27d6c1c6cd53dc93614967e9ce00ae7f864a2d9f99fe5ed86706e1ecbf485", - "sha256:d210abe51b5da0ffdbf7b43eed0cfdff8a55a1ab17abbec4301c9ff077dd0342", - "sha256:d58804e996d7d2307173d56c297cf7bc132c52df27a3efaac5e8d43e36c21c48", - "sha256:d6a4162139374a49eb18ef5b2f4da1dd95c994588f5033d64e0bbfda4b6b6fcf", - "sha256:da39dd03d130162deb63da51f6e66ed73032ae62e74aaccc4236e30edccddbb0", - "sha256:db3c336f9eda2532ec0fd8ea49fef7a8df8f6c804cdf4f39e5c5c0d4a4ad9a7a", - "sha256:dd500e0a5e11969cdd3320935ca2ff1e936f2358f9c2e61f100a1660933320ea", - "sha256:dd9becd5fe29773d140d68d607d66a38f60e31b86df75332703757ee645b6faf", - "sha256:e0cb5cc6ece6ffa75baccfd5c02cffe776f3f5c8bf486811f9d3ea3453676ce8", - "sha256:e23173580d740bf8822fd0379e4bf30aa1d5a92a4f252d34e893070c081050df", - "sha256:e3a686ecb4aa0d64ae60c9c9f1a7d5d46cab9bfb5d91a2d303d00e2cd4c4c5cc", - "sha256:e789376b52c295c4946403bd0efecf27ab98f05319df4583d3c48e43c7342c2f", - "sha256:edc344de4dac1d89300a053ac973299e82d3db56330f3494905643bb68801269", - "sha256:eef610b23933c54d5d921c92578ae5f89813438fded840c2e9809d378dc765d3", - "sha256:f2c38d588887a609191d30e902df2a32711f708abfd85d318ca9b367258cfd0c", - "sha256:f55b5905705725af31ccef50e55391621532cd64fbf0bc6f4bac935f0fccec46", - "sha256:f5fc088b7a32f244c519a048c170f14cf2251b849ef0e20cbbb0fdf0fdaf556f", - "sha256:fe10ddc59b304cb19a1bdf5bd0a7719cbbc9fbdd57ac80ed436b709fcf889106", - "sha256:ff64a1d38d156d429404aaa84b27305e957fd10c30e5880d1765c9480bea490f" - ], - "version": "==10.4" + "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b", + "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6", + "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df", + "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b", + "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205", + "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892", + "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53", + "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2", + "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed", + "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c", + "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd", + "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b", + "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931", + "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30", + "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370", + "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be", + "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec", + "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf", + "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62", + "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b", + "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402", + "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f", + "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123", + "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9", + "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603", + "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45", + "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558", + "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4", + "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438", + "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137", + "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480", + "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447", + "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8", + "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04", + "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c", + "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb", + "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967", + "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b", + "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d", + "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def", + "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c", + "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92", + "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2", + "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113", + "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b", + "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28", + "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7", + "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d", + "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f", + "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468", + "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8", + "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae", + "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611", + "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d", + "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9", + "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca", + "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f", + "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2", + "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077", + "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2", + "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6", + "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374", + "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc", + "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e", + "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53", + "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399", + "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547", + "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3", + "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870", + "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5", + "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8", + "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7" + ], + "version": "==12.0" }, "wrapt": { "hashes": [ "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" ], "version": "==1.12.1" + }, + "wsproto": { + "hashes": [ + "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", + "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==1.2.0" } } } diff --git a/package.json b/package.json index 142245231..d902266fd 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "husky": "^8.0.1", "lint-staged": "^10.5.4", "prettier": "^2.7.1", - "pyright": "^1.1.257", + "pyright": "1.1.257", "typescript": "~4.4.4" }, "lint-staged": { diff --git a/packages/api-server/api_server/app.py b/packages/api-server/api_server/app.py index d75ae3c40..0176b9b13 100644 --- a/packages/api-server/api_server/app.py +++ b/packages/api-server/api_server/app.py @@ -2,7 +2,7 @@ import os import signal import threading -from typing import Any, Callable, Coroutine, List, Optional, Union +from typing import Any, Callable, Coroutine, Union import schedule from fastapi import Depends @@ -37,7 +37,7 @@ from .types import is_coroutine -async def on_sio_connect(sid: str, _environ: dict, auth: Optional[dict] = None): +async def on_sio_connect(sid: str, _environ: dict, auth: dict | None = None) -> bool: session = await app.sio.get_session(sid) token = None if auth: @@ -83,7 +83,7 @@ async def on_sio_connect(sid: str, _environ: dict, auth: Optional[dict] = None): ) # will be called in reverse order on app shutdown -shutdown_cbs: List[Union[Coroutine[Any, Any, Any], Callable[[], None]]] = [] +shutdown_cbs: list[Union[Coroutine[Any, Any, Any], Callable[[], None]]] = [] rmf_bookkeeper = RmfBookKeeper(rmf_events, logger=logger.getChild("BookKeeper")) @@ -257,7 +257,7 @@ async def _load_states(): logger.info(f"loaded {len(door_states)} door states") door_health = [ - await DoorHealth.from_tortoise(x) for x in await ttm.DoorHealth.all() + await DoorHealth.from_tortoise_orm(x) for x in await ttm.DoorHealth.all() ] for health in door_health: rmf_events.door_health.on_next(health) @@ -269,7 +269,7 @@ async def _load_states(): logger.info(f"loaded {len(lift_states)} lift states") lift_health = [ - await LiftHealth.from_tortoise(x) for x in await ttm.LiftHealth.all() + await LiftHealth.from_tortoise_orm(x) for x in await ttm.LiftHealth.all() ] for health in lift_health: rmf_events.lift_health.on_next(health) @@ -283,7 +283,8 @@ async def _load_states(): logger.info(f"loaded {len(dispenser_states)} dispenser states") dispenser_health = [ - await DispenserHealth.from_tortoise(x) for x in await ttm.DispenserHealth.all() + await DispenserHealth.from_tortoise_orm(x) + for x in await ttm.DispenserHealth.all() ] for health in dispenser_health: rmf_events.dispenser_health.on_next(health) @@ -297,7 +298,8 @@ async def _load_states(): logger.info(f"loaded {len(ingestor_states)} ingestor states") ingestor_health = [ - await IngestorHealth.from_tortoise(x) for x in await ttm.IngestorHealth.all() + await IngestorHealth.from_tortoise_orm(x) + for x in await ttm.IngestorHealth.all() ] for health in ingestor_health: rmf_events.ingestor_health.on_next(health) diff --git a/packages/api-server/api_server/app_config.py b/packages/api-server/api_server/app_config.py index 609b57519..e359e78ac 100644 --- a/packages/api-server/api_server/app_config.py +++ b/packages/api-server/api_server/app_config.py @@ -4,7 +4,7 @@ import urllib.parse from dataclasses import dataclass from importlib.abc import Loader -from typing import Any, List, Optional, cast +from typing import List, Optional, cast @dataclass @@ -47,7 +47,7 @@ def load_config(config_file: str) -> AppConfig: raise RuntimeError("unable to load module") sys.path.append(os.path.dirname(config_file)) loader.exec_module(module) - config = AppConfig(**cast(Any, module).config) + config = AppConfig(**module.config) if "RMF_API_SERVER_LOG_LEVEL" in os.environ: config.log_level = os.environ["RMF_API_SERVER_LOG_LEVEL"] return config diff --git a/packages/api-server/api_server/authenticator.py b/packages/api-server/api_server/authenticator.py index ee87e3f6d..570a7659b 100644 --- a/packages/api-server/api_server/authenticator.py +++ b/packages/api-server/api_server/authenticator.py @@ -1,7 +1,9 @@ -from typing import Any, Callable, Coroutine, Optional, Union +import base64 +import json +from typing import Any, Callable, Coroutine, Optional, Protocol, Union import jwt -from fastapi import Depends, HTTPException +from fastapi import Depends, Header, HTTPException from fastapi.security import OpenIdConnect from .app_config import app_config @@ -13,13 +15,22 @@ class AuthenticationError(Exception): pass -class JwtAuthenticator: +class Authenticator(Protocol): + async def verify_token(self, token: Optional[str]) -> User: + ... + + def fastapi_dep(self) -> Callable[..., Union[Coroutine[Any, Any, User], User]]: + ... + + +class JwtAuthenticator(Authenticator): def __init__(self, pem_file: str, aud: str, iss: str, *, oidc_url: str = ""): """ Authenticates with a JWT token, the client must send an auth params with a "token" key. :param pem_file: path to a pem encoded certificate used to verify a token. """ + super().__init__() self.aud = aud self.iss = iss self.oidc_url = oidc_url @@ -65,15 +76,31 @@ async def dep( return dep -class StubAuthenticator(JwtAuthenticator): - def __init__(self): # pylint: disable=super-init-not-called - self._user = User(username="stub", is_admin=True) +class StubAuthenticator(Authenticator): + """ + StubAuthenticator will authenticate as an admin user called "stub" if no tokens are + present. If there is a bearer token in the `Authorization` header, then it decodes the jwt + WITHOUT verifying the signature and authenticated as the user given. + """ - async def verify_token(self, token: Optional[str]) -> User: - return self._user + async def verify_token(self, token: Optional[str]): + if not token: + return User(username="stub", is_admin=True) + # decode the jwt without verifying signature + parts = token.split(".") + # add padding to ignore incorrect padding errors + payload = base64.b64decode(parts[1] + "==") + username = json.loads(payload)["preferred_username"] + return await User.load_or_create_from_db(username) - def fastapi_dep(self) -> Callable[..., Union[Coroutine[Any, Any, User], User]]: - return lambda: self._user + def fastapi_dep(self): + async def dep(authorization: str | None = Header(None)): + if not authorization: + return await self.verify_token(None) + token = authorization.split(" ")[1] + return await self.verify_token(token) + + return dep if app_config.jwt_public_key: diff --git a/packages/api-server/api_server/fast_io/__init__.py b/packages/api-server/api_server/fast_io/__init__.py index 464b7df89..70889c199 100644 --- a/packages/api-server/api_server/fast_io/__init__.py +++ b/packages/api-server/api_server/fast_io/__init__.py @@ -21,7 +21,7 @@ from fastapi import APIRouter, FastAPI from fastapi.exceptions import HTTPException from fastapi.routing import APIRoute -from rx.core.observable.observable import Observable +from reactivex import Observable from starlette.routing import compile_path from api_server.logger import logger diff --git a/packages/api-server/api_server/models/__init__.py b/packages/api-server/api_server/models/__init__.py index 60b8bb7ac..27b891b46 100644 --- a/packages/api-server/api_server/models/__init__.py +++ b/packages/api-server/api_server/models/__init__.py @@ -2,6 +2,7 @@ from .building_map import * from .dispensers import * from .doors import * +from .fleets import * from .health import * from .ingestors import * from .lifts import * diff --git a/packages/api-server/api_server/models/building_map.py b/packages/api-server/api_server/models/building_map.py index 7525dcc28..4f73a7f9b 100644 --- a/packages/api-server/api_server/models/building_map.py +++ b/packages/api-server/api_server/models/building_map.py @@ -1,5 +1,3 @@ -from typing import List - from . import tortoise_models as ttm from .ros_pydantic import rmf_building_map_msgs @@ -9,11 +7,11 @@ class AffineImage(rmf_building_map_msgs.AffineImage): class Level(rmf_building_map_msgs.Level): - images: List[AffineImage] + images: list[AffineImage] class BuildingMap(rmf_building_map_msgs.BuildingMap): - levels: List[Level] + levels: list[Level] @staticmethod def from_tortoise(tortoise: ttm.BuildingMap) -> "BuildingMap": diff --git a/packages/api-server/api_server/models/dispensers.py b/packages/api-server/api_server/models/dispensers.py index 104f5037f..9f7f00d26 100644 --- a/packages/api-server/api_server/models/dispensers.py +++ b/packages/api-server/api_server/models/dispensers.py @@ -1,10 +1,18 @@ from pydantic import BaseModel from . import tortoise_models as ttm -from .health import basic_health_model +from .health import BasicHealth, HealthStatus from .ros_pydantic import rmf_dispenser_msgs -DispenserHealth = basic_health_model(ttm.DispenserHealth) + +class DispenserHealth(BasicHealth): + @classmethod + async def from_tortoise_orm(cls, obj: ttm.DispenserHealth) -> "DispenserHealth": + return DispenserHealth( + id_=obj.id_, + health_status=HealthStatus(obj.health_status), + health_message=obj.health_message, + ) class Dispenser(BaseModel): diff --git a/packages/api-server/api_server/models/doors.py b/packages/api-server/api_server/models/doors.py index cc7d97426..9b475e394 100644 --- a/packages/api-server/api_server/models/doors.py +++ b/packages/api-server/api_server/models/doors.py @@ -1,12 +1,21 @@ from pydantic import BaseModel, Field from . import tortoise_models as ttm -from .health import basic_health_model +from .health import BasicHealth, HealthStatus from .ros_pydantic import rmf_building_map_msgs, rmf_door_msgs Door = rmf_building_map_msgs.Door DoorMode = rmf_door_msgs.DoorMode -DoorHealth = basic_health_model(ttm.DoorHealth) + + +class DoorHealth(BasicHealth): + @classmethod + async def from_tortoise_orm(cls, obj: ttm.DoorHealth) -> "DoorHealth": + return DoorHealth( + id_=obj.id_, + health_status=HealthStatus(obj.health_status), + health_message=obj.health_message, + ) class DoorState(rmf_door_msgs.DoorState): diff --git a/packages/api-server/api_server/models/fleets.py b/packages/api-server/api_server/models/fleets.py new file mode 100644 index 000000000..a859f3d65 --- /dev/null +++ b/packages/api-server/api_server/models/fleets.py @@ -0,0 +1,12 @@ +from . import tortoise_models as ttm +from .health import BasicHealth, HealthStatus + + +class RobotHealth(BasicHealth): + @classmethod + async def from_tortoise_orm(cls, obj: ttm.RobotHealth) -> "RobotHealth": + return RobotHealth( + id_=obj.id_, + health_status=HealthStatus(obj.health_status), + health_message=obj.health_message, + ) diff --git a/packages/api-server/api_server/models/health.py b/packages/api-server/api_server/models/health.py index cd42ec38e..d317df86f 100644 --- a/packages/api-server/api_server/models/health.py +++ b/packages/api-server/api_server/models/health.py @@ -1,57 +1,15 @@ -from abc import ABC, abstractmethod -from typing import Generic, Optional, Type, TypeVar, cast +from enum import Enum -from tortoise.contrib.pydantic.base import PydanticModel -from tortoise.contrib.pydantic.creator import pydantic_model_creator +from pydantic import BaseModel -from . import tortoise_models as ttm - -class HealthStatus: +class HealthStatus(str, Enum): HEALTHY = "Healthy" UNHEALTHY = "Unhealthy" DEAD = "Dead" -HealthModelT = TypeVar("HealthModelT", bound=ttm.BasicHealthModel) - - -class BaseBasicHealth(Generic[HealthModelT], ABC, PydanticModel): +class BasicHealth(BaseModel): id_: str - health_status: str - health_message: Optional[str] - - @staticmethod - @abstractmethod - async def from_tortoise(_tortoise: HealthModelT) -> "BaseBasicHealth": - pass - - @abstractmethod - async def save(self) -> None: - pass - - -def basic_health_model( - TortoiseModel: Type[HealthModelT], -) -> Type[BaseBasicHealth[HealthModelT]]: - """ - Creates a pydantic model from a tortoise basic health model. - """ - - class _BasicHealth(pydantic_model_creator(TortoiseModel)): - id_: str - health_status: str - health_message: Optional[str] - - @classmethod - async def from_tortoise(cls, tortoise: ttm.BasicHealthModel): - return await cls.from_tortoise_orm(tortoise) - - async def save(self): - dic = self.dict() - del dic["id_"] - await TortoiseModel.update_or_create(dic, id_=self.id_) - - _BasicHealth.__name__ = TortoiseModel.__name__ - - return cast(Type[BaseBasicHealth[HealthModelT]], _BasicHealth) + health_status: HealthStatus + health_message: str | None diff --git a/packages/api-server/api_server/models/ingestors.py b/packages/api-server/api_server/models/ingestors.py index e99aef369..cdd5e4c9a 100644 --- a/packages/api-server/api_server/models/ingestors.py +++ b/packages/api-server/api_server/models/ingestors.py @@ -1,10 +1,18 @@ from pydantic import BaseModel from . import tortoise_models as ttm -from .health import basic_health_model +from .health import BasicHealth, HealthStatus from .ros_pydantic import rmf_ingestor_msgs -IngestorHealth = basic_health_model(ttm.IngestorHealth) + +class IngestorHealth(BasicHealth): + @classmethod + async def from_tortoise_orm(cls, obj: ttm.IngestorHealth) -> "IngestorHealth": + return IngestorHealth( + id_=obj.id_, + health_status=HealthStatus(obj.health_status), + health_message=obj.health_message, + ) class Ingestor(BaseModel): diff --git a/packages/api-server/api_server/models/lifts.py b/packages/api-server/api_server/models/lifts.py index 1bf3fa4c5..ea6d8651c 100644 --- a/packages/api-server/api_server/models/lifts.py +++ b/packages/api-server/api_server/models/lifts.py @@ -1,17 +1,24 @@ -from typing import List - from pydantic import BaseModel, Field from . import tortoise_models as ttm -from .health import basic_health_model +from .health import BasicHealth, HealthStatus from .ros_pydantic import rmf_building_map_msgs, rmf_lift_msgs Lift = rmf_building_map_msgs.Lift -LiftHealth = basic_health_model(ttm.LiftHealth) + + +class LiftHealth(BasicHealth): + @classmethod + async def from_tortoise_orm(cls, obj: ttm.LiftHealth) -> "LiftHealth": + return LiftHealth( + id_=obj.id_, + health_status=HealthStatus(obj.health_status), + health_message=obj.health_message, + ) class LiftState(rmf_lift_msgs.LiftState): - available_modes: List[int] + available_modes: list[int] @staticmethod def from_tortoise(tortoise: ttm.LiftState) -> "LiftState": diff --git a/packages/api-server/api_server/models/tortoise_models/authorization.py b/packages/api-server/api_server/models/tortoise_models/authorization.py index d81f3328c..a96f82182 100644 --- a/packages/api-server/api_server/models/tortoise_models/authorization.py +++ b/packages/api-server/api_server/models/tortoise_models/authorization.py @@ -1,5 +1,3 @@ -from typing import cast - from tortoise.fields.data import CharField from tortoise.fields.relational import ( ForeignKeyField, @@ -10,17 +8,17 @@ class Role(Model): - name = CharField(255, pk=True) + name: str = CharField(255, pk=True) # type: ignore permissions: ReverseRelation["ResourcePermission"] class ResourcePermission(Model): # "obj" in casbin speak # This has no foreign key because resources can be given any arbitrary group, sometimes even dynamically. - authz_grp = CharField(255, index=True) + authz_grp: str = CharField(255, index=True) # type: ignore # "sub" in casbin speak - role = cast(ForeignKeyRelation[Role], ForeignKeyField("models.Role")) - action = CharField(255) + role: ForeignKeyRelation[Role] = ForeignKeyField("models.Role") + action: str = CharField(255) # type: ignore class ProtectedResource: diff --git a/packages/api-server/api_server/models/tortoise_models/building_map.py b/packages/api-server/api_server/models/tortoise_models/building_map.py index f7fe22ded..88bbb1c99 100644 --- a/packages/api-server/api_server/models/tortoise_models/building_map.py +++ b/packages/api-server/api_server/models/tortoise_models/building_map.py @@ -1,7 +1,7 @@ -from tortoise.fields.data import CharField, JSONField +from tortoise.fields import CharField, JSONField from tortoise.models import Model class BuildingMap(Model): id_ = CharField(255, pk=True, source_field="id") - data = JSONField() + data: dict = JSONField() # type: ignore diff --git a/packages/api-server/api_server/models/tortoise_models/fleets.py b/packages/api-server/api_server/models/tortoise_models/fleets.py index f50569856..9f06ba434 100644 --- a/packages/api-server/api_server/models/tortoise_models/fleets.py +++ b/packages/api-server/api_server/models/tortoise_models/fleets.py @@ -12,7 +12,7 @@ class FleetState(Model): name = CharField(255, pk=True) - data = JSONField() + data: dict = JSONField() # type: ignore class FleetLog(Model): @@ -22,20 +22,26 @@ class FleetLog(Model): class FleetLogLog(Model, LogMixin): - fleet: ForeignKeyRelation[FleetLog] = ForeignKeyField("models.FleetLog", related_name="log") # type: ignore + fleet: ForeignKeyRelation[FleetLog] = ForeignKeyField( + "models.FleetLog", related_name="log" + ) class Meta: unique_together = ("fleet", "seq") class FleetLogRobots(Model): - fleet: ForeignKeyRelation[FleetLog] = ForeignKeyField("models.FleetLog", related_name="robots") # type: ignore + fleet: ForeignKeyRelation[FleetLog] = ForeignKeyField( + "models.FleetLog", related_name="robots" + ) name = CharField(255) log: ReverseRelation["FleetLogRobotsLog"] class FleetLogRobotsLog(Model, LogMixin): - robot: ForeignKeyRelation[FleetLogRobots] = ForeignKeyField("models.FleetLogRobots", related_name="log") # type: ignore + robot: ForeignKeyRelation[FleetLogRobots] = ForeignKeyField( + "models.FleetLogRobots", related_name="log" + ) class Meta: unique_together = ("id", "seq") diff --git a/packages/api-server/api_server/models/tortoise_models/health.py b/packages/api-server/api_server/models/tortoise_models/health.py index 576c8a6c6..7cf9c0e5a 100644 --- a/packages/api-server/api_server/models/tortoise_models/health.py +++ b/packages/api-server/api_server/models/tortoise_models/health.py @@ -1,11 +1,14 @@ -from tortoise.fields.data import CharField +from tortoise.fields import CharField, TextField from tortoise.models import Model -from .health_status_mixin import HealthStatusMixin +class BasicHealthModel(Model): + id_: str = CharField(255, pk=True, source_field="id") # type: ignore + health_status: str = CharField(max_length=255, null=True) # type: ignore + health_message: str = TextField(null=True) # type: ignore -class BasicHealthModel(Model, HealthStatusMixin): - id_ = CharField(255, pk=True, source_field="id") + class Meta: + abstract = True class DoorHealth(BasicHealthModel): diff --git a/packages/api-server/api_server/models/tortoise_models/health_status_mixin.py b/packages/api-server/api_server/models/tortoise_models/health_status_mixin.py deleted file mode 100644 index 49fa28f5b..000000000 --- a/packages/api-server/api_server/models/tortoise_models/health_status_mixin.py +++ /dev/null @@ -1,6 +0,0 @@ -from tortoise.fields.data import CharField, TextField - - -class HealthStatusMixin: - health_status = CharField(max_length=255, null=True) - health_message = TextField(null=True) diff --git a/packages/api-server/api_server/models/tortoise_models/json_mixin.py b/packages/api-server/api_server/models/tortoise_models/json_mixin.py index 42a16ca1b..f6d649333 100644 --- a/packages/api-server/api_server/models/tortoise_models/json_mixin.py +++ b/packages/api-server/api_server/models/tortoise_models/json_mixin.py @@ -1,6 +1,6 @@ -from tortoise.fields.data import CharField, JSONField +from tortoise.fields import CharField, JSONField class JsonMixin: id_ = CharField(255, pk=True, source_field="id") - data = JSONField() + data: dict = JSONField() # type: ignore diff --git a/packages/api-server/api_server/models/tortoise_models/scheduled_task.py b/packages/api-server/api_server/models/tortoise_models/scheduled_task.py index 2d1d2a9b8..d3ae01a72 100644 --- a/packages/api-server/api_server/models/tortoise_models/scheduled_task.py +++ b/packages/api-server/api_server/models/tortoise_models/scheduled_task.py @@ -1,6 +1,5 @@ from datetime import datetime from enum import Enum -from typing import Optional import schedule from schedule import Job @@ -24,11 +23,11 @@ class ScheduledTask(Model): - task_request = JSONField() - created_by = CharField(255) + task_request: dict = JSONField() # type: ignore + created_by: str = CharField(255) # type: ignore schedules: ReverseRelation["ScheduledTaskSchedule"] - last_ran: Optional[datetime] = DatetimeField(null=True) - except_dates = JSONField(null=True, default=list) + last_ran: datetime | None = DatetimeField(null=True) # type: ignore + except_dates: list[str] = JSONField(null=True) # type: ignore class ScheduledTaskSchedule(Model): @@ -49,17 +48,17 @@ class Period(str, Enum): Hour = "hour" Minute = "minute" - _id = IntField(pk=True, source_field="id") + _id: int = IntField(pk=True, source_field="id") # type: ignore scheduled_task: ForeignKeyRelation[ScheduledTask] = ForeignKeyField( "models.ScheduledTask", related_name="schedules" ) - every = SmallIntField(null=True) - start_from = DatetimeField(null=True) - until = DatetimeField(null=True) + every: int | None = SmallIntField(null=True) # type: ignore + start_from: datetime | None = DatetimeField(null=True) # type: ignore + until: datetime | None = DatetimeField(null=True) # type: ignore period = CharEnumField(Period) - at = CharField(255, null=True) + at: str | None = CharField(255, null=True) # type: ignore - def get_id(self) -> IntField: + def get_id(self) -> int: return self._id def to_job(self) -> Job: diff --git a/packages/api-server/api_server/models/tortoise_models/tasks.py b/packages/api-server/api_server/models/tortoise_models/tasks.py index 20be6d63b..aabcd8d1f 100644 --- a/packages/api-server/api_server/models/tortoise_models/tasks.py +++ b/packages/api-server/api_server/models/tortoise_models/tasks.py @@ -1,3 +1,5 @@ +from datetime import datetime + from tortoise.contrib.pydantic.creator import pydantic_model_creator from tortoise.fields import ( CharField, @@ -14,12 +16,12 @@ class TaskRequest(Model): id_ = CharField(255, pk=True, source_field="id") - request = JSONField() + request: dict = JSONField() # type: ignore class TaskState(Model): id_ = CharField(255, pk=True, source_field="id") - data = JSONField() + data: dict = JSONField() # type: ignore category = CharField(255, null=True, index=True) assigned_to = CharField(255, null=True, index=True) unix_millis_start_time = DatetimeField(null=True, index=True) @@ -36,47 +38,57 @@ class TaskEventLog(Model): class TaskEventLogLog(Model, LogMixin): - task: ForeignKeyRelation[TaskEventLog] = ForeignKeyField("models.TaskEventLog", related_name="log") # type: ignore + task: ForeignKeyRelation[TaskEventLog] = ForeignKeyField( + "models.TaskEventLog", related_name="log" + ) class Meta: unique_together = ("task", "seq") class TaskEventLogPhases(Model): - task: ForeignKeyRelation[TaskEventLog] = ForeignKeyField("models.TaskEventLog", related_name="phases") # type: ignore + task: ForeignKeyRelation[TaskEventLog] = ForeignKeyField( + "models.TaskEventLog", related_name="phases" + ) phase = CharField(255) log: ReverseRelation["TaskEventLogPhasesLog"] events: ReverseRelation["TaskEventLogPhasesEvents"] class TaskEventLogPhasesLog(Model, LogMixin): - phase: ForeignKeyRelation[TaskEventLogPhases] = ForeignKeyField("models.TaskEventLogPhases", related_name="log") # type: ignore + phase: ForeignKeyRelation[TaskEventLogPhases] = ForeignKeyField( + "models.TaskEventLogPhases", related_name="log" + ) class Meta: unique_together = ("id", "seq") class TaskEventLogPhasesEvents(Model): - phase: ForeignKeyRelation[TaskEventLogPhases] = ForeignKeyField("models.TaskEventLogPhases", related_name="events") # type: ignore + phase: ForeignKeyRelation[TaskEventLogPhases] = ForeignKeyField( + "models.TaskEventLogPhases", related_name="events" + ) event = CharField(255) log: ReverseRelation["TaskEventLogPhasesEventsLog"] class TaskEventLogPhasesEventsLog(Model, LogMixin): - event: ForeignKeyRelation[TaskEventLogPhasesEvents] = ForeignKeyField("models.TaskEventLogPhasesEvents", related_name="log") # type: ignore + event: ForeignKeyRelation[TaskEventLogPhasesEvents] = ForeignKeyField( + "models.TaskEventLogPhasesEvents", related_name="log" + ) class Meta: unique_together = ("id", "seq") class TaskFavorite(Model): - id = CharField(255, pk=True, source_field="id") - name = CharField(255, null=False, index=True) - unix_millis_earliest_start_time = DatetimeField(null=True, index=True) - priority = JSONField(null=True) - category = CharField(255, null=False, index=True) - description = JSONField() - user = CharField(255, null=False, index=True) + id: str = CharField(255, pk=True, source_field="id") # type: ignore + name: str = CharField(255, null=False, index=True) # type: ignore + unix_millis_earliest_start_time: datetime = DatetimeField(null=True, index=True) # type: ignore + priority: dict = JSONField(null=True) # type: ignore + category: str = CharField(255, null=False, index=True) # type: ignore + description: dict = JSONField() # type: ignore + user: str = CharField(255, null=False, index=True) # type: ignore TaskFavoritePydantic = pydantic_model_creator(TaskFavorite) diff --git a/packages/api-server/api_server/models/tortoise_models/user.py b/packages/api-server/api_server/models/tortoise_models/user.py index 3f289f61d..467f35fc0 100644 --- a/packages/api-server/api_server/models/tortoise_models/user.py +++ b/packages/api-server/api_server/models/tortoise_models/user.py @@ -1,5 +1,3 @@ -from typing import cast - from tortoise.fields.data import BooleanField, CharField from tortoise.fields.relational import ManyToManyField, ManyToManyRelation from tortoise.models import Model @@ -8,6 +6,6 @@ class User(Model): - username = CharField(255, pk=True) - is_admin = cast(bool, BooleanField()) + username: str = CharField(255, pk=True) # type: ignore + is_admin: bool = BooleanField() # type: ignore roles: ManyToManyRelation[Role] = ManyToManyField("models.Role") diff --git a/packages/api-server/api_server/repositories/fleets.py b/packages/api-server/api_server/repositories/fleets.py index c3b7f749f..890ec3739 100644 --- a/packages/api-server/api_server/repositories/fleets.py +++ b/packages/api-server/api_server/repositories/fleets.py @@ -1,4 +1,4 @@ -from typing import List, Optional, Sequence, Tuple, cast +from typing import List, Optional, Sequence, Tuple from fastapi import Depends from tortoise.exceptions import IntegrityError @@ -16,8 +16,8 @@ def __init__(self, user: User): self.user = user async def get_all_fleets(self) -> List[FleetState]: - db_states = await ttm.FleetState.all().values_list("data", flat=True) - return [FleetState(**s) for s in db_states] + db_states = await ttm.FleetState.all().values_list("data") + return [FleetState(**s[0]) for s in db_states] async def get_fleet_state(self, name: str) -> Optional[FleetState]: # TODO: enforce with authz @@ -36,17 +36,12 @@ async def get_fleet_log( "unix_millis_time__gte": between[0], "unix_millis_time__lte": between[1], } - result = cast( - Optional[ttm.FleetLog], - await ttm.FleetLog.get_or_none(name=name).prefetch_related( - Prefetch( - "log", - ttm.FleetLogLog.filter(**between_filters), - ), - Prefetch( - "robots__log", ttm.FleetLogRobotsLog.filter(**between_filters) - ), + result = await ttm.FleetLog.get_or_none(name=name).prefetch_related( + Prefetch( + "log", + ttm.FleetLogLog.filter(**between_filters), ), + Prefetch("robots__log", ttm.FleetLogRobotsLog.filter(**between_filters)), ) if result is None: return None diff --git a/packages/api-server/api_server/repositories/rmf.py b/packages/api-server/api_server/repositories/rmf.py index 693715c87..b1b1b77cf 100644 --- a/packages/api-server/api_server/repositories/rmf.py +++ b/packages/api-server/api_server/repositories/rmf.py @@ -1,5 +1,3 @@ -from typing import List, Optional, cast - from fastapi import Depends from api_server.authenticator import user_dep @@ -36,99 +34,97 @@ def _build_filter_params(**queries: dict): filter_params[k] = v return filter_params - async def get_bulding_map(self) -> Optional[BuildingMap]: + async def get_bulding_map(self) -> BuildingMap | None: building_map = await ttm.BuildingMap.first() if building_map is None: return None return BuildingMap(**building_map.data) - async def get_doors(self) -> List[Door]: + async def get_doors(self) -> list[Door]: building_map = await self.get_bulding_map() if building_map is None: return [] return [door for level in building_map.levels for door in level.doors] - async def get_door_state(self, door_name: str) -> Optional[DoorState]: + async def get_door_state(self, door_name: str) -> DoorState | None: door_state = await ttm.DoorState.get_or_none(id_=door_name) if door_state is None: return None return DoorState(**door_state.data) - async def get_door_health(self, door_name: str) -> Optional[DoorHealth]: + async def get_door_health(self, door_name: str) -> DoorHealth | None: door_health = await ttm.DoorHealth.get_or_none(id_=door_name) if door_health is None: return None - return await DoorHealth.from_tortoise(door_health) + return await DoorHealth.from_tortoise_orm(door_health) - async def get_lifts(self) -> List[Lift]: + async def get_lifts(self) -> list[Lift]: building_map = await self.get_bulding_map() if building_map is None: return [] return building_map.lifts - async def get_lift_state(self, lift_name: str) -> Optional[LiftState]: + async def get_lift_state(self, lift_name: str) -> LiftState | None: lift_state = await ttm.LiftState.get_or_none(id_=lift_name) if lift_state is None: return None return LiftState(**lift_state.data) - async def get_lift_health(self, lift_name: str) -> Optional[LiftHealth]: + async def get_lift_health(self, lift_name: str) -> LiftHealth | None: lift_health = await ttm.LiftHealth.get_or_none(id_=lift_name) if lift_health is None: return None - return await LiftHealth.from_tortoise(lift_health) + return await LiftHealth.from_tortoise_orm(lift_health) - async def get_dispensers(self) -> List[Dispenser]: + async def get_dispensers(self) -> list[Dispenser]: states = await ttm.DispenserState.all() return [Dispenser(guid=state.data["guid"]) for state in states] - async def get_dispenser_state(self, guid: str) -> Optional[DispenserState]: + async def get_dispenser_state(self, guid: str) -> DispenserState | None: dispenser_state = await ttm.DispenserState.get_or_none(id_=guid) if dispenser_state is None: return None return DispenserState(**dispenser_state.data) - async def get_dispenser_health(self, guid: str) -> Optional[DispenserHealth]: + async def get_dispenser_health(self, guid: str) -> DispenserHealth | None: dispenser_health = await ttm.DispenserHealth.get_or_none(id_=guid) if dispenser_health is None: return None - return await DispenserHealth.from_tortoise(dispenser_health) + return await DispenserHealth.from_tortoise_orm(dispenser_health) - async def get_ingestors(self) -> List[Ingestor]: + async def get_ingestors(self) -> list[Ingestor]: states = await ttm.IngestorState.all() return [Ingestor(guid=state.data["guid"]) for state in states] - async def get_ingestor_state(self, guid: str) -> Optional[IngestorState]: + async def get_ingestor_state(self, guid: str) -> IngestorState | None: ingestor_state = await ttm.IngestorState.get_or_none(id_=guid) if ingestor_state is None: return None return IngestorState(**ingestor_state.data) - async def get_ingestor_health(self, guid: str) -> Optional[IngestorHealth]: + async def get_ingestor_health(self, guid: str) -> IngestorHealth | None: ingestor_health = await ttm.IngestorHealth.get_or_none(id_=guid) if ingestor_health is None: return None - return await IngestorHealth.from_tortoise(ingestor_health) + return await IngestorHealth.from_tortoise_orm(ingestor_health) async def query_users( self, pagination: Pagination, *, - username: Optional[str] = None, - is_admin: Optional[bool] = None, - ) -> List[str]: + username: str | None = None, + is_admin: bool | None = None, + ) -> tuple[str]: filter_params = {} if username is not None: filter_params["username__istartswith"] = username if is_admin is not None: filter_params["is_admin"] = is_admin - return cast( - List[str], + return ( await add_pagination( - ttm.User.filter(**filter_params), - pagination, - ).values_list("username", flat=True), - ) + ttm.User.filter(**filter_params), pagination + ).values_list("username") + )[0] def rmf_repo_dep(user: User = Depends(user_dep)): diff --git a/packages/api-server/api_server/repositories/tasks.py b/packages/api-server/api_server/repositories/tasks.py index 281a653f2..38c45a5b6 100644 --- a/packages/api-server/api_server/repositories/tasks.py +++ b/packages/api-server/api_server/repositories/tasks.py @@ -1,6 +1,6 @@ import sys from datetime import datetime -from typing import Dict, List, Optional, Sequence, Tuple, cast +from typing import Dict, List, Optional, Sequence, Tuple from fastapi import Depends, HTTPException from tortoise.exceptions import FieldError, IntegrityError @@ -76,8 +76,8 @@ async def query_task_states( if pagination: query = add_pagination(query, pagination) # TODO: enforce with authz - results = await query.values_list("data", flat=True) - return [TaskState(**r) for r in results] + results = await query.values_list("data") + return [TaskState(**r[0]) for r in results] except FieldError as e: raise HTTPException(422, str(e)) from e @@ -98,20 +98,17 @@ async def get_task_log( "unix_millis_time__gte": between[0], "unix_millis_time__lte": between[1], } - result = cast( - Optional[ttm.TaskEventLog], - await ttm.TaskEventLog.get_or_none(task_id=task_id).prefetch_related( - Prefetch( - "log", - ttm.TaskEventLogLog.filter(**between_filters), - ), - Prefetch( - "phases__log", ttm.TaskEventLogPhasesLog.filter(**between_filters) - ), - Prefetch( - "phases__events__log", - ttm.TaskEventLogPhasesEventsLog.filter(**between_filters), - ), + result = await ttm.TaskEventLog.get_or_none(task_id=task_id).prefetch_related( + Prefetch( + "log", + ttm.TaskEventLogLog.filter(**between_filters), + ), + Prefetch( + "phases__log", ttm.TaskEventLogPhasesLog.filter(**between_filters) + ), + Prefetch( + "phases__events__log", + ttm.TaskEventLogPhasesEventsLog.filter(**between_filters), ), ) if result is None: diff --git a/packages/api-server/api_server/rmf_io/book_keeper.py b/packages/api-server/api_server/rmf_io/book_keeper.py index 687156d08..b6afcc912 100644 --- a/packages/api-server/api_server/rmf_io/book_keeper.py +++ b/packages/api-server/api_server/rmf_io/book_keeper.py @@ -4,10 +4,11 @@ from collections import namedtuple from typing import Coroutine, List, Optional -from rx.core.typing import Disposable -from rx.subject.subject import Subject +from reactivex.abc import DisposableBase +from reactivex.subject import Subject from api_server.models import ( + BasicHealth, BuildingMap, DispenserHealth, DispenserState, @@ -19,7 +20,7 @@ LiftHealth, LiftState, ) -from api_server.models.health import BaseBasicHealth +from api_server.models import tortoise_models as ttm from .events import RmfEvents @@ -87,7 +88,7 @@ def __init__( self._loggers.robot_health.parent = self._main_logger self._loggers.task_summary.parent = self._main_logger - self._subscriptions: List[Disposable] = [] + self._subscriptions: List[DisposableBase] = [] async def start(self): self._loop = asyncio.get_event_loop() @@ -114,7 +115,7 @@ def _create_task(self, coro: Coroutine): self._pending_tasks.add(task) @staticmethod - def _report_health(health: BaseBasicHealth, logger: logging.Logger): + def _report_health(health: BasicHealth, logger: logging.Logger): message = health.json() if health.health_status == HealthStatus.UNHEALTHY: logger.warning(message) @@ -124,7 +125,7 @@ def _report_health(health: BaseBasicHealth, logger: logging.Logger): logger.info(message) def _record_building_map(self): - async def update(building_map: BuildingMap): + async def update(building_map: BuildingMap | None): if not building_map: return await building_map.save() @@ -145,7 +146,9 @@ async def update(door_state: DoorState): def _record_door_health(self): async def update(health: DoorHealth): - await health.save() + await ttm.DoorHealth.update_or_create( + health.dict(exclude={"id_"}), id_=health.id_ + ) self._report_health(health, self._loggers.door_health) self._subscriptions.append( @@ -163,7 +166,9 @@ async def update(lift_state: LiftState): def _record_lift_health(self): async def update(health: LiftHealth): - await health.save() + await ttm.LiftHealth.update_or_create( + health.dict(exclude={"id_"}), id_=health.id_ + ) self._report_health(health, self._loggers.lift_health) self._subscriptions.append( @@ -181,7 +186,9 @@ async def update(dispenser_state: DispenserState): def _record_dispenser_health(self): async def update(health: DispenserHealth): - await health.save() + await ttm.DispenserHealth.update_or_create( + health.dict(exclude={"id_"}), id_=health.id_ + ) self._report_health(health, self._loggers.dispenser_health) self._subscriptions.append( @@ -199,7 +206,9 @@ async def update(ingestor_state: IngestorState): def _record_ingestor_health(self): async def update(health: IngestorHealth): - await health.save() + await ttm.IngestorHealth.update_or_create( + health.dict(exclude={"id_"}), id_=health.id_ + ) self._report_health(health, self._loggers.ingestor_health) self._subscriptions.append( diff --git a/packages/api-server/api_server/rmf_io/events.py b/packages/api-server/api_server/rmf_io/events.py index 7b54087a5..644e30520 100644 --- a/packages/api-server/api_server/rmf_io/events.py +++ b/packages/api-server/api_server/rmf_io/events.py @@ -1,21 +1,22 @@ -from rx.subject.behaviorsubject import BehaviorSubject -from rx.subject.subject import Subject +from reactivex.subject import BehaviorSubject, Subject +from tortoise.contrib.pydantic.base import PydanticModel + +from api_server import models as mdl class RmfEvents: def __init__(self): - # NOTE: the rx type hints don't actually work https://github.com/ReactiveX/RxPY/issues/514 - self.door_states = Subject() # DoorState - self.door_health = Subject() # DoorHealth - self.lift_states = Subject() # LiftState - self.lift_health = Subject() # LiftHealth - self.dispenser_states = Subject() # DispenserState - self.dispenser_health = Subject() # DispenserHealth - self.ingestor_states = Subject() # IngestorState - self.ingestor_health = Subject() # IngestorHealth - self.fleet_states = Subject() # FleetState - self.robot_health = Subject() # RobotHealth - self.building_map = BehaviorSubject(None) # Optional[BuildingMap] + self.door_states = Subject[mdl.DoorState]() + self.door_health = Subject[mdl.DoorHealth]() + self.lift_states = Subject[mdl.LiftState]() + self.lift_health = Subject[mdl.LiftHealth]() + self.dispenser_states = Subject[mdl.DispenserState]() + self.dispenser_health = Subject[mdl.DispenserHealth]() + self.ingestor_states = Subject[mdl.IngestorState]() + self.ingestor_health = Subject[mdl.IngestorHealth]() + self.fleet_states = Subject[mdl.FleetState]() + self.robot_health = Subject[mdl.RobotHealth]() + self.building_map = BehaviorSubject[mdl.BuildingMap | None](None) rmf_events = RmfEvents() @@ -23,8 +24,8 @@ def __init__(self): class TaskEvents: def __init__(self): - self.task_states = Subject() # TaskState - self.task_event_logs = Subject() # TaskEventLog + self.task_states = Subject[mdl.TaskState]() + self.task_event_logs = Subject[mdl.TaskEventLog]() task_events = TaskEvents() @@ -32,8 +33,8 @@ def __init__(self): class FleetEvents: def __init__(self): - self.fleet_states = Subject() # FleetState - self.fleet_logs = Subject() # FleetLog + self.fleet_states = Subject[mdl.FleetState]() + self.fleet_logs = Subject[mdl.FleetLog]() fleet_events = FleetEvents() @@ -41,7 +42,7 @@ def __init__(self): class AlertEvents: def __init__(self): - self.alerts = Subject() # Alert + self.alerts = Subject[PydanticModel]() alert_events = AlertEvents() @@ -49,7 +50,7 @@ def __init__(self): class BeaconEvents: def __init__(self): - self.beacons = Subject() # Beacons + self.beacons = Subject[PydanticModel]() beacon_events = BeaconEvents() diff --git a/packages/api-server/api_server/rmf_io/health_watchdog.py b/packages/api-server/api_server/rmf_io/health_watchdog.py index ea5dda346..fd8bc0b1a 100644 --- a/packages/api-server/api_server/rmf_io/health_watchdog.py +++ b/packages/api-server/api_server/rmf_io/health_watchdog.py @@ -1,19 +1,18 @@ import logging -from typing import Any, Dict, List, Optional, cast +from typing import Any, Callable, Dict, Optional, TypeVar, cast +from reactivex import Observable, compose +from reactivex import operators as ops +from reactivex.scheduler.scheduler import Scheduler +from reactivex.subject.behaviorsubject import BehaviorSubject from rmf_dispenser_msgs.msg import DispenserState as RmfDispenserState from rmf_door_msgs.msg import DoorMode as RmfDoorMode from rmf_ingestor_msgs.msg import IngestorState as RmfIngestorState from rmf_lift_msgs.msg import LiftState as RmfLiftState -from rx import operators as ops -from rx.core.observable.observable import Observable -from rx.core.pipe import pipe -from rx.core.typing import Disposable -from rx.scheduler.scheduler import Scheduler -from rx.subject.behaviorsubject import BehaviorSubject from tortoise.exceptions import MultipleObjectsReturned from api_server.models import ( + BasicHealth, BuildingMap, Dispenser, DispenserHealth, @@ -30,7 +29,9 @@ from api_server.models import tortoise_models as ttm from .events import RmfEvents -from .operators import heartbeat, most_critical +from .operators import filter_not_none, heartbeat, most_critical + +T = TypeVar("T", bound=BasicHealth) class HealthWatchdog: @@ -46,7 +47,6 @@ def __init__( self.rmf = rmf_events self.scheduler = scheduler self.logger = logger or logging.getLogger(self.__class__.__name__) - self._building_watchers: List[Disposable] = [] async def start(self): await self._watch_door_health() @@ -55,19 +55,20 @@ async def start(self): await self._watch_ingestor_health() @staticmethod - def _combine_most_critical(*obs: Observable): + def _combine_most_critical( + *obs: Observable[T | None], + ) -> Callable[[Observable[T]], Observable[T]]: """ Combines an observable sequence of an observable sequence of BasicHealthModel to an observable sequence of BasicHealthModel with the most critical health status. If there are multiple BasicHealthModel with the same criticality, the most recent item is chosen. - - :param obs: Sequence[rx.Observable[BasicHealthModel]] """ - return pipe( + return compose( ops.timestamp(), - ops.combine_latest(*[x.pipe(ops.timestamp()) for x in obs]), + cast(Any, ops.combine_latest(*[x.pipe(ops.timestamp()) for x in obs])), most_critical(), + filter_not_none, ) @staticmethod @@ -111,14 +112,12 @@ def to_door_health(id_: str, has_heartbeat: bool): def watch(id_: str, obs: Observable): door_mode_health = obs.pipe( - ops.map(cast(Any, self.door_mode_to_health)), + ops.map(self.door_mode_to_health), ops.distinct_until_changed(), ) obs.pipe( heartbeat(self.LIVELINESS), - ops.map( - cast(Any, lambda has_heartbeat: to_door_health(id_, has_heartbeat)) - ), + ops.map(lambda has_heartbeat: to_door_health(id_, has_heartbeat)), self._combine_most_critical(door_mode_health), ).subscribe(self.rmf.door_health.on_next, scheduler=self.scheduler) @@ -207,14 +206,12 @@ def to_lift_health(id_: str, has_heartbeat: bool): def watch(id_: str, obs: Observable): lift_mode_health = obs.pipe( - ops.map(cast(Any, self.lift_mode_to_health)), + ops.map(self.lift_mode_to_health), ops.distinct_until_changed(), ) obs.pipe( heartbeat(self.LIVELINESS), - ops.map( - cast(Any, lambda has_heartbeat: to_lift_health(id_, has_heartbeat)) - ), + ops.map(lambda has_heartbeat: to_lift_health(id_, has_heartbeat)), self._combine_most_critical(lift_mode_health), ).subscribe(self.rmf.lift_health.on_next, scheduler=self.scheduler) @@ -282,16 +279,13 @@ def to_dispenser_health(id_: str, has_heartbeat: bool): def watch(id_: str, obs: Observable): dispenser_mode_health = obs.pipe( - ops.map(cast(Any, self.dispenser_mode_to_health)), + ops.map(self.dispenser_mode_to_health), ops.distinct_until_changed(), ) obs.pipe( heartbeat(self.LIVELINESS), ops.map( - cast( - Any, - lambda has_heartbeat: to_dispenser_health(id_, has_heartbeat), - ) + lambda has_heartbeat: to_dispenser_health(id_, has_heartbeat), ), self._combine_most_critical(dispenser_mode_health), ).subscribe(self.rmf.dispenser_health.on_next, scheduler=self.scheduler) @@ -356,16 +350,13 @@ def to_ingestor_health(id_: str, has_heartbeat: bool): def watch(id_: str, obs: Observable): ingestor_mode_health = obs.pipe( - ops.map(cast(Any, self.ingestor_mode_to_health)), + ops.map(self.ingestor_mode_to_health), ops.distinct_until_changed(), ) obs.pipe( heartbeat(self.LIVELINESS), ops.map( - cast( - Any, - lambda has_heartbeat: to_ingestor_health(id_, has_heartbeat), - ) + lambda has_heartbeat: to_ingestor_health(id_, has_heartbeat), ), self._combine_most_critical(ingestor_mode_health), ).subscribe(self.rmf.ingestor_health.on_next, scheduler=self.scheduler) diff --git a/packages/api-server/api_server/rmf_io/operators/__init__.py b/packages/api-server/api_server/rmf_io/operators/__init__.py index d97957376..5005960c1 100644 --- a/packages/api-server/api_server/rmf_io/operators/__init__.py +++ b/packages/api-server/api_server/rmf_io/operators/__init__.py @@ -1,3 +1,4 @@ +from .filter_not_none import filter_not_none from .grouped_sample import grouped_sample from .health import most_critical from .heartbeat import heartbeat diff --git a/packages/api-server/api_server/rmf_io/operators/filter_not_none.py b/packages/api-server/api_server/rmf_io/operators/filter_not_none.py new file mode 100644 index 000000000..64fda4289 --- /dev/null +++ b/packages/api-server/api_server/rmf_io/operators/filter_not_none.py @@ -0,0 +1,10 @@ +from typing import TypeVar + +from reactivex import Observable +from reactivex import operators as ops + +T = TypeVar("T") + + +def filter_not_none(src: Observable[T | None]) -> Observable[T]: + return src.pipe(ops.filter(lambda x: x is not None)) # type: ignore diff --git a/packages/api-server/api_server/rmf_io/operators/grouped_sample.py b/packages/api-server/api_server/rmf_io/operators/grouped_sample.py index 1b4b53c80..33ad0582c 100644 --- a/packages/api-server/api_server/rmf_io/operators/grouped_sample.py +++ b/packages/api-server/api_server/rmf_io/operators/grouped_sample.py @@ -1,9 +1,8 @@ from datetime import timedelta -from typing import Any, Callable, TypeVar, Union, cast +from typing import Any, Callable, TypeVar, Union -from rx import operators as ops -from rx.core.observable.observable import Observable -from rx.core.pipe import pipe +from reactivex import Observable, compose +from reactivex import operators as ops T = TypeVar("T") @@ -17,9 +16,7 @@ def grouped_sample( "key_mapper" function, maps the resulting observable sequences with the "sample" operator and flatten it into a single observable sequence. """ - return pipe( - ops.group_by(cast(Any, key_mapper)), - ops.flat_map( - cast(Any, lambda x: (cast(Observable, x).pipe(ops.sample(sampler)))) - ), + return compose( + ops.group_by(key_mapper), + ops.flat_map(lambda x: x.pipe(ops.sample(sampler))), # type: ignore ) diff --git a/packages/api-server/api_server/rmf_io/operators/health.py b/packages/api-server/api_server/rmf_io/operators/health.py index 931b97eac..6a94a23a3 100644 --- a/packages/api-server/api_server/rmf_io/operators/health.py +++ b/packages/api-server/api_server/rmf_io/operators/health.py @@ -1,13 +1,17 @@ -from typing import Any, Sequence, cast +from typing import Callable, Sequence, TypeVar -from rx import operators as ops -from rx.core.operators.timestamp import Timestamp -from rx.core.pipe import pipe +from reactivex import Observable +from reactivex import operators as ops +from reactivex.operators._timestamp import Timestamp -from api_server.models import HealthStatus +from api_server.models import BasicHealth, HealthStatus +T = TypeVar("T", bound=BasicHealth) -def most_critical(): + +def most_critical() -> ( + Callable[[Observable[Sequence[Timestamp[T]]]], Observable[T | None]] +): """ Maps an observable sequence of a sequence of timestamp of BasicHealthModel to an observable sequence of BasicHealthModel with the most critical health status. If there @@ -27,7 +31,7 @@ def criticality(health_status: HealthStatus): return 2 raise Exception("unknown health status") - def get_most_critical(health_statuses: Sequence[Timestamp]): + def get_most_critical(health_statuses): """ :param health_status: Sequence[Timestamp[HealthStatus]] """ @@ -45,4 +49,4 @@ def get_most_critical(health_statuses: Sequence[Timestamp]): most_crit = health return most_crit.value - return pipe(ops.map(cast(Any, get_most_critical))) + return ops.map(get_most_critical) diff --git a/packages/api-server/api_server/rmf_io/operators/heartbeat.py b/packages/api-server/api_server/rmf_io/operators/heartbeat.py index 9548287dc..4fd4c8d6b 100644 --- a/packages/api-server/api_server/rmf_io/operators/heartbeat.py +++ b/packages/api-server/api_server/rmf_io/operators/heartbeat.py @@ -1,12 +1,11 @@ -from typing import Any, Callable, cast +from typing import Callable -from rx.core.observable.observable import Observable -from rx.core.pipe import pipe -from rx.operators import buffer_with_time_or_count, distinct_until_changed -from rx.operators import map as rx_map +from reactivex import Observable, compose +from reactivex.operators import buffer_with_time_or_count, distinct_until_changed +from reactivex.operators import map as rx_map -def heartbeat(liveliness) -> Callable[[Observable], Observable]: +def heartbeat(liveliness) -> Callable[[Observable], Observable[bool]]: """ Projects a source observable sequence to a boolean. The resulting value is True when there is an observable emitted within the liveliness factor and False otherwise. @@ -15,8 +14,8 @@ def heartbeat(liveliness) -> Callable[[Observable], Observable]: considered alive. Note that an observable may stay alive for up to 2x liveliness between each event as this operator checks for items emitted between this window. """ - return pipe( + return compose( buffer_with_time_or_count(liveliness, 1), - rx_map(cast(Any, lambda items: len(items) > 0)), + rx_map(lambda items: len(items) > 0), distinct_until_changed(), ) diff --git a/packages/api-server/api_server/rmf_io/operators/test_grouped_sample.py b/packages/api-server/api_server/rmf_io/operators/test_grouped_sample.py index 56892159f..ce0314a4d 100644 --- a/packages/api-server/api_server/rmf_io/operators/test_grouped_sample.py +++ b/packages/api-server/api_server/rmf_io/operators/test_grouped_sample.py @@ -1,7 +1,7 @@ import unittest -from rx.scheduler.historicalscheduler import HistoricalScheduler -from rx.subject.subject import Subject +from reactivex import Subject +from reactivex.scheduler.historicalscheduler import HistoricalScheduler from .grouped_sample import grouped_sample diff --git a/packages/api-server/api_server/rmf_io/operators/test_health.py b/packages/api-server/api_server/rmf_io/operators/test_health.py index 740600e58..c441d6b0b 100644 --- a/packages/api-server/api_server/rmf_io/operators/test_health.py +++ b/packages/api-server/api_server/rmf_io/operators/test_health.py @@ -1,22 +1,18 @@ import unittest from datetime import datetime -from typing import Optional, cast +from typing import Any, Optional, cast -import rx -from rx import operators as ops -from rx.scheduler.historicalscheduler import HistoricalScheduler - -from api_server.models import BaseBasicHealth, HealthStatus +import reactivex as rx +from reactivex import operators as ops +from reactivex.scheduler.historicalscheduler import HistoricalScheduler +from ...models import BasicHealth, HealthStatus from .health import most_critical -class TestHealth(BaseBasicHealth): +class TestHealth(BasicHealth): @staticmethod - async def from_tortoise(_tortoise): - raise NotImplementedError() - - async def save(self): + async def from_tortoise_orm(_tortoise): raise NotImplementedError() @@ -35,13 +31,15 @@ def test_returns_dead_over_unhealthy(self): ops.timestamp(scheduler=HistoricalScheduler(datetime.fromtimestamp(2))) ) - result: Optional[TestHealth] = None + result: TestHealth | None = None def assign(v): nonlocal result result = v - obs_a.pipe(ops.combine_latest(obs_b), most_critical()).subscribe(assign) + obs_a.pipe(cast(Any, ops.combine_latest(obs_b)), most_critical()).subscribe( + assign + ) self.assertIsNotNone(result) result = cast(TestHealth, result) self.assertEqual(result.health_status, HealthStatus.DEAD) @@ -72,7 +70,9 @@ def assign(v): nonlocal result result = v - obs_a.pipe(ops.combine_latest(obs_b), most_critical()).subscribe(assign) + obs_a.pipe(cast(Any, ops.combine_latest(obs_b)), most_critical()).subscribe( + assign + ) self.assertIsNotNone(result) result = cast(TestHealth, result) self.assertEqual(result.health_status, HealthStatus.DEAD) @@ -98,7 +98,9 @@ def assign(v): nonlocal result result = v - obs_a.pipe(ops.combine_latest(obs_b), most_critical()).subscribe(assign) + obs_a.pipe(cast(Any, ops.combine_latest(obs_b)), most_critical()).subscribe( + assign + ) self.assertIsNotNone(result) result = cast(TestHealth, result) self.assertEqual(result.health_status, HealthStatus.HEALTHY) diff --git a/packages/api-server/api_server/routes/admin.py b/packages/api-server/api_server/routes/admin.py index 38a5d5fbc..ad7600390 100644 --- a/packages/api-server/api_server/routes/admin.py +++ b/packages/api-server/api_server/routes/admin.py @@ -47,7 +47,7 @@ def admin_dep(user: User = Depends(user_dep)): router = APIRouter(tags=["Admin"], dependencies=[Depends(admin_dep)]) -@router.get("/users", response_model=List[str]) +@router.get("/users", response_model=tuple[str]) async def get_users( rmf_repo: RmfRepository = Depends(rmf_repo_dep), pagination: Pagination = Depends(pagination_query), diff --git a/packages/api-server/api_server/routes/alerts.py b/packages/api-server/api_server/routes/alerts.py index 5d6e329d6..39a861065 100644 --- a/packages/api-server/api_server/routes/alerts.py +++ b/packages/api-server/api_server/routes/alerts.py @@ -1,7 +1,7 @@ from typing import List from fastapi import Depends, HTTPException -from rx import operators as rxops +from reactivex import operators as rxops from api_server.fast_io import FastIORouter, SubscriptionRequest from api_server.models import tortoise_models as ttm diff --git a/packages/api-server/api_server/routes/beacons.py b/packages/api-server/api_server/routes/beacons.py index ada6bb552..c10e265f2 100644 --- a/packages/api-server/api_server/routes/beacons.py +++ b/packages/api-server/api_server/routes/beacons.py @@ -1,7 +1,7 @@ from typing import List from fastapi import HTTPException -from rx import operators as rxops +from reactivex import operators as rxops from api_server.fast_io import FastIORouter, SubscriptionRequest from api_server.models import tortoise_models as ttm diff --git a/packages/api-server/api_server/routes/building_map.py b/packages/api-server/api_server/routes/building_map.py index 4315ef164..fa084d3b8 100644 --- a/packages/api-server/api_server/routes/building_map.py +++ b/packages/api-server/api_server/routes/building_map.py @@ -1,5 +1,5 @@ from fastapi import Depends, HTTPException -from rx import operators as rxops +from reactivex import operators as rxops from api_server.fast_io import FastIORouter, SubscriptionRequest from api_server.models import BuildingMap diff --git a/packages/api-server/api_server/routes/dispensers.py b/packages/api-server/api_server/routes/dispensers.py index 1d0f399ac..ce52e4c34 100644 --- a/packages/api-server/api_server/routes/dispensers.py +++ b/packages/api-server/api_server/routes/dispensers.py @@ -1,7 +1,7 @@ -from typing import List, cast +from typing import List from fastapi import Depends, HTTPException -from rx import operators as rxops +from reactivex import operators as rxops from api_server.dependencies import sio_user from api_server.fast_io import FastIORouter, SubscriptionRequest @@ -33,9 +33,7 @@ async def get_dispenser_state( @router.sub("/{guid}/state", response_model=DispenserState) async def sub_dispenser_state(req: SubscriptionRequest, guid: str): user = sio_user(req) - obs = rmf_events.dispenser_states.pipe( - rxops.filter(lambda x: cast(DispenserState, x).guid == guid) - ) + obs = rmf_events.dispenser_states.pipe(rxops.filter(lambda x: x.guid == guid)) dispenser_state = await get_dispenser_state(guid, RmfRepository(user)) if dispenser_state: return obs.pipe(rxops.start_with(dispenser_state)) @@ -58,9 +56,7 @@ async def get_dispenser_health( @router.sub("/{guid}/health", response_model=DispenserHealth) async def sub_dispenser_health(req: SubscriptionRequest, guid: str): user = sio_user(req) - obs = rmf_events.dispenser_health.pipe( - rxops.filter(lambda x: cast(DispenserHealth, x).id_ == guid) - ) + obs = rmf_events.dispenser_health.pipe(rxops.filter(lambda x: x.id_ == guid)) health = await get_dispenser_health(guid, RmfRepository(user)) if health: return obs.pipe(rxops.start_with(health)) diff --git a/packages/api-server/api_server/routes/doors.py b/packages/api-server/api_server/routes/doors.py index d191abbd5..29c94471d 100644 --- a/packages/api-server/api_server/routes/doors.py +++ b/packages/api-server/api_server/routes/doors.py @@ -1,7 +1,7 @@ -from typing import List, cast +from typing import List from fastapi import Depends, HTTPException -from rx import operators as rxops +from reactivex import operators as rxops from api_server.dependencies import sio_user from api_server.fast_io import FastIORouter, SubscriptionRequest @@ -34,9 +34,7 @@ async def get_door_state( @router.sub("/{door_name}/state", response_model=DoorState) async def sub_door_state(req: SubscriptionRequest, door_name: str): user = sio_user(req) - obs = rmf_events.door_states.pipe( - rxops.filter(lambda x: cast(DoorState, x).door_name == door_name) - ) + obs = rmf_events.door_states.pipe(rxops.filter(lambda x: x.door_name == door_name)) door_state = await get_door_state(door_name, RmfRepository(user)) if door_state: return obs.pipe(rxops.start_with(door_state)) @@ -59,9 +57,7 @@ async def get_door_health( @router.sub("/{door_name}/health", response_model=DoorHealth) async def sub_door_health(req: SubscriptionRequest, door_name: str): user = sio_user(req) - obs = rmf_events.door_health.pipe( - rxops.filter(lambda x: cast(DoorHealth, x).id_ == door_name) - ) + obs = rmf_events.door_health.pipe(rxops.filter(lambda x: x.id_ == door_name)) health = await get_door_health(door_name, RmfRepository(user)) if health: return obs.pipe(rxops.start_with(health)) diff --git a/packages/api-server/api_server/routes/fleets.py b/packages/api-server/api_server/routes/fleets.py index 1a818d7ad..11eebff1f 100644 --- a/packages/api-server/api_server/routes/fleets.py +++ b/packages/api-server/api_server/routes/fleets.py @@ -1,7 +1,7 @@ -from typing import List, Tuple, cast +from typing import List, Tuple from fastapi import Depends, HTTPException -from rx import operators as rxops +from reactivex import operators as rxops from api_server.dependencies import between_query, sio_user from api_server.fast_io import FastIORouter, SubscriptionRequest @@ -34,9 +34,7 @@ async def get_fleet_state(name: str, repo: FleetRepository = Depends(fleet_repo_ async def sub_fleet_state(req: SubscriptionRequest, name: str): user = sio_user(req) repo = FleetRepository(user) - obs = fleet_events.fleet_states.pipe( - rxops.filter(lambda x: cast(FleetState, x).name == name) - ) + obs = fleet_events.fleet_states.pipe(rxops.filter(lambda x: x.name == name)) fleet_state = await repo.get_fleet_state(name) if fleet_state: return obs.pipe(rxops.start_with(fleet_state)) @@ -60,6 +58,4 @@ async def get_fleet_log( @router.sub("/{name}/log", response_model=FleetLog) async def sub_fleet_log(_req: SubscriptionRequest, name: str): - return fleet_events.fleet_logs.pipe( - rxops.filter(lambda x: cast(FleetLog, x).name == name) - ) + return fleet_events.fleet_logs.pipe(rxops.filter(lambda x: x.name == name)) diff --git a/packages/api-server/api_server/routes/ingestors.py b/packages/api-server/api_server/routes/ingestors.py index 003fade4c..353db8757 100644 --- a/packages/api-server/api_server/routes/ingestors.py +++ b/packages/api-server/api_server/routes/ingestors.py @@ -1,7 +1,7 @@ -from typing import List, cast +from typing import List from fastapi import Depends, HTTPException -from rx import operators as rxops +from reactivex import operators as rxops from api_server.dependencies import sio_user from api_server.fast_io import FastIORouter, SubscriptionRequest @@ -33,9 +33,7 @@ async def get_ingestor_state( @router.sub("/{guid}/state", response_model=IngestorState) async def sub_ingestor_state(req: SubscriptionRequest, guid: str): user = sio_user(req) - obs = rmf_events.ingestor_states.pipe( - rxops.filter(lambda x: cast(IngestorState, x).guid == guid) - ) + obs = rmf_events.ingestor_states.pipe(rxops.filter(lambda x: x.guid == guid)) ingestor_state = await get_ingestor_state(guid, RmfRepository(user)) if ingestor_state: return obs.pipe(rxops.start_with(ingestor_state)) @@ -58,9 +56,7 @@ async def get_ingestor_health( @router.sub("/{guid}/health", response_model=IngestorHealth) async def sub_ingestor_health(req: SubscriptionRequest, guid: str): user = sio_user(req) - obs = rmf_events.ingestor_health.pipe( - rxops.filter(lambda x: cast(IngestorHealth, x).id_ == guid) - ) + obs = rmf_events.ingestor_health.pipe(rxops.filter(lambda x: x.id_ == guid)) health = await get_ingestor_health(guid, RmfRepository(user)) if health: return obs.pipe(rxops.start_with(health)) diff --git a/packages/api-server/api_server/routes/lifts.py b/packages/api-server/api_server/routes/lifts.py index 36c6f5343..364179bac 100644 --- a/packages/api-server/api_server/routes/lifts.py +++ b/packages/api-server/api_server/routes/lifts.py @@ -1,7 +1,7 @@ -from typing import List, cast +from typing import List from fastapi import Depends, HTTPException -from rx import operators as rxops +from reactivex import operators as rxops from api_server.dependencies import sio_user from api_server.fast_io import FastIORouter, SubscriptionRequest @@ -34,9 +34,7 @@ async def get_lift_state( @router.sub("/{lift_name}/state", response_model=LiftState) async def sub_lift_state(req: SubscriptionRequest, lift_name: str): user = sio_user(req) - obs = rmf_events.lift_states.pipe( - rxops.filter(lambda x: cast(LiftState, x).lift_name == lift_name) - ) + obs = rmf_events.lift_states.pipe(rxops.filter(lambda x: x.lift_name == lift_name)) lift_state = await get_lift_state(lift_name, RmfRepository(user)) if lift_state: return obs.pipe(rxops.start_with(lift_state)) @@ -59,9 +57,7 @@ async def get_lift_health( @router.sub("/{lift_name}/health", response_model=LiftHealth) async def sub_lift_health(req: SubscriptionRequest, lift_name: str): user = sio_user(req) - obs = rmf_events.lift_health.pipe( - rxops.filter(lambda x: cast(LiftHealth, x).id_ == lift_name) - ) + obs = rmf_events.lift_health.pipe(rxops.filter(lambda x: x.id_ == lift_name)) health = await get_lift_health(lift_name, RmfRepository(user)) if health: return obs.pipe(rxops.start_with(health)) diff --git a/packages/api-server/api_server/routes/tasks/favorite_tasks.py b/packages/api-server/api_server/routes/tasks/favorite_tasks.py index d3dcabef5..b7b18ab47 100644 --- a/packages/api-server/api_server/routes/tasks/favorite_tasks.py +++ b/packages/api-server/api_server/routes/tasks/favorite_tasks.py @@ -24,7 +24,7 @@ class TaskFavoritePydantic(BaseModel): user: str -@router.post("", response_model=ttm.TaskFavoritePydantic) +@router.post("", response_model=None) async def post_favorite_task( request: TaskFavoritePydantic, user: User = Depends(user_dep), diff --git a/packages/api-server/api_server/routes/tasks/tasks.py b/packages/api-server/api_server/routes/tasks/tasks.py index a8636ef45..69db27602 100644 --- a/packages/api-server/api_server/routes/tasks/tasks.py +++ b/packages/api-server/api_server/routes/tasks/tasks.py @@ -2,7 +2,7 @@ from typing import List, Optional, Tuple, cast from fastapi import Body, Depends, HTTPException, Path, Query -from rx import operators as rxops +from reactivex import operators as rxops from api_server import models as mdl from api_server.dependencies import ( @@ -95,9 +95,7 @@ async def get_task_state( async def sub_task_state(req: SubscriptionRequest, task_id: str): user = sio_user(req) task_repo = TaskRepository(user) - obs = task_events.task_states.pipe( - rxops.filter(lambda x: cast(mdl.TaskState, x).booking.id == task_id) - ) + obs = task_events.task_states.pipe(rxops.filter(lambda x: x.booking.id == task_id)) current_state = await get_task_state(task_repo, task_id) if current_state: return obs.pipe(rxops.start_with(current_state)) @@ -123,7 +121,7 @@ async def get_task_log( @router.sub("/{task_id}/log", response_model=mdl.TaskEventLog) async def sub_task_log(_req: SubscriptionRequest, task_id: str): return task_events.task_event_logs.pipe( - rxops.filter(lambda x: cast(mdl.TaskEventLog, x).task_id == task_id) + rxops.filter(lambda x: x.task_id == task_id) ) diff --git a/packages/api-server/api_server/routes/tasks/test_tasks.py b/packages/api-server/api_server/routes/tasks/test_tasks.py index 5dee13e0a..d5d4549b2 100644 --- a/packages/api-server/api_server/routes/tasks/test_tasks.py +++ b/packages/api-server/api_server/routes/tasks/test_tasks.py @@ -1,8 +1,12 @@ +import asyncio +from typing import cast from unittest.mock import patch from uuid import uuid4 from api_server import models as mdl -from api_server.rmf_io import tasks_service +from api_server.models import TaskEventLog, TaskState +from api_server.repositories import TaskRepository +from api_server.rmf_io import task_events, tasks_service from api_server.test import AppFixture, make_task_log, make_task_state @@ -14,15 +18,11 @@ def setUpClass(cls): cls.task_states = [make_task_state(task_id=f"test_{x}") for x in task_ids] cls.task_logs = [make_task_log(task_id=f"test_{x}") for x in task_ids] - with cls.client.websocket_connect("/_internal") as ws: - for x in cls.task_states: - ws.send_text( - mdl.TaskStateUpdate(type="task_state_update", data=x).json() - ) - for x in cls.task_logs: - ws.send_text( - mdl.TaskEventLogUpdate(type="task_log_update", data=x).json() - ) + repo = TaskRepository(cls.admin_user) + for x in cls.task_states: + asyncio.run(repo.save_task_state(x)) + for x in cls.task_logs: + asyncio.run(repo.save_task_log(x)) def test_get_task_state(self): resp = self.client.get(f"/tasks/{self.task_states[0].booking.id}/state") @@ -42,14 +42,9 @@ def test_query_task_states(self): def test_sub_task_state(self): task_id = self.task_states[0].booking.id gen = self.subscribe_sio(f"/tasks/{task_id}/state") - with self.client.websocket_connect("/_internal") as ws: - ws.send_text( - mdl.TaskStateUpdate( - type="task_state_update", data=self.task_states[0] - ).json() - ) + task_events.task_states.on_next(self.task_states[0]) state = next(gen) - self.assertEqual(task_id, state.booking.id) # type: ignore + self.assertEqual(task_id, cast(TaskState, state).booking.id) def test_get_task_log(self): resp = self.client.get( @@ -129,15 +124,15 @@ def test_sub_task_log(self): ).json() ) log = next(gen) - self.assertEqual(task_id, log.task_id) # type: ignore + self.assertEqual(task_id, cast(TaskEventLog, log).task_id) def test_activity_discovery(self): with patch.object(tasks_service(), "call") as mock: mock.return_value = "{}" resp = self.client.post( "/tasks/activity_discovery", - data=mdl.ActivityDiscoveryRequest( - type="activitiy_discovery_request" + content=mdl.ActivityDiscoveryRequest( + type="activitiy_discovery_request", ).json(exclude_none=True), ) self.assertEqual(200, resp.status_code, resp.content) @@ -147,7 +142,7 @@ def test_cancel_task(self): mock.return_value = '{ "success": true }' resp = self.client.post( "/tasks/activity_discovery", - data=mdl.ActivityDiscoveryRequest( + content=mdl.ActivityDiscoveryRequest( type="activitiy_discovery_request" ).json(exclude_none=True), ) @@ -158,8 +153,8 @@ def test_interrupt_task(self): mock.return_value = '{ "success": True, "token": "token" }' resp = self.client.post( "/tasks/interrupt_task", - data=mdl.TaskInterruptionRequest( # type: ignore - type="interrupt_task_request", task_id="task_id" + content=mdl.TaskInterruptionRequest( + type="interrupt_task_request", task_id="task_id", labels=None ).json(exclude_none=True), ) self.assertEqual(200, resp.status_code, resp.content) @@ -169,8 +164,8 @@ def test_kill_task(self): mock.return_value = '{ "success": true }' resp = self.client.post( "/tasks/kill_task", - data=mdl.TaskKillRequest( # type: ignore - type="kill_task_request", task_id="task_id" + content=mdl.TaskKillRequest( + type="kill_task_request", task_id="task_id", labels=None ).json(exclude_none=True), ) self.assertEqual(200, resp.status_code, resp.content) @@ -180,7 +175,9 @@ def test_resume_task(self): mock.return_value = '{ "success": true }' resp = self.client.post( "/tasks/resume_task", - data=mdl.TaskResumeRequest().json(exclude_none=True), # type: ignore + content=mdl.TaskResumeRequest( + type=None, for_task=None, for_tokens=None, labels=None + ).json(exclude_none=True), ) self.assertEqual(200, resp.status_code, resp.content) @@ -189,11 +186,9 @@ def test_rewind_task(self): mock.return_value = '{ "success": true }' resp = self.client.post( "/tasks/rewind_task", - data=mdl.TaskRewindRequest( + content=mdl.TaskRewindRequest( type="rewind_task_request", task_id="task_id", phase_id=0 - ).json( - exclude_none=True - ), # type: ignore + ).json(exclude_none=True), ) self.assertEqual(200, resp.status_code, resp.content) @@ -202,8 +197,11 @@ def test_skip_phase(self): mock.return_value = '{ "success": True, "token": "token" }' resp = self.client.post( "/tasks/skip_phase", - data=mdl.TaskPhaseSkipRequest( # type: ignore - type="skip_phase_request", task_id="task_id", phase_id=0 + content=mdl.TaskPhaseSkipRequest( + type="skip_phase_request", + task_id="task_id", + phase_id=0, + labels=None, ).json(exclude_none=True), ) self.assertEqual(200, resp.status_code, resp.content) @@ -213,7 +211,7 @@ def test_task_discovery(self): mock.return_value = "{}" resp = self.client.post( "/tasks/task_discovery", - data=mdl.TaskDiscoveryRequest(type="task_discovery_request").json( + content=mdl.TaskDiscoveryRequest(type="task_discovery_request").json( exclude_none=True ), ) @@ -224,7 +222,12 @@ def test_undo_skip_phase(self): mock.return_value = '{ "success": True }' resp = self.client.post( "/tasks/undo_skip_phase", - data=mdl.UndoPhaseSkipRequest(type="undo_phase_skip_request").json(exclude_none=True), # type: ignore + content=mdl.UndoPhaseSkipRequest( + type="undo_phase_skip_request", + for_task=None, + for_tokens=None, + labels=None, + ).json(exclude_none=True), ) self.assertEqual(200, resp.status_code, resp.content) @@ -233,12 +236,17 @@ class TestDispatchTask(AppFixture): def post_task_request(self): return self.client.post( "/tasks/dispatch_task", - data=mdl.DispatchTaskRequest( + content=mdl.DispatchTaskRequest( type="dispatch_task_request", request=mdl.TaskRequest( category="test", description="description", - ), # type: ignore + unix_millis_earliest_start_time=None, + unix_millis_request_time=None, + labels=None, + priority=None, + requester=None, + ), ).json(exclude_none=True), ) diff --git a/packages/api-server/api_server/routes/test_dispensers.py b/packages/api-server/api_server/routes/test_dispensers.py index 7d453593d..3cfcb98fd 100644 --- a/packages/api-server/api_server/routes/test_dispensers.py +++ b/packages/api-server/api_server/routes/test_dispensers.py @@ -1,7 +1,8 @@ -from typing import List +import asyncio +from typing import List, cast from uuid import uuid4 -from api_server.rmf_io import rmf_events +from api_server.models import DispenserState from api_server.test import AppFixture, make_dispenser_state @@ -12,7 +13,7 @@ def setUpClass(cls): cls.dispenser_states = [make_dispenser_state(f"test_{uuid4()}")] for x in cls.dispenser_states: - rmf_events.dispenser_states.on_next(x) + asyncio.run(x.save()) def test_get_dispensers(self): resp = self.client.get("/dispensers") @@ -34,4 +35,4 @@ def test_sub_dispenser_state(self): msg = next( self.subscribe_sio(f"/dispensers/{self.dispenser_states[0].guid}/state") ) - self.assertEqual(self.dispenser_states[0].guid, msg.guid) # type: ignore + self.assertEqual(self.dispenser_states[0].guid, cast(DispenserState, msg).guid) diff --git a/packages/api-server/api_server/routes/test_doors.py b/packages/api-server/api_server/routes/test_doors.py index 0bae2681a..cb41e96a3 100644 --- a/packages/api-server/api_server/routes/test_doors.py +++ b/packages/api-server/api_server/routes/test_doors.py @@ -1,8 +1,10 @@ +import asyncio +from typing import cast from uuid import uuid4 from rmf_door_msgs.msg import DoorMode as RmfDoorMode -from api_server.rmf_io import rmf_events +from api_server.models import DoorState from api_server.test import AppFixture, make_building_map, make_door_state @@ -11,11 +13,12 @@ class TestDoorsRoute(AppFixture): def setUpClass(cls): super().setUpClass() cls.building_map = make_building_map() + asyncio.run(cls.building_map.save()) + cls.door_states = [make_door_state(f"test_{uuid4()}")] - rmf_events.building_map.on_next(cls.building_map) for x in cls.door_states: - rmf_events.door_states.on_next(x) + asyncio.run(x.save()) def test_get_doors(self): resp = self.client.get("/doors") @@ -32,7 +35,7 @@ def test_get_door_state(self): def test_sub_door_state(self): msg = next(self.subscribe_sio(f"/doors/{self.door_states[0].door_name}/state")) - self.assertEqual(self.door_states[0].door_name, msg.door_name) # type: ignore + self.assertEqual(self.door_states[0].door_name, cast(DoorState, msg).door_name) def test_post_door_request(self): resp = self.client.post( diff --git a/packages/api-server/api_server/routes/test_fleets.py b/packages/api-server/api_server/routes/test_fleets.py index 7f15bdd64..02addb204 100644 --- a/packages/api-server/api_server/routes/test_fleets.py +++ b/packages/api-server/api_server/routes/test_fleets.py @@ -1,4 +1,6 @@ -from api_server.models import FleetLogUpdate, FleetStateUpdate +from typing import cast + +from api_server.models import FleetLog, FleetLogUpdate, FleetState, FleetStateUpdate from api_server.test import AppFixture, make_fleet_log, make_fleet_state @@ -14,7 +16,7 @@ def test_fleet_states(self): ) msg = next(gen) - self.assertEqual(fleet_state.name, msg.name) # type: ignore + self.assertEqual(fleet_state.name, cast(FleetState, msg).name) # get fleet state resp = self.client.get(f"/fleets/{fleet_state.name}/state") @@ -37,7 +39,7 @@ def test_fleet_logs(self): ws.send_text(FleetLogUpdate(type="fleet_log_update", data=fleet_log).json()) msg = next(gen) - self.assertEqual(fleet_log.name, msg.name) # type: ignore + self.assertEqual(fleet_log.name, cast(FleetLog, msg).name) # Since there are no sample fleet logs, we cannot check the log contents resp = self.client.get(f"/fleets/{fleet_log.name}/log") diff --git a/packages/api-server/api_server/routes/test_ingestors.py b/packages/api-server/api_server/routes/test_ingestors.py index ecf3c90d5..fe55690dd 100644 --- a/packages/api-server/api_server/routes/test_ingestors.py +++ b/packages/api-server/api_server/routes/test_ingestors.py @@ -1,7 +1,8 @@ -from typing import List +import asyncio +from typing import List, cast from uuid import uuid4 -from api_server.rmf_io import rmf_events +from api_server.models import IngestorState from api_server.test import AppFixture, make_ingestor_state @@ -12,7 +13,7 @@ def setUpClass(cls): cls.ingestor_states = [make_ingestor_state(f"test_{uuid4()}")] for x in cls.ingestor_states: - rmf_events.ingestor_states.on_next(x) + asyncio.run(x.save()) def test_get_ingestors(self): resp = self.client.get("/ingestors") @@ -34,4 +35,4 @@ def test_sub_ingestor_state(self): msg = next( self.subscribe_sio(f"/ingestors/{self.ingestor_states[0].guid}/state") ) - self.assertEqual(self.ingestor_states[0].guid, msg.guid) # type: ignore + self.assertEqual(self.ingestor_states[0].guid, cast(IngestorState, msg).guid) diff --git a/packages/api-server/api_server/routes/test_lifts.py b/packages/api-server/api_server/routes/test_lifts.py index b73f2a1ed..e2f56c0a5 100644 --- a/packages/api-server/api_server/routes/test_lifts.py +++ b/packages/api-server/api_server/routes/test_lifts.py @@ -1,8 +1,10 @@ +import asyncio +from typing import cast from uuid import uuid4 from rmf_lift_msgs.msg import LiftRequest as RmfLiftRequest -from api_server.rmf_io import rmf_events +from api_server.models import LiftState from api_server.test import AppFixture, make_building_map, make_lift_state @@ -11,11 +13,11 @@ class TestLiftsRoute(AppFixture): def setUpClass(cls): super().setUpClass() cls.building_map = make_building_map() - cls.lift_states = [make_lift_state(f"test_{uuid4()}")] + asyncio.run(cls.building_map.save()) - rmf_events.building_map.on_next(cls.building_map) + cls.lift_states = [make_lift_state(f"test_{uuid4()}")] for x in cls.lift_states: - rmf_events.lift_states.on_next(x) + asyncio.run(x.save()) def test_get_lifts(self): resp = self.client.get("/lifts") @@ -32,7 +34,7 @@ def test_get_lift_state(self): def test_sub_lift_state(self): msg = next(self.subscribe_sio(f"/lifts/{self.lift_states[0].lift_name}/state")) - self.assertEqual(self.lift_states[0].lift_name, msg.lift_name) # type: ignore + self.assertEqual(self.lift_states[0].lift_name, cast(LiftState, msg).lift_name) def test_request_lift(self): resp = self.client.post( diff --git a/packages/api-server/api_server/test/__init__.py b/packages/api-server/api_server/test/__init__.py index cf62c9c9f..f7725fb21 100644 --- a/packages/api-server/api_server/test/__init__.py +++ b/packages/api-server/api_server/test/__init__.py @@ -2,7 +2,7 @@ from api_server.models import User from .mocks import * -from .test_client import client +from .test_client import TestClient from .test_data import * from .test_fixtures import * from .test_utils import * diff --git a/packages/api-server/api_server/test/test_client.py b/packages/api-server/api_server/test/test_client.py index 20975db06..0539a7235 100644 --- a/packages/api-server/api_server/test/test_client.py +++ b/packages/api-server/api_server/test/test_client.py @@ -33,38 +33,15 @@ def _generate_token(username: str): class TestClient(BaseTestClient): - _admin_token: Optional[str] = None - def __init__(self): super().__init__(app) + self.current_user: str + self.set_user("admin") @classmethod def token(cls, username: str) -> str: - if username == "admin": - if cls._admin_token is None: - cls._admin_token = _generate_token("admin") - return cls._admin_token - return _generate_token(username) - def set_user(self, user): + def set_user(self, user: str): + self.current_user = user self.headers["Authorization"] = f"bearer {self.token(user)}" - - -_client: Optional[TestClient] = None - - -def client(user="admin") -> TestClient: - global _client - if _client is None: - _client = TestClient() - _client.__enter__() - _client.headers["Content-Type"] = "application/json" - _client.set_user(user) - return _client - - -def shutdown(): - global _client - if _client is not None: - _client.__exit__() diff --git a/packages/api-server/api_server/test/test_fixtures.py b/packages/api-server/api_server/test/test_fixtures.py index 2280702de..3f6d94792 100644 --- a/packages/api-server/api_server/test/test_fixtures.py +++ b/packages/api-server/api_server/test/test_fixtures.py @@ -9,9 +9,11 @@ from uuid import uuid4 from api_server.app import app, on_sio_connect +from api_server.models import User +from api_server.routes.admin import PostUsers from .mocks import patch_sio -from .test_client import client +from .test_client import TestClient T = TypeVar("T") @@ -79,8 +81,14 @@ async def async_try_until( class AppFixture(unittest.TestCase): @classmethod def setUpClass(cls): - cls.client = client() - cls.client.set_user("admin") + cls.admin_user = User(username="admin", is_admin=True) + cls.client = TestClient() + cls.client.headers["Content-Type"] = "application/json" + cls.client.__enter__() + + @classmethod + def tearDownClass(cls): + cls.client.__exit__() def subscribe_sio(self, room: str, *, user="admin"): """ @@ -137,9 +145,10 @@ def setUp(self): def create_user(self, admin: bool = False): username = f"user_{uuid4().hex}" + user = PostUsers(username=username, is_admin=admin) resp = self.client.post( "/admin/users", - json={"username": username, "is_admin": admin}, + content=user.json(), ) self.assertEqual(200, resp.status_code) return username diff --git a/packages/api-server/api_server/test_sio_auth.py b/packages/api-server/api_server/test_sio_auth.py index c48baa611..af13f4edd 100644 --- a/packages/api-server/api_server/test_sio_auth.py +++ b/packages/api-server/api_server/test_sio_auth.py @@ -1,36 +1,21 @@ import asyncio -from typing import Optional from unittest.mock import AsyncMock, patch from api_server.app import app, on_sio_connect +from api_server.authenticator import authenticator -from .test import client from .test.test_fixtures import AppFixture class TestSioAuth(AppFixture): - @staticmethod - def try_connect(token: Optional[str]): - with patch.object(app, "sio") as mock: + # pylint: disable=no-self-use + def test_token_is_verified(self): + with patch.object( + authenticator, "verify_token" + ) as mock_verify_token, patch.object(app, "sio") as mock_sio: # set up mocks session = {} - mock.get_session = AsyncMock(return_value=session) + mock_sio.get_session = AsyncMock(return_value=session) - loop = asyncio.new_event_loop() - fut = asyncio.Future(loop=loop) - - async def result(): - fut.set_result(await on_sio_connect("test", {}, {"token": token})) - - loop.run_until_complete(result()) - loop.close() - return fut.result() - - def test_fail_with_no_token(self): - self.assertFalse(self.try_connect(None)) - - def test_fail_with_invalid_token(self): - self.assertFalse(self.try_connect("invalid")) - - def test_success_with_valid_token(self): - self.assertTrue(self.try_connect(client().token("admin"))) + asyncio.run(on_sio_connect("test", {}, {"token": "test-token"})) + mock_verify_token.assert_awaited_once_with("test-token") diff --git a/packages/api-server/scripts/test.py b/packages/api-server/scripts/test.py index 4acdf5e90..09ff60bf6 100644 --- a/packages/api-server/scripts/test.py +++ b/packages/api-server/scripts/test.py @@ -1,14 +1,14 @@ +import asyncio import os +from tortoise import Tortoise + os.environ[ "RMF_API_SERVER_CONFIG" ] = f"{os.path.dirname(__file__)}/sqlite_test_config.py" import unittest -from api_server.test import test_client - -test_client.client() result = unittest.main(module=None, exit=False) -test_client.shutdown() +asyncio.run(Tortoise.close_connections()) exit(1 if not result.result.wasSuccessful() else 0) diff --git a/packages/api-server/setup.py b/packages/api-server/setup.py index 827fcdc39..fce59f274 100644 --- a/packages/api-server/setup.py +++ b/packages/api-server/setup.py @@ -18,11 +18,11 @@ ], python_requires="~=3.10.4", install_requires=[ - "fastapi~=0.78.0", + "fastapi~=0.109.0", "aiofiles~=0.8.0", "uvicorn[standard]~=0.18.2", "python-socketio~=5.7", - "rx~=3.2", + "reactivex~=4.0.4", "tortoise-orm~=0.18.1", "pyjwt[crypto]~=2.4", "pydantic~=1.9", diff --git a/packages/rmf-auth/lib/components/context.tsx b/packages/rmf-auth/lib/components/context.tsx index 7a029cd63..46fd470d0 100644 --- a/packages/rmf-auth/lib/components/context.tsx +++ b/packages/rmf-auth/lib/components/context.tsx @@ -41,7 +41,8 @@ export function UserProfileProvider({ basePath, baseOptions: { headers: { - Authorization: token && `Bearer ${token}`, + // using spread operator to avoid `Authorization: undefined` if no token is available. + ...(token ? { Authorization: `Bearer ${token}` } : {}), }, }, }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 487a01129..0716afb39 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + importers: .: @@ -29,7 +33,7 @@ importers: specifier: ^2.7.1 version: 2.7.1 pyright: - specifier: ^1.1.257 + specifier: 1.1.257 version: 1.1.257 typescript: specifier: ~4.4.4 @@ -2816,6 +2820,46 @@ packages: - utf-8-validate dev: true + /@jest/core@26.6.3(ts-node@9.1.1): + resolution: {integrity: sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/reporters': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 18.0.3 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 26.6.2 + jest-config: 26.6.3(ts-node@9.1.1) + jest-haste-map: 26.6.2 + jest-message-util: 26.6.2 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-resolve-dependencies: 26.6.3 + jest-runner: 26.6.3(ts-node@9.1.1) + jest-runtime: 26.6.3(ts-node@9.1.1) + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + jest-watcher: 26.6.2 + micromatch: 4.0.5 + p-each-series: 2.2.0 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /@jest/environment@26.6.2: resolution: {integrity: sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==} engines: {node: '>= 10.14.2'} @@ -2931,6 +2975,23 @@ packages: - utf-8-validate dev: true + /@jest/test-sequencer@26.6.3(ts-node@9.1.1): + resolution: {integrity: sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/test-result': 26.6.2 + graceful-fs: 4.2.10 + jest-haste-map: 26.6.2 + jest-runner: 26.6.3(ts-node@9.1.1) + jest-runtime: 26.6.3(ts-node@9.1.1) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /@jest/transform@26.6.2: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} engines: {node: '>= 10.14.2'} @@ -5969,8 +6030,8 @@ packages: '@types/yargs-parser': 21.0.0 dev: true - /@types/yauzl@2.10.0: - resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true dependencies: '@types/node': 18.0.3 @@ -6908,6 +6969,7 @@ packages: /array-find-index@1.0.2: resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true @@ -7539,6 +7601,7 @@ packages: /big-integer@1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} + requiresBuild: true dev: true optional: true @@ -7652,6 +7715,7 @@ packages: /bplist-parser@0.1.1: resolution: {integrity: sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==} + requiresBuild: true dependencies: big-integer: 1.6.51 dev: true @@ -8036,6 +8100,7 @@ packages: /camelcase-keys@2.1.0: resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: camelcase: 2.1.1 map-obj: 1.0.1 @@ -8053,6 +8118,7 @@ packages: /camelcase@2.1.1: resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true @@ -8236,7 +8302,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chownr@1.1.4: @@ -9238,6 +9304,7 @@ packages: /currently-unhandled@0.4.1: resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: array-find-index: 1.0.2 dev: true @@ -10838,7 +10905,7 @@ packages: get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.0 + '@types/yauzl': 2.10.3 transitivePeerDependencies: - supports-color dev: true @@ -11373,12 +11440,12 @@ packages: requiresBuild: true dependencies: bindings: 1.5.0 - nan: 2.17.0 + nan: 2.18.0 dev: true optional: true - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -11463,6 +11530,7 @@ packages: /get-stdin@4.0.1: resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true @@ -11726,6 +11794,7 @@ packages: /growly@1.3.0: resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} + requiresBuild: true dev: true optional: true @@ -12330,6 +12399,7 @@ packages: /indent-string@2.1.0: resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: repeating: 2.0.1 dev: true @@ -12645,6 +12715,7 @@ packages: /is-finite@1.1.0: resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true @@ -13133,6 +13204,32 @@ packages: - utf-8-validate dev: true + /jest-cli@26.6.3(ts-node@9.1.1): + resolution: {integrity: sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/core': 26.6.3(ts-node@9.1.1) + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + is-ci: 2.0.0 + jest-config: 26.6.3(ts-node@9.1.1) + jest-util: 26.6.2 + jest-validate: 26.6.2 + prompts: 2.4.2 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jest-config@26.6.3(canvas@2.9.3)(ts-node@9.1.1): resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} engines: {node: '>= 10.14.2'} @@ -13168,6 +13265,41 @@ packages: - utf-8-validate dev: true + /jest-config@26.6.3(ts-node@9.1.1): + resolution: {integrity: sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==} + engines: {node: '>= 10.14.2'} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.18.6 + '@jest/test-sequencer': 26.6.3(ts-node@9.1.1) + '@jest/types': 26.6.2 + babel-jest: 26.6.3(@babel/core@7.18.6) + chalk: 4.1.2 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-environment-jsdom: 26.6.2(canvas@2.9.3) + jest-environment-node: 26.6.2 + jest-get-type: 26.3.0 + jest-jasmine2: 26.6.3(ts-node@9.1.1) + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + micromatch: 4.0.5 + pretty-format: 26.6.2 + ts-node: 9.1.1(typescript@4.4.4) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + /jest-diff@26.6.2: resolution: {integrity: sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==} engines: {node: '>= 10.14.2'} @@ -13264,7 +13396,7 @@ packages: sane: 4.1.0 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 transitivePeerDependencies: - supports-color dev: true @@ -13299,6 +13431,36 @@ packages: - utf-8-validate dev: true + /jest-jasmine2@26.6.3(ts-node@9.1.1): + resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} + engines: {node: '>= 10.14.2'} + dependencies: + '@babel/traverse': 7.18.6(supports-color@5.5.0) + '@jest/environment': 26.6.2 + '@jest/source-map': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 18.0.3 + chalk: 4.1.2 + co: 4.6.0 + expect: 26.6.2 + is-generator-fn: 2.1.0 + jest-each: 26.6.2 + jest-matcher-utils: 26.6.2 + jest-message-util: 26.6.2 + jest-runtime: 26.6.3(ts-node@9.1.1) + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + pretty-format: 26.6.2 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jest-leak-detector@26.6.2: resolution: {integrity: sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==} engines: {node: '>= 10.14.2'} @@ -13465,6 +13627,38 @@ packages: - utf-8-validate dev: true + /jest-runner@26.6.3(ts-node@9.1.1): + resolution: {integrity: sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==} + engines: {node: '>= 10.14.2'} + dependencies: + '@jest/console': 26.6.2 + '@jest/environment': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/types': 26.6.2 + '@types/node': 18.0.3 + chalk: 4.1.2 + emittery: 0.7.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-config: 26.6.3(ts-node@9.1.1) + jest-docblock: 26.0.0 + jest-haste-map: 26.6.2 + jest-leak-detector: 26.6.2 + jest-message-util: 26.6.2 + jest-resolve: 26.6.2 + jest-runtime: 26.6.3(ts-node@9.1.1) + jest-util: 26.6.2 + jest-worker: 26.6.2 + source-map-support: 0.5.21 + throat: 5.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jest-runtime@26.6.3(canvas@2.9.3)(ts-node@9.1.1): resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} engines: {node: '>= 10.14.2'} @@ -13505,6 +13699,46 @@ packages: - utf-8-validate dev: true + /jest-runtime@26.6.3(ts-node@9.1.1): + resolution: {integrity: sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==} + engines: {node: '>= 10.14.2'} + hasBin: true + dependencies: + '@jest/console': 26.6.2 + '@jest/environment': 26.6.2 + '@jest/fake-timers': 26.6.2 + '@jest/globals': 26.6.2 + '@jest/source-map': 26.6.2 + '@jest/test-result': 26.6.2 + '@jest/transform': 26.6.2 + '@jest/types': 26.6.2 + '@types/yargs': 15.0.14 + chalk: 4.1.2 + cjs-module-lexer: 0.6.0 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-config: 26.6.3(ts-node@9.1.1) + jest-haste-map: 26.6.2 + jest-message-util: 26.6.2 + jest-mock: 26.6.2 + jest-regex-util: 26.0.0 + jest-resolve: 26.6.2 + jest-snapshot: 26.6.2 + jest-util: 26.6.2 + jest-validate: 26.6.2 + slash: 3.0.0 + strip-bom: 4.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + /jest-serializer@26.6.2: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} @@ -13649,9 +13883,9 @@ packages: engines: {node: '>= 10.14.2'} hasBin: true dependencies: - '@jest/core': 26.6.3(canvas@2.9.3)(ts-node@9.1.1) + '@jest/core': 26.6.3(ts-node@9.1.1) import-local: 3.1.0 - jest-cli: 26.6.3(canvas@2.9.3)(ts-node@9.1.1) + jest-cli: 26.6.3(ts-node@9.1.1) transitivePeerDependencies: - bufferutil - canvas @@ -14415,6 +14649,7 @@ packages: /loud-rejection@1.6.0: resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: currently-unhandled: 0.4.1 signal-exit: 3.0.7 @@ -14645,6 +14880,7 @@ packages: /meow@3.7.0: resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: camelcase-keys: 2.1.0 decamelize: 1.2.0 @@ -15023,8 +15259,8 @@ packages: requiresBuild: true dev: true - /nan@2.17.0: - resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + /nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} requiresBuild: true dev: true optional: true @@ -15519,6 +15755,7 @@ packages: /os-homedir@1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true @@ -17537,7 +17774,7 @@ packages: webpack-manifest-plugin: 2.2.0(webpack@4.44.2) workbox-webpack-plugin: 5.1.4(webpack@4.44.2) optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 transitivePeerDependencies: - '@types/webpack' - bluebird @@ -17748,6 +17985,7 @@ packages: /redent@1.0.0: resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: indent-string: 2.1.0 strip-indent: 1.0.1 @@ -17957,6 +18195,7 @@ packages: /repeating@2.0.1: resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: is-finite: 1.1.0 dev: true @@ -18591,6 +18830,7 @@ packages: /shellwords@0.1.1: resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} + requiresBuild: true dev: true optional: true @@ -19225,6 +19465,7 @@ packages: resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} engines: {node: '>=0.10.0'} hasBin: true + requiresBuild: true dependencies: get-stdin: 4.0.1 dev: true @@ -19849,6 +20090,7 @@ packages: /trim-newlines@1.0.0: resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} engines: {node: '>=0.10.0'} + requiresBuild: true dev: true optional: true @@ -20266,6 +20508,7 @@ packages: /untildify@2.1.0: resolution: {integrity: sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==} engines: {node: '>=0.10.0'} + requiresBuild: true dependencies: os-homedir: 1.0.2 dev: true @@ -21533,5 +21776,4 @@ packages: file:packages/api-server: resolution: {directory: packages/api-server, type: directory} name: api-server - version: 0.0.0 dev: true