diff --git a/Pipfile.lock b/Pipfile.lock index b59b1df1..2a45eb4b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -84,10 +84,10 @@ }, "attrs": { "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", + "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" ], - "version": "==19.3.0" + "version": "==20.2.0" }, "cachetools": { "hashes": [ @@ -106,36 +106,36 @@ }, "cffi": { "hashes": [ - "sha256:267adcf6e68d77ba154334a3e4fc921b8e63cbb38ca00d33d40655d4228502bc", - "sha256:26f33e8f6a70c255767e3c3f957ccafc7f1f706b966e110b855bfe944511f1f9", - "sha256:3cd2c044517f38d1b577f05927fb9729d3396f1d44d0c659a445599e79519792", - "sha256:4a03416915b82b81af5502459a8a9dd62a3c299b295dcdf470877cb948d655f2", - "sha256:4ce1e995aeecf7cc32380bc11598bfdfa017d592259d5da00fc7ded11e61d022", - "sha256:4f53e4128c81ca3212ff4cf097c797ab44646a40b42ec02a891155cd7a2ba4d8", - "sha256:4fa72a52a906425416f41738728268072d5acfd48cbe7796af07a923236bcf96", - "sha256:66dd45eb9530e3dde8f7c009f84568bc7cac489b93d04ac86e3111fb46e470c2", - "sha256:6923d077d9ae9e8bacbdb1c07ae78405a9306c8fd1af13bfa06ca891095eb995", - "sha256:833401b15de1bb92791d7b6fb353d4af60dc688eaa521bd97203dcd2d124a7c1", - "sha256:8416ed88ddc057bab0526d4e4e9f3660f614ac2394b5e019a628cdfff3733849", - "sha256:892daa86384994fdf4856cb43c93f40cbe80f7f95bb5da94971b39c7f54b3a9c", - "sha256:98be759efdb5e5fa161e46d404f4e0ce388e72fbf7d9baf010aff16689e22abe", - "sha256:a6d28e7f14ecf3b2ad67c4f106841218c8ab12a0683b1528534a6c87d2307af3", - "sha256:b1d6ebc891607e71fd9da71688fcf332a6630b7f5b7f5549e6e631821c0e5d90", - "sha256:b2a2b0d276a136146e012154baefaea2758ef1f56ae9f4e01c612b0831e0bd2f", - "sha256:b87dfa9f10a470eee7f24234a37d1d5f51e5f5fa9eeffda7c282e2b8f5162eb1", - "sha256:bac0d6f7728a9cc3c1e06d4fcbac12aaa70e9379b3025b27ec1226f0e2d404cf", - "sha256:c991112622baee0ae4d55c008380c32ecfd0ad417bcd0417ba432e6ba7328caa", - "sha256:cda422d54ee7905bfc53ee6915ab68fe7b230cacf581110df4272ee10462aadc", - "sha256:d3148b6ba3923c5850ea197a91a42683f946dba7e8eb82dfa211ab7e708de939", - "sha256:d6033b4ffa34ef70f0b8086fd4c3df4bf801fee485a8a7d4519399818351aa8e", - "sha256:ddff0b2bd7edcc8c82d1adde6dbbf5e60d57ce985402541cd2985c27f7bec2a0", - "sha256:e23cb7f1d8e0f93addf0cae3c5b6f00324cccb4a7949ee558d7b6ca973ab8ae9", - "sha256:effd2ba52cee4ceff1a77f20d2a9f9bf8d50353c854a282b8760ac15b9833168", - "sha256:f90c2267101010de42f7273c94a1f026e56cbc043f9330acd8a80e64300aba33", - "sha256:f960375e9823ae6a07072ff7f8a85954e5a6434f97869f50d0e41649a1c8144f", - "sha256:fcf32bf76dc25e30ed793145a57426064520890d7c02866eb93d3e4abe516948" - ], - "version": "==1.14.1" + "sha256:0da50dcbccd7cb7e6c741ab7912b2eff48e85af217d72b57f80ebc616257125e", + "sha256:12a453e03124069b6896107ee133ae3ab04c624bb10683e1ed1c1663df17c13c", + "sha256:15419020b0e812b40d96ec9d369b2bc8109cc3295eac6e013d3261343580cc7e", + "sha256:15a5f59a4808f82d8ec7364cbace851df591c2d43bc76bcbe5c4543a7ddd1bf1", + "sha256:23e44937d7695c27c66a54d793dd4b45889a81b35c0751ba91040fe825ec59c4", + "sha256:29c4688ace466a365b85a51dcc5e3c853c1d283f293dfcc12f7a77e498f160d2", + "sha256:57214fa5430399dffd54f4be37b56fe22cedb2b98862550d43cc085fb698dc2c", + "sha256:577791f948d34d569acb2d1add5831731c59d5a0c50a6d9f629ae1cefd9ca4a0", + "sha256:6539314d84c4d36f28d73adc1b45e9f4ee2a89cdc7e5d2b0a6dbacba31906798", + "sha256:65867d63f0fd1b500fa343d7798fa64e9e681b594e0a07dc934c13e76ee28fb1", + "sha256:672b539db20fef6b03d6f7a14b5825d57c98e4026401fce838849f8de73fe4d4", + "sha256:6843db0343e12e3f52cc58430ad559d850a53684f5b352540ca3f1bc56df0731", + "sha256:7057613efefd36cacabbdbcef010e0a9c20a88fc07eb3e616019ea1692fa5df4", + "sha256:76ada88d62eb24de7051c5157a1a78fd853cca9b91c0713c2e973e4196271d0c", + "sha256:837398c2ec00228679513802e3744d1e8e3cb1204aa6ad408b6aff081e99a487", + "sha256:8662aabfeab00cea149a3d1c2999b0731e70c6b5bac596d95d13f643e76d3d4e", + "sha256:95e9094162fa712f18b4f60896e34b621df99147c2cee216cfa8f022294e8e9f", + "sha256:99cc66b33c418cd579c0f03b77b94263c305c389cb0c6972dac420f24b3bf123", + "sha256:9b219511d8b64d3fa14261963933be34028ea0e57455baf6781fe399c2c3206c", + "sha256:ae8f34d50af2c2154035984b8b5fc5d9ed63f32fe615646ab435b05b132ca91b", + "sha256:b9aa9d8818c2e917fa2c105ad538e222a5bce59777133840b93134022a7ce650", + "sha256:bf44a9a0141a082e89c90e8d785b212a872db793a0080c20f6ae6e2a0ebf82ad", + "sha256:c0b48b98d79cf795b0916c57bebbc6d16bb43b9fc9b8c9f57f4cf05881904c75", + "sha256:da9d3c506f43e220336433dffe643fbfa40096d408cb9b7f2477892f369d5f82", + "sha256:e4082d832e36e7f9b2278bc774886ca8207346b99f278e54c9de4834f17232f7", + "sha256:e4b9b7af398c32e408c00eb4e0d33ced2f9121fd9fb978e6c1b57edd014a7d15", + "sha256:e613514a82539fc48291d01933951a13ae93b6b444a88782480be32245ed4afa", + "sha256:f5033952def24172e60493b68717792e3aebb387a8d186c43c020d9363ee7281" + ], + "version": "==1.14.2" }, "chardet": { "hashes": [ @@ -153,27 +153,30 @@ }, "cryptography": { "hashes": [ - "sha256:0c608ff4d4adad9e39b5057de43657515c7da1ccb1807c3a27d4cf31fc923b4b", - "sha256:0cbfed8ea74631fe4de00630f4bb592dad564d57f73150d6f6796a24e76c76cd", - "sha256:124af7255ffc8e964d9ff26971b3a6153e1a8a220b9a685dc407976ecb27a06a", - "sha256:384d7c681b1ab904fff3400a6909261cae1d0939cc483a68bdedab282fb89a07", - "sha256:45741f5499150593178fc98d2c1a9c6722df88b99c821ad6ae298eff0ba1ae71", - "sha256:4b9303507254ccb1181d1803a2080a798910ba89b1a3c9f53639885c90f7a756", - "sha256:4d355f2aee4a29063c10164b032d9fa8a82e2c30768737a2fd56d256146ad559", - "sha256:51e40123083d2f946794f9fe4adeeee2922b581fa3602128ce85ff813d85b81f", - "sha256:8713ddb888119b0d2a1462357d5946b8911be01ddbf31451e1d07eaa5077a261", - "sha256:8e924dbc025206e97756e8903039662aa58aa9ba357d8e1d8fc29e3092322053", - "sha256:8ecef21ac982aa78309bb6f092d1677812927e8b5ef204a10c326fc29f1367e2", - "sha256:8ecf9400d0893836ff41b6f977a33972145a855b6efeb605b49ee273c5e6469f", - "sha256:9367d00e14dee8d02134c6c9524bb4bd39d4c162456343d07191e2a0b5ec8b3b", - "sha256:a09fd9c1cca9a46b6ad4bea0a1f86ab1de3c0c932364dbcf9a6c2a5eeb44fa77", - "sha256:ab49edd5bea8d8b39a44b3db618e4783ef84c19c8b47286bf05dfdb3efb01c83", - "sha256:bea0b0468f89cdea625bb3f692cd7a4222d80a6bdafd6fb923963f2b9da0e15f", - "sha256:bec7568c6970b865f2bcebbe84d547c52bb2abadf74cefce396ba07571109c67", - "sha256:ce82cc06588e5cbc2a7df3c8a9c778f2cb722f56835a23a68b5a7264726bb00c", - "sha256:dea0ba7fe6f9461d244679efa968d215ea1f989b9c1957d7f10c21e5c7c09ad6" - ], - "version": "==3.0" + "sha256:10c9775a3f31610cf6b694d1fe598f2183441de81cedcf1814451ae53d71b13a", + "sha256:180c9f855a8ea280e72a5d61cf05681b230c2dce804c48e9b2983f491ecc44ed", + "sha256:247df238bc05c7d2e934a761243bfdc67db03f339948b1e2e80c75d41fc7cc36", + "sha256:26409a473cc6278e4c90f782cd5968ebad04d3911ed1c402fc86908c17633e08", + "sha256:2a27615c965173c4c88f2961cf18115c08fedfb8bdc121347f26e8458dc6d237", + "sha256:2e26223ac636ca216e855748e7d435a1bf846809ed12ed898179587d0cf74618", + "sha256:321761d55fb7cb256b771ee4ed78e69486a7336be9143b90c52be59d7657f50f", + "sha256:4005b38cd86fc51c955db40b0f0e52ff65340874495af72efabb1bb8ca881695", + "sha256:4b9e96543d0784acebb70991ebc2dbd99aa287f6217546bb993df22dd361d41c", + "sha256:548b0818e88792318dc137d8b1ec82a0ab0af96c7f0603a00bb94f896fbf5e10", + "sha256:725875681afe50b41aee7fdd629cedbc4720bab350142b12c55c0a4d17c7416c", + "sha256:7a63e97355f3cd77c94bd98c59cb85fe0efd76ea7ef904c9b0316b5bbfde6ed1", + "sha256:94191501e4b4009642be21dde2a78bd3c2701a81ee57d3d3d02f1d99f8b64a9e", + "sha256:969ae512a250f869c1738ca63be843488ff5cc031987d302c1f59c7dbe1b225f", + "sha256:9f734423eb9c2ea85000aa2476e0d7a58e021bc34f0a373ac52a5454cd52f791", + "sha256:b45ab1c6ece7c471f01c56f5d19818ca797c34541f0b2351635a5c9fe09ac2e0", + "sha256:cc6096c86ec0de26e2263c228fb25ee01c3ff1346d3cfc219d67d49f303585af", + "sha256:dc3f437ca6353979aace181f1b790f0fc79e446235b14306241633ab7d61b8f8", + "sha256:e7563eb7bc5c7e75a213281715155248cceba88b11cb4b22957ad45b85903761", + "sha256:e7dad66a9e5684a40f270bd4aee1906878193ae50a4831922e454a2a457f1716", + "sha256:eb80a288e3cfc08f679f95da72d2ef90cb74f6d8a8ba69d2f215c5e110b2ca32", + "sha256:fa7fbcc40e2210aca26c7ac8a39467eae444d90a2c346cbcffd9133a166bcc67" + ], + "version": "==3.1" }, "dataclasses": { "hashes": [ @@ -186,11 +189,11 @@ }, "fastapi": { "hashes": [ - "sha256:96f964c3d9da8183f824857ad67c16c00ff3297e7bbca6748f60bd8485ded38c", - "sha256:9a4faa0e2b9c88a3772f7ce15eb4005bbdd27d1230ab4a0cd3517316175014a6" + "sha256:61ed73b4304413a2ea618d1b95ea866ee386e0e62dd8659c4f5059286f4a39c2", + "sha256:6cc31bb555dd8ca956d1d227477d661e4ac012337242a41d36214ffbda78bfe9" ], "index": "pypi", - "version": "==0.60.1" + "version": "==0.61.1" }, "gunicorn": { "hashes": [ @@ -394,36 +397,36 @@ }, "scout-apm": { "hashes": [ - "sha256:1b8d01ec9ee0e80617698b7fccbfcc12f207ec1287a325e2bcf520a784e8b582", - "sha256:292b37c1c855bb78bcd4322320d704a1c4ec88dd1deb8089c59af3ddc638167b", - "sha256:3209b0362212693daa95abc03d92e5c2dd4eae90f2d20d17cfe56e8d9f997d50", - "sha256:34044653f7239f81f4a4282709d32630e82ba6e8cd0d343951a7a1f98f9cb53d", - "sha256:3cb11a32a3f395649af44c6e9d71c0f961652a8b291f8ae3b8bd701bfc6baaaa", - "sha256:54bb9fc339b39f3320521b7b8e988315b9252afd2252065de88a36802f21421c", - "sha256:5db32c5c61e9c916d5284157c3161c464358907ace50f2122af59bc3a02f79e9", - "sha256:6a5b9ea2fb1414cb69ee06d4ede9bcfe6e45bddbffc9a5b8ae50f74c3861ee09", - "sha256:79bb227f4c9268b3441d7f5a2a86d3378c3877df8dab9bb833711bd38a818151", - "sha256:7b9125ee5ed4be19b20d2669d27d80a4fe1a4c461e9b0873f3e04c96889853e8", - "sha256:afae9c349642b8f86eb28722a1fcc24ea0c5d8c980b9ca9f253cfcc8976025a4", - "sha256:bac108329a806a1de4786f7f2eb43ae5646d20813429b76db31a41ae92670c31", - "sha256:bc6ed26a855ada1a32c15aba98518400954f0ce0920a5017a76f2431de8d9093", - "sha256:d1d2e1b0e51f3a337c3c953c4e7fc1fc1ae9d391010bd90a2a8bedd5e58d63d9", - "sha256:d77f2aeb7ba04c5c3e1687c1b29b1a7e17471c817490074e0e9319e43f409664", - "sha256:ebdf82c1048c705cc79181c270e5816e4ddebcad512e312e2c86fdea803904ef", - "sha256:f09c4046a199002296d932a903a693c67f8f76e483b29ad584e2649eea474426", - "sha256:f8108ea738e69ee5ab2ee0b025fb601a7308b8c8e586b9e1bfb44491a018085f", - "sha256:ff6879c247ff073fd75d3f621509262440105bb786cddd0935987a42e78db8b0" + "sha256:1fd5e6526f345a3b13bbf0171a367c00c3adfdde1fcee3b02223b8935cc907cf", + "sha256:21c3d356a8c0449d0cc364dbe2d52ff0139c57d427a0cb9bed5177d3526207e3", + "sha256:230de861482f8efd9a55050c4b12cb66a010c0826f21bca530275e7fcc2f5268", + "sha256:3bd3f6b8008ad829fda3a8cc406c53470aa7a770fdbf9db87ef02955c4d5d47e", + "sha256:49e4f718ae3201409e48c48e6ce6ee109d1348b15a2745b5405ab258e8a2e874", + "sha256:52bb6ad86ca13459cba6cb5b6085923dfcd1015b6fb28da70934ecbf27b83688", + "sha256:5cc1ffb00d3e38a46939cedf3187df29a514eae95b726aef8eba8cb401d4758f", + "sha256:a15f271ccf25dbed8fe4e419064eafbb4b90b687e7f1458541f14d3d2022b782", + "sha256:bbb2bf5c3d94267001862f463cd759a023e3aaf47ccd4b244a9b5775c8bd75cb", + "sha256:bda6374fdaa81e7409b823a80613b072b28e2c98fca9637e0635705ec1824589", + "sha256:c16c83293288a93ad638fd452d3a2289bfbfb29b65772ae6876711fd2c13edb4", + "sha256:c8d5c58a08df9bba1b6734b033210731b8d2d6083fa81174fb79033e9ddc86e4", + "sha256:d51dfe698915815755e75655b40e6abc530df76afc6e188671b99d15442c681c", + "sha256:e501d1eb6e58979ec1cee4922c7321f5c4ea1d9daf4e5d19f85fc6aa96e0c13c", + "sha256:ecd22480217203fd1e3f5dd752d1bb93db93859159510ac4e599297c488c4173", + "sha256:ede0cd338827b49291a9158be63726cc16f77e6bc1d08deb277ccb9a4feebe08", + "sha256:f5d46cd89f6ef109df2257177342adb9b0a19be73a054aacd8157e85cbaf2a60", + "sha256:f835071ff0b6c41a227e2b06999ec9c4a07b806f6ab5cec0eae15a8d166478dd", + "sha256:f9b204bf90c6af4c0a7ee2f659239ababb4015d91134db2dbf9ab9578c1fd43d" ], "index": "pypi", - "version": "==2.15.2" + "version": "==2.16.1" }, "sentry-sdk": { "hashes": [ - "sha256:2de15b13836fa3522815a933bd9c887c77f4868071043349f94f1b896c1bcfb8", - "sha256:38bb09d0277117f76507c8728d9a5156f09a47ac5175bb8072513859d19a593b" + "sha256:97bff68e57402ad39674e6fe2545df0d5eea41c3d51e280c170761705c8c20ff", + "sha256:a16caf9ce892623081cbb9a95f6c1f892778bb123909b0ed7afdfb52ce7a58a1" ], "index": "pypi", - "version": "==0.16.2" + "version": "==0.17.4" }, "six": { "hashes": [ @@ -569,10 +572,10 @@ }, "attrs": { "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + "sha256:26b54ddbbb9ee1d34d5d3668dd37d6cf74990ab23c828c2888dccdceee395594", + "sha256:fce7fc47dfc976152e82d53ff92fa0407700c21acd20886a13777a0d20e655dc" ], - "version": "==19.3.0" + "version": "==20.2.0" }, "bandit": { "hashes": [ @@ -613,50 +616,50 @@ }, "coverage": { "hashes": [ - "sha256:098a703d913be6fbd146a8c50cc76513d726b022d170e5e98dc56d958fd592fb", - "sha256:16042dc7f8e632e0dcd5206a5095ebd18cb1d005f4c89694f7f8aafd96dd43a3", - "sha256:1adb6be0dcef0cf9434619d3b892772fdb48e793300f9d762e480e043bd8e716", - "sha256:27ca5a2bc04d68f0776f2cdcb8bbd508bbe430a7bf9c02315cd05fb1d86d0034", - "sha256:28f42dc5172ebdc32622a2c3f7ead1b836cdbf253569ae5673f499e35db0bac3", - "sha256:2fcc8b58953d74d199a1a4d633df8146f0ac36c4e720b4a1997e9b6327af43a8", - "sha256:304fbe451698373dc6653772c72c5d5e883a4aadaf20343592a7abb2e643dae0", - "sha256:30bc103587e0d3df9e52cd9da1dd915265a22fad0b72afe54daf840c984b564f", - "sha256:40f70f81be4d34f8d491e55936904db5c527b0711b2a46513641a5729783c2e4", - "sha256:4186fc95c9febeab5681bc3248553d5ec8c2999b8424d4fc3a39c9cba5796962", - "sha256:46794c815e56f1431c66d81943fa90721bb858375fb36e5903697d5eef88627d", - "sha256:4869ab1c1ed33953bb2433ce7b894a28d724b7aa76c19b11e2878034a4e4680b", - "sha256:4f6428b55d2916a69f8d6453e48a505c07b2245653b0aa9f0dee38785939f5e4", - "sha256:52f185ffd3291196dc1aae506b42e178a592b0b60a8610b108e6ad892cfc1bb3", - "sha256:538f2fd5eb64366f37c97fdb3077d665fa946d2b6d95447622292f38407f9258", - "sha256:64c4f340338c68c463f1b56e3f2f0423f7b17ba6c3febae80b81f0e093077f59", - "sha256:675192fca634f0df69af3493a48224f211f8db4e84452b08d5fcebb9167adb01", - "sha256:700997b77cfab016533b3e7dbc03b71d33ee4df1d79f2463a318ca0263fc29dd", - "sha256:8505e614c983834239f865da2dd336dcf9d72776b951d5dfa5ac36b987726e1b", - "sha256:962c44070c281d86398aeb8f64e1bf37816a4dfc6f4c0f114756b14fc575621d", - "sha256:9e536783a5acee79a9b308be97d3952b662748c4037b6a24cbb339dc7ed8eb89", - "sha256:9ea749fd447ce7fb1ac71f7616371f04054d969d412d37611716721931e36efd", - "sha256:a34cb28e0747ea15e82d13e14de606747e9e484fb28d63c999483f5d5188e89b", - "sha256:a3ee9c793ffefe2944d3a2bd928a0e436cd0ac2d9e3723152d6fd5398838ce7d", - "sha256:aab75d99f3f2874733946a7648ce87a50019eb90baef931698f96b76b6769a46", - "sha256:b1ed2bdb27b4c9fc87058a1cb751c4df8752002143ed393899edb82b131e0546", - "sha256:b360d8fd88d2bad01cb953d81fd2edd4be539df7bfec41e8753fe9f4456a5082", - "sha256:b8f58c7db64d8f27078cbf2a4391af6aa4e4767cc08b37555c4ae064b8558d9b", - "sha256:c1bbb628ed5192124889b51204de27c575b3ffc05a5a91307e7640eff1d48da4", - "sha256:c2ff24df02a125b7b346c4c9078c8936da06964cc2d276292c357d64378158f8", - "sha256:c890728a93fffd0407d7d37c1e6083ff3f9f211c83b4316fae3778417eab9811", - "sha256:c96472b8ca5dc135fb0aa62f79b033f02aa434fb03a8b190600a5ae4102df1fd", - "sha256:ce7866f29d3025b5b34c2e944e66ebef0d92e4a4f2463f7266daa03a1332a651", - "sha256:e26c993bd4b220429d4ec8c1468eca445a4064a61c74ca08da7429af9bc53bb0" - ], - "version": "==5.2.1" + "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516", + "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259", + "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9", + "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097", + "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0", + "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f", + "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7", + "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c", + "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5", + "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7", + "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729", + "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978", + "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9", + "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f", + "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9", + "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822", + "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418", + "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82", + "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f", + "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d", + "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221", + "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4", + "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21", + "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709", + "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54", + "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d", + "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270", + "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24", + "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751", + "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a", + "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237", + "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7", + "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636", + "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8" + ], + "version": "==5.3" }, "coveralls": { "hashes": [ - "sha256:3726d35c0f93a28631a003880e2aa6cc93c401d62bc6919c5cb497217ba30c55", - "sha256:afe359cd5b350e1b3895372bda32af8f0260638c7c4a31a5c0f15aa6a96f40d9" + "sha256:4430b862baabb3cf090d36d84d331966615e4288d8a8c5957e0fd456d0dd8bd6", + "sha256:b3b60c17b03a0dee61952a91aed6f131e0b2ac8bd5da909389c53137811409e1" ], "index": "pypi", - "version": "==2.1.1" + "version": "==2.1.2" }, "docopt": { "hashes": [ @@ -673,10 +676,10 @@ }, "gitpython": { "hashes": [ - "sha256:2db287d71a284e22e5c2846042d0602465c7434d910406990d5b74df4afb0858", - "sha256:fa3b92da728a457dd75d62bb5f3eb2816d99a7fe6c67398e260637a40e3fafb5" + "sha256:080bf8e2cf1a2b907634761c2eaefbe83b69930c94c66ad11b65a8252959f912", + "sha256:1858f4fd089abe92ae465f01d5aaaf55e937eca565fb2c1fce35a51b5f85c910" ], - "version": "==3.1.7" + "version": "==3.1.8" }, "idna": { "hashes": [ @@ -712,11 +715,11 @@ }, "isort": { "hashes": [ - "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", - "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd" + "sha256:171c5f365791073426b5ed3a156c2081a47f88c329161fd28228ff2da4c97ddb", + "sha256:ba91218eee31f1e300ecc079ef0c524cea3fc41bfbb979cbdf5fd3a889e3cfed" ], "index": "pypi", - "version": "==4.3.21" + "version": "==5.5.2" }, "lazy-object-proxy": { "hashes": [ @@ -760,10 +763,10 @@ }, "more-itertools": { "hashes": [ - "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5", - "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2" + "sha256:6f83822ae94818eae2612063a5101a7311e68ae8002005b5e05f03fd74a86a20", + "sha256:9b30f12df9393f0d28af9210ff8efe48d10c94f73e5daf886f10c4b0b0b4f03c" ], - "version": "==8.4.0" + "version": "==8.5.0" }, "multidict": { "hashes": [ @@ -803,10 +806,10 @@ }, "pbr": { "hashes": [ - "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c", - "sha256:579170e23f8e0c2f24b0de612f71f648eccb79fb1322c814ae6b3c07b5ba23e8" + "sha256:14bfd98f51c78a3dd22a1ef45cf194ad79eee4a19e8e1a0d5c7f8e81ffe182ea", + "sha256:5adc0f9fc64319d8df5ca1e4e06eea674c26b80e6f00c530b18ce6a6592ead15" ], - "version": "==5.4.5" + "version": "==5.5.0" }, "pluggy": { "hashes": [ @@ -824,11 +827,11 @@ }, "pylint": { "hashes": [ - "sha256:7dd78437f2d8d019717dbf287772d0b2dbdfd13fc016aa7faa08d67bccc46adc", - "sha256:d0ece7d223fe422088b0e8f13fa0a1e8eb745ebffcb8ed53d3e95394b6101a1c" + "sha256:bb4a908c9dadbc3aac18860550e870f58e1a02c9f2c204fdf5693d73be061210", + "sha256:bfe68f020f8a0fece830a22dd4d5dddb4ecc6137db04face4c3420a46a52239f" ], "index": "pypi", - "version": "==2.5.3" + "version": "==2.6.0" }, "pyparsing": { "hashes": [ @@ -839,11 +842,11 @@ }, "pytest": { "hashes": [ - "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4", - "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad" + "sha256:0e37f61339c4578776e090c3b8f6b16ce4db333889d65d0efb305243ec544b40", + "sha256:c8f57c2a30983f469bf03e68cdfa74dc474ce56b8f280ddcb080dfd91df01043" ], "index": "pypi", - "version": "==6.0.1" + "version": "==6.0.2" }, "pytest-asyncio": { "hashes": [ @@ -855,11 +858,11 @@ }, "pytest-cov": { "hashes": [ - "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87", - "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c" + "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191", + "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e" ], "index": "pypi", - "version": "==2.10.0" + "version": "==2.10.1" }, "pyyaml": { "hashes": [ @@ -913,11 +916,11 @@ }, "responses": { "hashes": [ - "sha256:7bb697a5fedeb41d81e8b87f152d453d5cab42dcd1691b6a7d6097e94d33f373", - "sha256:af94d28cdfb48ded0ad82a5216616631543650f440334a693479b8991a6594a2" + "sha256:0de50fbf600adf5ef9f0821b85cc537acca98d66bc7776755924476775c1989c", + "sha256:e80d5276011a4b79ecb62c5f82ba07aa23fb31ecbc95ee7cad6de250a3c97444" ], "index": "pypi", - "version": "==0.10.15" + "version": "==0.12.0" }, "six": { "hashes": [ @@ -935,10 +938,10 @@ }, "stevedore": { "hashes": [ - "sha256:38791aa5bed922b0a844513c5f9ed37774b68edc609e5ab8ab8d8fe0ce4315e5", - "sha256:c8f4f0ebbc394e52ddf49de8bcc3cf8ad2b4425ebac494106bbc5e3661ac7633" + "sha256:5e1ab03eaae06ef6ce23859402de785f08d97780ed774948ef16c4652c41bc62", + "sha256:f845868b3a3a77a2489d226568abe7328b5c2d4f6a011cc759dfa99144a521f0" ], - "version": "==3.2.0" + "version": "==3.2.2" }, "toml": { "hashes": [ diff --git a/app/models.py b/app/models.py index 8875a92c..497a4b83 100644 --- a/app/models.py +++ b/app/models.py @@ -1,7 +1,7 @@ """app.models.py""" from typing import Dict, List -from pydantic import BaseModel +from pydantic import BaseModel, validator class Latest(BaseModel): @@ -27,9 +27,26 @@ class Timeline(BaseModel): Timeline model. """ - latest: int timeline: Dict[str, int] = {} + @validator("timeline") + @classmethod + def sort_timeline(cls, value): + """Sort the timeline history before inserting into the model""" + return dict(sorted(value.items())) + + @property + def latest(self): + """Get latest available history value.""" + return list(self.timeline.values())[-1] if self.timeline else 0 + + def serialize(self): + """ + Serialize the model into dict + TODO: override dict() instead of using serialize + """ + return {**self.dict(), "latest": self.latest} + class Timelines(BaseModel): """ diff --git a/app/services/location/jhu.py b/app/services/location/jhu.py index 6f488742..f252bf80 100644 --- a/app/services/location/jhu.py +++ b/app/services/location/jhu.py @@ -11,7 +11,7 @@ from ...caches import check_cache, load_cache from ...coordinates import Coordinates from ...location import TimelinedLocation -from ...timeline import Timeline +from ...models import Timeline from ...utils import countries from ...utils import date as date_util from ...utils import httputils @@ -178,25 +178,25 @@ async def get_locations(): location["country"], location["province"], # Coordinates. - Coordinates(coordinates["lat"], coordinates["long"]), + Coordinates(latitude=coordinates["lat"], longitude=coordinates["long"]), # Last update. datetime.utcnow().isoformat() + "Z", # Timelines (parse dates as ISO). { "confirmed": Timeline( - { + timeline={ datetime.strptime(date, "%m/%d/%y").isoformat() + "Z": amount for date, amount in timelines["confirmed"].items() } ), "deaths": Timeline( - { + timeline={ datetime.strptime(date, "%m/%d/%y").isoformat() + "Z": amount for date, amount in timelines["deaths"].items() } ), "recovered": Timeline( - { + timeline={ datetime.strptime(date, "%m/%d/%y").isoformat() + "Z": amount for date, amount in timelines["recovered"].items() } diff --git a/app/services/location/nyt.py b/app/services/location/nyt.py index 52b565ae..1f25ec34 100644 --- a/app/services/location/nyt.py +++ b/app/services/location/nyt.py @@ -9,7 +9,7 @@ from ...caches import check_cache, load_cache from ...coordinates import Coordinates from ...location.nyt import NYTLocation -from ...timeline import Timeline +from ...models import Timeline from ...utils import httputils from . import LocationService @@ -119,18 +119,18 @@ async def get_locations(): last_updated=datetime.utcnow().isoformat() + "Z", # since last request timelines={ "confirmed": Timeline( - { + timeline={ datetime.strptime(date, "%Y-%m-%d").isoformat() + "Z": amount for date, amount in confirmed_history.items() } ), "deaths": Timeline( - { + timeline={ datetime.strptime(date, "%Y-%m-%d").isoformat() + "Z": amount for date, amount in deaths_history.items() } ), - "recovered": Timeline({}), + "recovered": Timeline(), }, ) ) diff --git a/app/timeline.py b/app/timeline.py deleted file mode 100644 index 0b40d496..00000000 --- a/app/timeline.py +++ /dev/null @@ -1,42 +0,0 @@ -"""app.timeline.py""" -from collections import OrderedDict - - -class Timeline: - """ - Timeline with history of data. - """ - - def __init__(self, history=None): - self.__timeline = history if history else {} - - @property - def timeline(self): - """ - Gets the history sorted by date (key). - """ - return OrderedDict(sorted(self.__timeline.items())) - - @property - def latest(self): - """ - Gets the latest available history value. - """ - # Get values in a list. - values = list(self.timeline.values()) - - # Last item is the latest. - if values: - return values[-1] or 0 - - # Fallback value of 0. - return 0 - - def serialize(self): - """ - Serializes the timeline into a dict. - - :returns: The serialized timeline. - :rtype: dict - """ - return {"latest": self.latest, "timeline": self.timeline} diff --git a/requirements-dev.txt b/requirements-dev.txt index e97c7dbc..81de83a1 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,44 +4,44 @@ astroid==2.4.2 async-asgi-testclient==1.4.4 async-generator==1.10 asyncmock==0.4.2 -attrs==19.3.0 +attrs==20.2.0 bandit==1.6.2 black==19.10b0 certifi==2020.6.20 chardet==3.0.4 click==7.1.2 -coverage==5.2.1 -coveralls==2.1.1 +coverage==5.3 +coveralls==2.1.2 docopt==0.6.2 gitdb==4.0.5 -gitpython==3.1.7 +gitpython==3.1.8 idna==2.10 importlib-metadata==1.7.0 ; python_version < '3.8' iniconfig==1.0.1 invoke==1.4.1 -isort==4.3.21 +isort==5.5.2 lazy-object-proxy==1.4.3 mccabe==0.6.1 mock==4.0.2 -more-itertools==8.4.0 +more-itertools==8.5.0 multidict==4.7.6 packaging==20.4 pathspec==0.8.0 -pbr==5.4.5 +pbr==5.5.0 pluggy==0.13.1 py==1.9.0 -pylint==2.5.3 +pylint==2.6.0 pyparsing==2.4.7 pytest-asyncio==0.14.0 -pytest-cov==2.10.0 -pytest==6.0.1 +pytest-cov==2.10.1 +pytest==6.0.2 pyyaml==5.3.1 regex==2020.7.14 requests==2.24.0 -responses==0.10.15 +responses==0.12.0 six==1.15.0 smmap==3.0.4 -stevedore==3.2.0 +stevedore==3.2.2 toml==0.10.1 typed-ast==1.4.1 urllib3[secure]==1.25.10 ; python_version >= '3.5' diff --git a/requirements.txt b/requirements.txt index 6ad59401..14706151 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,15 +6,15 @@ aioredis==1.3.1 asgiref==3.2.10 ; python_version >= '3.5' async-timeout==3.0.1 asyncache==0.1.1 -attrs==19.3.0 +attrs==20.2.0 cachetools==4.1.1 certifi==2020.6.20 -cffi==1.14.1 +cffi==1.14.2 chardet==3.0.4 click==7.1.2 -cryptography==3.0 +cryptography==3.1 dataclasses==0.6 ; python_version < '3.7' -fastapi==0.60.1 +fastapi==0.61.1 gunicorn==20.0.4 h11==0.9.0 hiredis==1.1.0 @@ -29,8 +29,8 @@ pyopenssl==19.1.0 python-dateutil==2.8.1 python-dotenv==0.14.0 requests==2.24.0 -scout-apm==2.15.2 -sentry-sdk==0.16.2 +scout-apm==2.16.1 +sentry-sdk==0.17.4 six==1.15.0 starlette==0.13.6 urllib3[secure]==1.25.10 ; python_version >= '3.5' diff --git a/tasks.py b/tasks.py index 0f6d6995..0aba7b92 100644 --- a/tasks.py +++ b/tasks.py @@ -20,7 +20,7 @@ def sort(ctx, targets="."): """Sort module imports.""" print("sorting imports ...") - args = ["isort", "-rc", "--atomic", targets] + args = ["isort", "--atomic", targets] ctx.run(" ".join(args)) @@ -40,7 +40,7 @@ def check(ctx, fmt=False, sort=False, diff=False): # pylint: disable=redefined- sort = True fmt_args = ["black", "--check", "."] - sort_args = ["isort", "-rc", "--check", "."] + sort_args = ["isort", "--check", "."] if diff: fmt_args.append("--diff") diff --git a/tests/test_countries.py b/tests/test_countries.py index e28fb469..a9ce9c19 100644 --- a/tests/test_countries.py +++ b/tests/test_countries.py @@ -2,7 +2,6 @@ from app.utils import countries - """ Todo: * Test cases for capturing of stdout/stderr diff --git a/tests/test_location.py b/tests/test_location.py index 3a78468d..36abeeab 100644 --- a/tests/test_location.py +++ b/tests/test_location.py @@ -3,7 +3,7 @@ import pytest -from app import coordinates, location, timeline +from app import coordinates, location, models def mocked_timeline(*args, **kwargs): @@ -22,7 +22,7 @@ def __init__(self, latest): (2, "Cruise Ship", "XX", "", 15, 100, 1000, 1111, 22222), ], ) -@mock.patch("app.timeline.Timeline", side_effect=mocked_timeline) +@mock.patch("app.models.Timeline", side_effect=mocked_timeline) def test_location_class( mocked_timeline, test_id, @@ -39,9 +39,9 @@ def test_location_class( coords = coordinates.Coordinates(latitude=latitude, longitude=longitude) # Timelines - confirmed = timeline.Timeline(confirmed_latest) - deaths = timeline.Timeline(deaths_latest) - recovered = timeline.Timeline(recovered_latest) + confirmed = models.Timeline(confirmed_latest) + deaths = models.Timeline(deaths_latest) + recovered = models.Timeline(recovered_latest) # Date now. now = datetime.utcnow().isoformat() + "Z" diff --git a/tests/test_timeline.py b/tests/test_timeline.py index 79612f5a..18a914ca 100644 --- a/tests/test_timeline.py +++ b/tests/test_timeline.py @@ -3,7 +3,7 @@ import pytest -from app import timeline +from app import models def test_timeline_class(): @@ -15,7 +15,7 @@ def test_timeline_class(): "1/23/20": 3, } - history_data = timeline.Timeline(history=timeseries) + history_data = models.Timeline(timeline=timeseries) # validate last value assert history_data.latest == 7