diff --git a/backend/Pipfile b/backend/Pipfile index bd9c93b47bdcfa40e58706d9916a10fb471f5b84..b66218d7337480d6e8051b835f36bd0f28aecf31 100644 --- a/backend/Pipfile +++ b/backend/Pipfile @@ -62,6 +62,10 @@ bioapi = {git = "https://github.com/khillion/bioapi.git"} django-admin-list-filter-dropdown = "*" gunicorn = "*" pyfastx = "*" +celery = "*" +redis = "*" +django-health-check = "==3.0.0" +django-redis = "*" [requires] python_version = "3.7" diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock index 8650568a20d8f86afe71e047db85f0898cb983cb..89e7ea505e820c350b4be0667724f67c47c2b388 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "1d936f5c462daf6117f9f94b59599097d1aefa89bdf51bc289a953b7196c45bf" + "sha256": "7a57302feb304e2e7a2b4eee0639908bbd8c66a0c5e86fc82c82f9dec0ed0af1" }, "pipfile-spec": 6, "requires": { @@ -16,17 +16,39 @@ ] }, "default": { + "amqp": { + "hashes": [ + "sha256:6e649ca13a7df3faacdc8bbb280aa9a6602d22fd9d545336077e573a1f4ff3b8", + "sha256:77f1aef9410698d20eaeac5b73a87817365f457a507d82edf292e12cbb83b08d" + ], + "version": "==2.5.2" + }, "asgiref": { "hashes": [ - "sha256:7e06d934a7718bf3975acbf87780ba678957b87c7adc056f13b6215d610695a0", - "sha256:ea448f92fc35a0ef4b1508f53a04c4670255a3f33d22a81c8fc9c872036adbe5" + "sha256:3e4192eaec0758b99722f0b0666d5fbfaa713054d92e8de5b58ba84ec5ce696f", + "sha256:c8f49dd3b42edcc51d09dd2eea8a92b3cfc987ff7e6486be734b4d0cbfd5d315" + ], + "version": "==3.2.5" + }, + "billiard": { + "hashes": [ + "sha256:bff575450859a6e0fbc2f9877d9b715b0bbc07c3565bb7ed2280526a0cdf5ede", + "sha256:d91725ce6425f33a97dfa72fb6bfef0e47d4652acd98a032bd1a7fbf06d5fa6a" ], - "version": "==3.2.3" + "version": "==3.6.3.0" }, "bioapi": { "git": "https://github.com/khillion/bioapi.git", "ref": "699345c6fbd8cc1f25975772d7b6c9a605bf26ff" }, + "celery": { + "hashes": [ + "sha256:108a0bf9018a871620936c33a3ee9f6336a89f8ef0a0f567a9001f4aa361415f", + "sha256:5b4b37e276033fe47575107a2775469f0b721646a08c96ec2c61531e4fe45f2a" + ], + "index": "pypi", + "version": "==4.4.2" + }, "certifi": { "hashes": [ "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3", @@ -59,11 +81,11 @@ }, "django": { "hashes": [ - "sha256:2f1ba1db8648484dd5c238fb62504777b7ad090c81c5f1fd8d5eb5ec21b5f283", - "sha256:c91c91a7ad6ef67a874a4f76f58ba534f9208412692a840e1d125eb5c279cb0a" + "sha256:50b781f6cbeb98f673aa76ed8e572a019a45e52bdd4ad09001072dfd91ab07c8", + "sha256:89e451bfbb815280b137e33e454ddd56481fdaa6334054e6e031041ee1eda360" ], "index": "pypi", - "version": "==3.0.3" + "version": "==3.0.4" }, "django-admin-list-filter-dropdown": { "hashes": [ @@ -91,11 +113,11 @@ }, "django-extensions": { "hashes": [ - "sha256:4524eca892d23fa6e93b0620901983b287ff5dc806f1b978d6a98541f06b9471", - "sha256:936e8e3962024d3c75ea54f4e0248002404ca7ca7fb698430e60b06b5555b4e7" + "sha256:1a03c4e8bade575f8c2be6c76456f8a2be3f9b02ab9f47d3535afa9562dc0493", + "sha256:2699cc1d6fb4bd393c0b5832fea4bc685f2ace5800b3c9ff222b2080f161ac04" ], "index": "pypi", - "version": "==2.2.6" + "version": "==2.2.8" }, "django-filter": { "hashes": [ @@ -105,6 +127,13 @@ "index": "pypi", "version": "==2.2.0" }, + "django-health-check": { + "hashes": [ + "sha256:0b1e12b563626a2ab47f82a3e4dfcf37a62ef6e003de461090f7bcf110682c7c" + ], + "index": "pypi", + "version": "==3.0.0" + }, "django-pandas": { "hashes": [ "sha256:738cc03ffb411eef3eb02334d1f5a5d40697099a92ac59eb39629c08a9c2d6fb", @@ -113,6 +142,14 @@ "index": "pypi", "version": "==0.6.1" }, + "django-redis": { + "hashes": [ + "sha256:a5b1e3ffd3198735e6c529d9bdf38ca3fcb3155515249b98dc4d966b8ddf9d2b", + "sha256:e1aad4cc5bd743d8d0b13d5cae0cef5410eaace33e83bff5fc3a139ad8db50b4" + ], + "index": "pypi", + "version": "==4.11.0" + }, "djangorestframework": { "hashes": [ "sha256:05809fc66e1c997fd9a32ea5730d9f4ba28b109b9da71fccfa5ff241201fd0a4", @@ -131,11 +168,11 @@ }, "drf-yasg": { "hashes": [ - "sha256:4cfec631880ae527a91ec7cd3241aea2f82189f59e2f089119aa687761afb227", - "sha256:504cce09035cf1bace63b84d9d778b772f86bb37d8a71ed6f723346362e633b2" + "sha256:5572e9d5baab9f6b49318169df9789f7399d0e3c7bdac8fdb8dfccf1d5d2b1ca", + "sha256:7d7af27ad16e18507e9392b2afd6b218fbffc432ec8dbea053099a2241e184ff" ], "index": "pypi", - "version": "==1.17.0" + "version": "==1.17.1" }, "gunicorn": { "hashes": [ @@ -147,11 +184,11 @@ }, "idna": { "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb", + "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa" ], "index": "pypi", - "version": "==2.8" + "version": "==2.9" }, "inflection": { "hashes": [ @@ -172,6 +209,13 @@ ], "version": "==2.11.1" }, + "kombu": { + "hashes": [ + "sha256:2d1cda774126a044d91a7ff5fa6d09edf99f46924ab332a810760fe6740e9b76", + "sha256:598e7e749d6ab54f646b74b2d2df67755dee13894f73ab02a2a9feb8870c7cb2" + ], + "version": "==4.6.8" + }, "markupsafe": { "hashes": [ "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", @@ -212,11 +256,11 @@ }, "marshmallow": { "hashes": [ - "sha256:7669b944d6233b81f68739d5826f1176c3841cc31cf6b856841083b5a72f5ca9", - "sha256:c9d277f6092f32300395fb83d343be9f61b5e99d66d22bae1e5e7cd82608fee6" + "sha256:90854221bbb1498d003a0c3cc9d8390259137551917961c8b5258c64026b2f85", + "sha256:ac2e13b30165501b7d41fc0371b8df35944f5849769d136f20e2c5f6cdc6e665" ], "index": "pypi", - "version": "==3.4.0" + "version": "==3.5.1" }, "metagenedb": { "editable": true, @@ -224,58 +268,60 @@ }, "numpy": { "hashes": [ - "sha256:1786a08236f2c92ae0e70423c45e1e62788ed33028f94ca99c4df03f5be6b3c6", - "sha256:17aa7a81fe7599a10f2b7d95856dc5cf84a4eefa45bc96123cbbc3ebc568994e", - "sha256:20b26aaa5b3da029942cdcce719b363dbe58696ad182aff0e5dcb1687ec946dc", - "sha256:2d75908ab3ced4223ccba595b48e538afa5ecc37405923d1fea6906d7c3a50bc", - "sha256:39d2c685af15d3ce682c99ce5925cc66efc824652e10990d2462dfe9b8918c6a", - "sha256:56bc8ded6fcd9adea90f65377438f9fea8c05fcf7c5ba766bef258d0da1554aa", - "sha256:590355aeade1a2eaba17617c19edccb7db8d78760175256e3cf94590a1a964f3", - "sha256:70a840a26f4e61defa7bdf811d7498a284ced303dfbc35acb7be12a39b2aa121", - "sha256:77c3bfe65d8560487052ad55c6998a04b654c2fbc36d546aef2b2e511e760971", - "sha256:9537eecf179f566fd1c160a2e912ca0b8e02d773af0a7a1120ad4f7507cd0d26", - "sha256:9acdf933c1fd263c513a2df3dceecea6f3ff4419d80bf238510976bf9bcb26cd", - "sha256:ae0975f42ab1f28364dcda3dde3cf6c1ddab3e1d4b2909da0cb0191fa9ca0480", - "sha256:b3af02ecc999c8003e538e60c89a2b37646b39b688d4e44d7373e11c2debabec", - "sha256:b6ff59cee96b454516e47e7721098e6ceebef435e3e21ac2d6c3b8b02628eb77", - "sha256:b765ed3930b92812aa698a455847141869ef755a87e099fddd4ccf9d81fffb57", - "sha256:c98c5ffd7d41611407a1103ae11c8b634ad6a43606eca3e2a5a269e5d6e8eb07", - "sha256:cf7eb6b1025d3e169989416b1adcd676624c2dbed9e3bcb7137f51bfc8cc2572", - "sha256:d92350c22b150c1cae7ebb0ee8b5670cc84848f6359cf6b5d8f86617098a9b73", - "sha256:e422c3152921cece8b6a2fb6b0b4d73b6579bd20ae075e7d15143e711f3ca2ca", - "sha256:e840f552a509e3380b0f0ec977e8124d0dc34dc0e68289ca28f4d7c1d0d79474", - "sha256:f3d0a94ad151870978fb93538e95411c83899c9dc63e6fb65542f769568ecfa5" + "sha256:1598a6de323508cfeed6b7cd6c4efb43324f4692e20d1f76e1feec7f59013448", + "sha256:1b0ece94018ae21163d1f651b527156e1f03943b986188dd81bc7e066eae9d1c", + "sha256:2e40be731ad618cb4974d5ba60d373cdf4f1b8dcbf1dcf4d9dff5e212baf69c5", + "sha256:4ba59db1fcc27ea31368af524dcf874d9277f21fd2e1f7f1e2e0c75ee61419ed", + "sha256:59ca9c6592da581a03d42cc4e270732552243dc45e87248aa8d636d53812f6a5", + "sha256:5e0feb76849ca3e83dd396254e47c7dba65b3fa9ed3df67c2556293ae3e16de3", + "sha256:6d205249a0293e62bbb3898c4c2e1ff8a22f98375a34775a259a0523111a8f6c", + "sha256:6fcc5a3990e269f86d388f165a089259893851437b904f422d301cdce4ff25c8", + "sha256:82847f2765835c8e5308f136bc34018d09b49037ec23ecc42b246424c767056b", + "sha256:87902e5c03355335fc5992a74ba0247a70d937f326d852fc613b7f53516c0963", + "sha256:9ab21d1cb156a620d3999dd92f7d1c86824c622873841d6b080ca5495fa10fef", + "sha256:a1baa1dc8ecd88fb2d2a651671a84b9938461e8a8eed13e2f0a812a94084d1fa", + "sha256:a244f7af80dacf21054386539699ce29bcc64796ed9850c99a34b41305630286", + "sha256:a35af656a7ba1d3decdd4fae5322b87277de8ac98b7d9da657d9e212ece76a61", + "sha256:b1fe1a6f3a6f355f6c29789b5927f8bd4f134a4bd9a781099a7c4f66af8850f5", + "sha256:b5ad0adb51b2dee7d0ee75a69e9871e2ddfb061c73ea8bc439376298141f77f5", + "sha256:ba3c7a2814ec8a176bb71f91478293d633c08582119e713a0c5351c0f77698da", + "sha256:cd77d58fb2acf57c1d1ee2835567cd70e6f1835e32090538f17f8a3a99e5e34b", + "sha256:cdb3a70285e8220875e4d2bc394e49b4988bdb1298ffa4e0bd81b2f613be397c", + "sha256:deb529c40c3f1e38d53d5ae6cd077c21f1d49e13afc7936f7f868455e16b64a0", + "sha256:e7894793e6e8540dbeac77c87b489e331947813511108ae097f1715c018b8f3d" ], "index": "pypi", - "version": "==1.18.1" + "version": "==1.18.2" }, "packaging": { "hashes": [ - "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73", - "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334" + "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", + "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" ], "index": "pypi", - "version": "==20.1" + "version": "==20.3" }, "pandas": { "hashes": [ - "sha256:18bbce2e69855d42397486ee0bb79cb0e4c94af6679fd9392e32ffdb7fcfade0", - "sha256:35d07389efaf3c478d93725a226941c7fc14714814ba77d6d43b2c9e63ef4af5", - "sha256:3ea6cc86931f57f18b1240572216f09922d91b19ab8a01cf24734394a3db3bec", - "sha256:46b0a146e4ba744e350847244767ef297950e9ce02424734b2dd0befd77d9aff", - "sha256:66c1a49b47c0953dbc6864a6d2578c4c24610f6bb8e4ab165d49b8371aa7745f", - "sha256:6d5c2d2a3e42100700bac7fe762c17ba0a04d0355feac04bce74a1aa6c8be164", - "sha256:ab1aa2c50b7c6ba0eccebb146b4d80ed7f5804897b8d54ccddbe49f28c881a94", - "sha256:ae1ec10e34d22b0f699e38f346381630cae89d5050a2a61315a2be09e3435f99", - "sha256:b578df33338a09707bfe3e3939c9d46700948133bf829357c3c46795055c9376", - "sha256:bad77cf498362590ef3a30bc9e769f4fe4399d853861a1ddbefeea8cbf39906c", - "sha256:c36e4d44d34eaa503776a8fb57ba1305e680e178458c050c2fd8de67604fa209", - "sha256:d76a8ec22adf0323d362dac8c900b2c66e06eab984ecf04ef072866d8ab6c538", - "sha256:e8be4f6da608930c0d565240bfbe04fc6f5764d6a9214b02c6231cd5e223591d", - "sha256:f66c63f357ac31c913f4917f55348ce99c639031567c3284f01dff605da58264" + "sha256:07c1b58936b80eafdfe694ce964ac21567b80a48d972879a359b3ebb2ea76835", + "sha256:0ebe327fb088df4d06145227a4aa0998e4f80a9e6aed4b61c1f303bdfdf7c722", + "sha256:11c7cb654cd3a0e9c54d81761b5920cdc86b373510d829461d8f2ed6d5905266", + "sha256:12f492dd840e9db1688126216706aa2d1fcd3f4df68a195f9479272d50054645", + "sha256:167a1315367cea6ec6a5e11e791d9604f8e03f95b57ad227409de35cf850c9c5", + "sha256:1a7c56f1df8d5ad8571fa251b864231f26b47b59cbe41aa5c0983d17dbb7a8e4", + "sha256:1fa4bae1a6784aa550a1c9e168422798104a85bf9c77a1063ea77ee6f8452e3a", + "sha256:32f42e322fb903d0e189a4c10b75ba70d90958cc4f66a1781ed027f1a1d14586", + "sha256:387dc7b3c0424327fe3218f81e05fc27832772a5dffbed385013161be58df90b", + "sha256:6597df07ea361231e60c00692d8a8099b519ed741c04e65821e632bc9ccb924c", + "sha256:743bba36e99d4440403beb45a6f4f3a667c090c00394c176092b0b910666189b", + "sha256:858a0d890d957ae62338624e4aeaf1de436dba2c2c0772570a686eaca8b4fc85", + "sha256:863c3e4b7ae550749a0bb77fa22e601a36df9d2905afef34a6965bed092ba9e5", + "sha256:a210c91a02ec5ff05617a298ad6f137b9f6f5771bf31f2d6b6367d7f71486639", + "sha256:ca84a44cf727f211752e91eab2d1c6c1ab0f0540d5636a8382a3af428542826e", + "sha256:d234bcf669e8b4d6cbcd99e3ce7a8918414520aeb113e2a81aeb02d0a533d7f7" ], "index": "pypi", - "version": "==1.0.0" + "version": "==1.0.3" }, "psycopg2": { "hashes": [ @@ -298,38 +344,41 @@ }, "pyfastx": { "hashes": [ - "sha256:0591e6eae1bfa0b810869c53b9568d617d3e3958716aafafb67a0966c60aefc2", - "sha256:083decb8842aadf2f45f62ad24bae177c2cdd513fe87dd7c3a3ef1ef9d10165e", - "sha256:106739aa435fddfb5bd2b5decc7944d3d60781eead76db33223e98e6f2efe44e", - "sha256:1a046a7e9be2c2e61b8681856bb73bea6a3e0bdd13bb8d80e435afc5142373fa", - "sha256:51f35810d8838fe11f9f59c453abb6f339e02c43e6ae06c5869aa7d34eea0bb7", - "sha256:5af16d9fdf87eccc8eb2ecab5443471df024d34aed0b383ddc982b856ab568d8", - "sha256:5e83aa11a3ed0cdf8861845be1f15bc20a4dff18421b4ab41121d5ef0799eec8", - "sha256:5f1c69e2e3ea2ff57e8c0549e3c2f217ea2abf65fe0c6581cee97b62bc893eff", - "sha256:5feed90623534aa13a28da59c2f139d5bba11a759957ced9d106095183d6b280", - "sha256:728429244168d828661e40dcf38a42fa43511fbffa935b82de6906441fdc4fa2", - "sha256:79f252f6c8591524828233727b519dab1151fed978d44579222f1bb70a8a43cc", - "sha256:8012bb110f5c2699daf605af1454caa770f3f83bcc83881b8c69c556ea3cd52b", - "sha256:a9c179806d3c1e424701e80145bee9feaac624044a00f41e317d4ac3e40a3c51", - "sha256:aa27439c0677cf720c66e4651a8d1bdc31d68c6befd832a5f32cadfb2ae548e6", - "sha256:aadf1d72c6cd551f89eb0c413ab32debe5e2fa0e339538cd25e1844023c1f494", - "sha256:ae4b8f7d36377b4a9f061989e3180dc05123aacfc8d60ad7c89493a879fced22", - "sha256:bd685d9a7c34664a99ddf5003c831fa09e746fc7284bf79e14c5d0069a2c62af", - "sha256:c0c95252198f07727b4aa28bce34034116db6cc80825a88965ad95207d925a61", - "sha256:c65b0d7eab325b1e000619c6c98bd45a43ac84b2766209ef50dc96fd5959d425", - "sha256:c8536017acec478da300f99ed21b2efa5dc88b0230ddd1f0347eaf40808c86cc", - "sha256:c8e1256c5f24fb1ba98a528b38898c8c67e362df056a135bb0bce5a7059db3c0", - "sha256:cfbe01aba992565126b7320020bfdf07ef86f1459a02c2637074fed8e6c1d72f", - "sha256:d25e0d5e6a1977211be5c5b30619a187decba421c6edb854d1627f817862cdc8", - "sha256:d5ee6dc33ce948fea5f78602305e30204b3c9f0c13aa9eaf926084ae94c67e16", - "sha256:dc1fb97ab79155ff69180f50a3fc3e8fc8f09ada4fce981ae791c65dea91bb5b", - "sha256:df4378b8c0efe960c267c52dab34c74f0784b70afef048658f29171bafb2cddb", - "sha256:e0a03ec92994c5f1e5cfb192adbb81e5f0bab28929d60ac0fbf4db7c17bccdac", - "sha256:e4154e8f0c95f2abc02047ae262cb6e354bf8ec9377994fbb96afee5887a7ba5", - "sha256:f82e078b8e892a0d1839610fd66df3fbaf1c165b2e554bdb7d46bb815dc5c487" + "sha256:0328609e01dd9a19bac95c6a22cf06ea5059c412f3990b9acb3ae1f4c8abed22", + "sha256:0beef819e1df6f688a99319434d3b48a359f57f794330f79b97315847ea87d06", + "sha256:10a010f5623e4977e79a23f77543cdc770d03f2eecdc37aac89469c8ef869358", + "sha256:15493339aec2d1daa553a83a5538813c9ccd6c62e4d780e382dd499f6fc0c050", + "sha256:17264ef3a8efdcba50d9a16528bd5e36dc9226a935590f3516a6a9ef20996d15", + "sha256:183dbbecb1772535571b231a5d27dd0f12c56efcca5280fee56b898d0bab6400", + "sha256:1e0e547eac06fcb3a5e527ccd3e514ff90fdcae6dd4ceee8473c2d711178a5fc", + "sha256:20cdbfa4e15fc4c393d3aa8b903d43dd9c16256f86aed71b9415403b4efff29e", + "sha256:24ace216f3306857fdd362a6929e40f7584317e9c9fbfba5d10395194e74a044", + "sha256:2eab5ac8a0224a729fa78591e0e3d9e2bbba7affa94f13230114d887ede74927", + "sha256:3470ceca666c99ed0daefeb9678dfdf4ebabdd8ba69fec57f27b25f7e4ea7a30", + "sha256:3c51a020fda3ca3288014a404cf7241e9ce9f1dba65b5e0ea04593211bef0ad0", + "sha256:3f8c156dee670d8d3730339d3dfa47d08330619ac1439db0ac652d40ab3f3922", + "sha256:4162dda223004fb8c79aee023fe8808eacfcf274bb0dc8d0cf17775f9a5dab1c", + "sha256:44673be899620a7b1be9f2b250f5da95d86b67de975d7ff74c56f23e0c7b60d5", + "sha256:521e6ebc1f1b90143f71605a896615f4e00c3f99a0144cd695dd2d00aadb1969", + "sha256:595fc96a8b469ab0ccc7d66ff64e1dbb0dbd9e9e48a750bfc24fe6b1c10a9e5e", + "sha256:6b5a42b6a40081dd7dab1bb72514abf6357142dc429a47b99c73ae8a32b6d34e", + "sha256:6de0c48aed14ab2a7c515556ec2a9013762eecb7721640dcf28ede16e23ee1cf", + "sha256:7ec918b16b2e38052962e0d3426814ae642475af2863d4a6537712f7ea864fb3", + "sha256:81318a2cf62f8135eab955de86b4cd1cb3dc35c9ef8dcfd30b8edfc5ff479a84", + "sha256:9aa5286ea865cddbb40385c25fa3d60ac1de55991f4039319f34d86eede1040d", + "sha256:a059356cfea673b38224e977dbde8249dbcfe2e2fa2eb3d927d2a01b49e9af64", + "sha256:a7fcc92261d23e325860b0bb3b2a4289fe94ddd595570d4d4ca7c9faad3f6216", + "sha256:adb3af73bc220836c719697d2b5f4bc91ae86f5d719a48aa6a8dd0a720a656a6", + "sha256:b77fc45828c5c64865a2d69c2cbc345ea37c76c412191fd9a5a3d9ca93b653cd", + "sha256:bffb7586953e04ce2f2345489c828ee3e341f23cf4ea351b081954ff54754bcd", + "sha256:c6d3afefc2a40364895a457aa2e47185533d1ad385a4a763cd0f36700650c8c1", + "sha256:ccfa06440c519ab4ef19ccc3050c338dd0083eb52b9ea7a64a1e0d687f40922f", + "sha256:cf0f8c6c7f0ba1f8e29edcdd3090f3fcde6406f269606bd699a57218e10d8e7a", + "sha256:dba0896a614dcc4b60476d12470827833ece81a00224ef1ea505a50eacaf3f75", + "sha256:e95a0ec099630fe31d38a15274691a2441851f4f17007ff87d5ab85ad80eacce" ], "index": "pypi", - "version": "==0.6.5" + "version": "==0.6.8" }, "pyjwt": { "hashes": [ @@ -369,20 +418,28 @@ "index": "pypi", "version": "==2019.3" }, + "redis": { + "hashes": [ + "sha256:0dcfb335921b88a850d461dc255ff4708294943322bd55de6cfd68972490ca1f", + "sha256:b205cffd05ebfd0a468db74f0eedbff8df1a7bfc47521516ade4692991bb0833" + ], + "index": "pypi", + "version": "==3.4.1" + }, "requests": { "hashes": [ - "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", - "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" + "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee", + "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6" ], "index": "pypi", - "version": "==2.22.0" + "version": "==2.23.0" }, "ruamel.yaml": { "hashes": [ - "sha256:9d59fa89985c55155d35c886663e357813404ae8f94638cb673135b8c8c1a7c7", - "sha256:dba517a7e330b6caf476b757022d21efa13c32694bfba1e057ce59a374f18f0a" + "sha256:0962fd7999e064c4865f96fb1e23079075f4a2a14849bcdc5cdba53a24f9759b", + "sha256:099c644a778bf72ffa00524f78dd0b6476bca94a1da344130f4bf3381ce5b954" ], - "version": "==0.16.7" + "version": "==0.16.10" }, "ruamel.yaml.clib": { "hashes": [ @@ -406,7 +463,7 @@ "sha256:ed5b3698a2bb241b7f5cbbe277eaa7fe48b07a58784fba4f75224fd066d253ad", "sha256:f9dcc1ae73f36e8059589b601e8e4776b9976effd76c21ad6a855a74318efd6e" ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.8'", + "markers": "platform_python_implementation == 'CPython' and python_version < '3.9'", "version": "==0.2.0" }, "six": { @@ -419,11 +476,11 @@ }, "sqlparse": { "hashes": [ - "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177", - "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873" + "sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e", + "sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548" ], "index": "pypi", - "version": "==0.3.0" + "version": "==0.3.1" }, "text-unidecode": { "hashes": [ @@ -446,6 +503,13 @@ ], "index": "pypi", "version": "==1.25.8" + }, + "vine": { + "hashes": [ + "sha256:133ee6d7a9016f177ddeaf191c1f58421a1dcc6ee9a42c58b34bed40e1d2cd87", + "sha256:ea4947cc56d1fd6f2095c8d543ee25dad966f78692528e68b4fada11ba3f98af" + ], + "version": "==1.3.0" } }, "develop": { @@ -454,7 +518,7 @@ "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0", "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71" ], - "markers": "sys_platform == 'darwin'", + "markers": "platform_system == 'Darwin'", "version": "==0.1.0" }, "astroid": { @@ -489,47 +553,47 @@ }, "bleach": { "hashes": [ - "sha256:213336e49e102af26d9cde77dd2d0397afabc5a6bf2fed985dc35b5d1e285a16", - "sha256:3fdf7f77adcf649c9911387df51254b813185e32b2c6619f690b593a617e19fa" + "sha256:53165a6596e7899c4338d847315fec508110a53bd6fd15c127c2e0d0860264e3", + "sha256:f8dfd8a7e26443e986c4e44df31870da8e906ea61096af06ba5d5cc2d519842a" ], - "version": "==3.1.0" + "version": "==3.1.3" }, "coverage": { "hashes": [ - "sha256:15cf13a6896048d6d947bf7d222f36e4809ab926894beb748fc9caa14605d9c3", - "sha256:1daa3eceed220f9fdb80d5ff950dd95112cd27f70d004c7918ca6dfc6c47054c", - "sha256:1e44a022500d944d42f94df76727ba3fc0a5c0b672c358b61067abb88caee7a0", - "sha256:25dbf1110d70bab68a74b4b9d74f30e99b177cde3388e07cc7272f2168bd1477", - "sha256:3230d1003eec018ad4a472d254991e34241e0bbd513e97a29727c7c2f637bd2a", - "sha256:3dbb72eaeea5763676a1a1efd9b427a048c97c39ed92e13336e726117d0b72bf", - "sha256:5012d3b8d5a500834783689a5d2292fe06ec75dc86ee1ccdad04b6f5bf231691", - "sha256:51bc7710b13a2ae0c726f69756cf7ffd4362f4ac36546e243136187cfcc8aa73", - "sha256:527b4f316e6bf7755082a783726da20671a0cc388b786a64417780b90565b987", - "sha256:722e4557c8039aad9592c6a4213db75da08c2cd9945320220634f637251c3894", - "sha256:76e2057e8ffba5472fd28a3a010431fd9e928885ff480cb278877c6e9943cc2e", - "sha256:77afca04240c40450c331fa796b3eab6f1e15c5ecf8bf2b8bee9706cd5452fef", - "sha256:7afad9835e7a651d3551eab18cbc0fdb888f0a6136169fbef0662d9cdc9987cf", - "sha256:9bea19ac2f08672636350f203db89382121c9c2ade85d945953ef3c8cf9d2a68", - "sha256:a8b8ac7876bc3598e43e2603f772d2353d9931709345ad6c1149009fd1bc81b8", - "sha256:b0840b45187699affd4c6588286d429cd79a99d509fe3de0f209594669bb0954", - "sha256:b26aaf69713e5674efbde4d728fb7124e429c9466aeaf5f4a7e9e699b12c9fe2", - "sha256:b63dd43f455ba878e5e9f80ba4f748c0a2156dde6e0e6e690310e24d6e8caf40", - "sha256:be18f4ae5a9e46edae3f329de2191747966a34a3d93046dbdf897319923923bc", - "sha256:c312e57847db2526bc92b9bfa78266bfbaabac3fdcd751df4d062cd4c23e46dc", - "sha256:c60097190fe9dc2b329a0eb03393e2e0829156a589bd732e70794c0dd804258e", - "sha256:c62a2143e1313944bf4a5ab34fd3b4be15367a02e9478b0ce800cb510e3bbb9d", - "sha256:cc1109f54a14d940b8512ee9f1c3975c181bbb200306c6d8b87d93376538782f", - "sha256:cd60f507c125ac0ad83f05803063bed27e50fa903b9c2cfee3f8a6867ca600fc", - "sha256:d513cc3db248e566e07a0da99c230aca3556d9b09ed02f420664e2da97eac301", - "sha256:d649dc0bcace6fcdb446ae02b98798a856593b19b637c1b9af8edadf2b150bea", - "sha256:d7008a6796095a79544f4da1ee49418901961c97ca9e9d44904205ff7d6aa8cb", - "sha256:da93027835164b8223e8e5af2cf902a4c80ed93cb0909417234f4a9df3bcd9af", - "sha256:e69215621707119c6baf99bda014a45b999d37602cb7043d943c76a59b05bf52", - "sha256:ea9525e0fef2de9208250d6c5aeeee0138921057cd67fcef90fbed49c4d62d37", - "sha256:fca1669d464f0c9831fd10be2eef6b86f5ebd76c724d1e0706ebdff86bb4adf0" + "sha256:03f630aba2b9b0d69871c2e8d23a69b7fe94a1e2f5f10df5049c0df99db639a0", + "sha256:046a1a742e66d065d16fb564a26c2a15867f17695e7f3d358d7b1ad8a61bca30", + "sha256:0a907199566269e1cfa304325cc3b45c72ae341fbb3253ddde19fa820ded7a8b", + "sha256:165a48268bfb5a77e2d9dbb80de7ea917332a79c7adb747bd005b3a07ff8caf0", + "sha256:1b60a95fc995649464e0cd48cecc8288bac5f4198f21d04b8229dc4097d76823", + "sha256:1f66cf263ec77af5b8fe14ef14c5e46e2eb4a795ac495ad7c03adc72ae43fafe", + "sha256:2e08c32cbede4a29e2a701822291ae2bc9b5220a971bba9d1e7615312efd3037", + "sha256:3844c3dab800ca8536f75ae89f3cf566848a3eb2af4d9f7b1103b4f4f7a5dad6", + "sha256:408ce64078398b2ee2ec08199ea3fcf382828d2f8a19c5a5ba2946fe5ddc6c31", + "sha256:443be7602c790960b9514567917af538cac7807a7c0c0727c4d2bbd4014920fd", + "sha256:4482f69e0701139d0f2c44f3c395d1d1d37abd81bfafbf9b6efbe2542679d892", + "sha256:4a8a259bf990044351baf69d3b23e575699dd60b18460c71e81dc565f5819ac1", + "sha256:513e6526e0082c59a984448f4104c9bf346c2da9961779ede1fc458e8e8a1f78", + "sha256:5f587dfd83cb669933186661a351ad6fc7166273bc3e3a1531ec5c783d997aac", + "sha256:62061e87071497951155cbccee487980524d7abea647a1b2a6eb6b9647df9006", + "sha256:641e329e7f2c01531c45c687efcec8aeca2a78a4ff26d49184dce3d53fc35014", + "sha256:65a7e00c00472cd0f59ae09d2fb8a8aaae7f4a0cf54b2b74f3138d9f9ceb9cb2", + "sha256:6ad6ca45e9e92c05295f638e78cd42bfaaf8ee07878c9ed73e93190b26c125f7", + "sha256:73aa6e86034dad9f00f4bbf5a666a889d17d79db73bc5af04abd6c20a014d9c8", + "sha256:7c9762f80a25d8d0e4ab3cb1af5d9dffbddb3ee5d21c43e3474c84bf5ff941f7", + "sha256:85596aa5d9aac1bf39fe39d9fa1051b0f00823982a1de5766e35d495b4a36ca9", + "sha256:86a0ea78fd851b313b2e712266f663e13b6bc78c2fb260b079e8b67d970474b1", + "sha256:8a620767b8209f3446197c0e29ba895d75a1e272a36af0786ec70fe7834e4307", + "sha256:922fb9ef2c67c3ab20e22948dcfd783397e4c043a5c5fa5ff5e9df5529074b0a", + "sha256:9fad78c13e71546a76c2f8789623eec8e499f8d2d799f4b4547162ce0a4df435", + "sha256:a37c6233b28e5bc340054cf6170e7090a4e85069513320275a4dc929144dccf0", + "sha256:c3fc325ce4cbf902d05a80daa47b645d07e796a80682c1c5800d6ac5045193e5", + "sha256:cda33311cb9fb9323958a69499a667bd728a39a7aa4718d7622597a44c4f1441", + "sha256:db1d4e38c9b15be1521722e946ee24f6db95b189d1447fa9ff18dd16ba89f732", + "sha256:eda55e6e9ea258f5e4add23bcf33dc53b2c319e70806e180aecbff8d90ea24de", + "sha256:f372cdbb240e09ee855735b9d85e7f50730dcfb6296b74b95a3e5dea0615c4c1" ], "index": "pypi", - "version": "==5.0.3" + "version": "==5.0.4" }, "cycler": { "hashes": [ @@ -541,10 +605,10 @@ }, "decorator": { "hashes": [ - "sha256:54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce", - "sha256:5d19b92a3c8f7f101c8dd86afd86b0f061a8ce4540ab8cd401fa2542756bce6d" + "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760", + "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7" ], - "version": "==4.4.1" + "version": "==4.4.2" }, "defusedxml": { "hashes": [ @@ -571,10 +635,10 @@ }, "faker": { "hashes": [ - "sha256:047d4d1791bfb3756264da670d99df13d799bb36e7d88774b1585a82d05dbaec", - "sha256:1b1a58961683b30c574520d0c739c4443e0ef6a185c04382e8cc888273dbebed" + "sha256:2d3f866ef25e1a5af80e7b0ceeacc3c92dec5d0fdbad3e2cb6adf6e60b22188f", + "sha256:b89aa33837498498e15c709eb40c31386408a901a53c7a5e12a425737a767976" ], - "version": "==4.0.0" + "version": "==4.0.2" }, "flake8": { "hashes": [ @@ -607,11 +671,11 @@ }, "ipython": { "hashes": [ - "sha256:d9459e7237e2e5858738ff9c3e26504b79899b58a6d49e574d352493d80684c6", - "sha256:f6689108b1734501d3b59c84427259fd5ac5141afe2e846cfa8598eb811886c9" + "sha256:ca478e52ae1f88da0102360e57e528b92f3ae4316aabac80a2cd7f7ab2efb48a", + "sha256:eb8d075de37f678424527b5ef6ea23f7b80240ca031c2dd6de5879d687a65333" ], "markers": "python_version >= '3.3'", - "version": "==7.12.0" + "version": "==7.13.0" }, "ipython-genutils": { "hashes": [ @@ -666,10 +730,10 @@ }, "jupyter-client": { "hashes": [ - "sha256:60e6faec1031d63df57f1cc671ed673dced0ed420f4377ea33db37b1c188b910", - "sha256:d0c077c9aaa4432ad485e7733e4d91e48f87b4f4bab7d283d42bb24cbbba0a0f" + "sha256:589dcfb409717cc1baaae5e3d2f7b7f5920763bf039adf4a741aee17e44947af", + "sha256:61429e7d2c4b385135d31054944dd3f23a1c6affb0ca3d4328d42fc9ba82b7f5" ], - "version": "==5.3.4" + "version": "==6.1.0" }, "jupyter-console": { "hashes": [ @@ -680,10 +744,10 @@ }, "jupyter-core": { "hashes": [ - "sha256:464769f7387d7a62a2403d067f1ddc616655b7f77f5d810c0dd62cb54bfd0fb9", - "sha256:a183e0ec2e8f6adddf62b0a3fc6a2237e3e0056d381e536d3e7c7ecc3067e244" + "sha256:394fd5dd787e7c8861741880bdf8a00ce39f95de5d18e579c74b882522219e7e", + "sha256:a4ee613c060fe5697d913416fc9d553599c05e4492d58fac1192c9a6844abb21" ], - "version": "==4.6.1" + "version": "==4.6.3" }, "kiwisolver": { "hashes": [ @@ -809,11 +873,11 @@ }, "mock": { "hashes": [ - "sha256:56358390ebde40c927ec5666626be7d4310a2533ae3aed5c2dd7b55b80687f48", - "sha256:8fff3fd7c5796ea78ae2847f32e87ad4e111e03fef6e90d03b5efb4882211d78" + "sha256:3f9b2c0196c60d21838f307f5825a7b86b678cedc58ab9e50a8988187b4d81e0", + "sha256:dd33eb70232b6118298d516bbcecd26704689c386594f0f3c4f13867b2c56f72" ], "index": "pypi", - "version": "==4.0.0" + "version": "==4.0.2" }, "more-itertools": { "hashes": [ @@ -846,11 +910,11 @@ }, "packaging": { "hashes": [ - "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73", - "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334" + "sha256:3c292b474fda1671ec57d46d739d072bfd495a4f51ad01a055121d81e952b7a3", + "sha256:82f77b9bee21c1bafbf35a84905d604d5d1223801d639cf3ed140bd651c08752" ], "index": "pypi", - "version": "==20.1" + "version": "==20.3" }, "pandocfilters": { "hashes": [ @@ -860,10 +924,10 @@ }, "parso": { "hashes": [ - "sha256:56b2105a80e9c4df49de85e125feb6be69f49920e121406f15e7acde6c9dfc57", - "sha256:951af01f61e6dccd04159042a0706a31ad437864ec6e25d0d7a96a9fbb9b0095" + "sha256:0c5659e0c6eba20636f99a04f469798dca8da279645ce5c387315b2c23912157", + "sha256:8515fc12cfca6ee3aa59138741fc5624d62340c97e401c74875769948d4f2995" ], - "version": "==0.6.1" + "version": "==0.6.2" }, "pexpect": { "hashes": [ @@ -896,10 +960,10 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:a402e9bf468b63314e37460b68ba68243d55b2f8c4d0192f85a019af3945050e", - "sha256:c93e53af97f630f12f5f62a3274e79527936ed466f038953dfa379d4941f651a" + "sha256:859e1b205b6cf6a51fa57fa34202e45365cf58f8338f0ee9f4e84a4165b37d5b", + "sha256:ebe6b1b08c888b84c50d7f93dee21a09af39860144ff6130aadbd61ae8d29783" ], - "version": "==3.0.3" + "version": "==3.0.4" }, "ptyprocess": { "hashes": [ @@ -935,10 +999,10 @@ }, "pygments": { "hashes": [ - "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b", - "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe" + "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44", + "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324" ], - "version": "==2.5.2" + "version": "==2.6.1" }, "pylint": { "hashes": [ @@ -963,11 +1027,11 @@ }, "pytest": { "hashes": [ - "sha256:0d5fe9189a148acc3c3eb2ac8e1ac0742cb7618c084f3d228baaec0c254b318d", - "sha256:ff615c761e25eb25df19edddc0b970302d2a9091fbce0e7213298d85fb61fef6" + "sha256:0e5b30f5cb04e887b91b1ee519fa3d89049595f428c1db76e73bd7f17b09b172", + "sha256:84dde37075b8805f3d1f392cc47e38a0e59518fb46a431cfdaf7cf1ce805f970" ], "index": "pypi", - "version": "==5.3.5" + "version": "==5.4.1" }, "pytest-cov": { "hashes": [ @@ -1002,43 +1066,50 @@ }, "pyzmq": { "hashes": [ - "sha256:01b588911714a6696283de3904f564c550c9e12e8b4995e173f1011755e01086", - "sha256:0573b9790aa26faff33fba40f25763657271d26f64bffb55a957a3d4165d6098", - "sha256:0fa82b9fc3334478be95a5566f35f23109f763d1669bb762e3871a8fa2a4a037", - "sha256:1e59b7b19396f26e360f41411a5d4603356d18871049cd7790f1a7d18f65fb2c", - "sha256:2a294b4f44201bb21acc2c1a17ff87fbe57b82060b10ddb00ac03e57f3d7fcfa", - "sha256:355b38d7dd6f884b8ee9771f59036bcd178d98539680c4f87e7ceb2c6fd057b6", - "sha256:4b73d20aec63933bbda7957e30add233289d86d92a0bb9feb3f4746376f33527", - "sha256:4ec47f2b50bdb97df58f1697470e5c58c3c5109289a623e30baf293481ff0166", - "sha256:5541dc8cad3a8486d58bbed076cb113b65b5dd6b91eb94fb3e38a3d1d3022f20", - "sha256:6fca7d11310430e751f9832257866a122edf9d7b635305c5d8c51f74a5174d3d", - "sha256:7369656f89878455a5bcd5d56ca961884f5d096268f71c0750fc33d6732a25e5", - "sha256:75d73ee7ca4b289a2a2dfe0e6bd8f854979fc13b3fe4ebc19381be3b04e37a4a", - "sha256:80c928d5adcfa12346b08d31360988d843b54b94154575cccd628f1fe91446bc", - "sha256:83ce18b133dc7e6789f64cb994e7376c5aa6b4aeced993048bf1d7f9a0fe6d3a", - "sha256:8b8498ceee33a7023deb2f3db907ca41d6940321e282297327a9be41e3983792", - "sha256:8c69a6cbfa94da29a34f6b16193e7c15f5d3220cb772d6d17425ff3faa063a6d", - "sha256:8ff946b20d13a99dc5c21cb76f4b8b253eeddf3eceab4218df8825b0c65ab23d", - "sha256:972d723a36ab6a60b7806faa5c18aa3c080b7d046c407e816a1d8673989e2485", - "sha256:a6c9c42bbdba3f9c73aedbb7671815af1943ae8073e532c2b66efb72f39f4165", - "sha256:aa3872f2ebfc5f9692ef8957fe69abe92d905a029c0608e45ebfcd451ad30ab5", - "sha256:cf08435b14684f7f2ca2df32c9df38a79cdc17c20dc461927789216cb43d8363", - "sha256:d30db4566177a6205ed1badb8dbbac3c043e91b12a2db5ef9171b318c5641b75", - "sha256:d5ac84f38575a601ab20c1878818ffe0d09eb51d6cb8511b636da46d0fd8949a", - "sha256:e37f22eb4bfbf69cd462c7000616e03b0cdc1b65f2d99334acad36ea0e4ddf6b", - "sha256:e6549dd80de7b23b637f586217a4280facd14ac01e9410a037a13854a6977299", - "sha256:ed6205ca0de035f252baa0fd26fdd2bc8a8f633f92f89ca866fd423ff26c6f25", - "sha256:efdde21febb9b5d7a8e0b87ea2549d7e00fda1936459cfb27fb6fca0c36af6c1", - "sha256:f4e72646bfe79ff3adbf1314906bbd2d67ef9ccc71a3a98b8b2ccbcca0ab7bec" - ], - "version": "==18.1.1" + "sha256:0bbc1728fe4314b4ca46249c33873a390559edac7c217ec7001b5e0c34a8fb7f", + "sha256:1e076ad5bd3638a18c376544d32e0af986ca10d43d4ce5a5d889a8649f0d0a3d", + "sha256:242d949eb6b10197cda1d1cec377deab1d5324983d77e0d0bf9dc5eb6d71a6b4", + "sha256:26f4ae420977d2a8792d7c2d7bda43128b037b5eeb21c81951a94054ad8b8843", + "sha256:32234c21c5e0a767c754181c8112092b3ddd2e2a36c3f76fc231ced817aeee47", + "sha256:3f12ce1e9cc9c31497bd82b207e8e86ccda9eebd8c9f95053aae46d15ccd2196", + "sha256:4557d5e036e6d85715b4b9fdb482081398da1d43dc580d03db642b91605b409f", + "sha256:4f562dab21c03c7aa061f63b147a595dbe1006bf4f03213272fc9f7d5baec791", + "sha256:5e071b834051e9ecb224915398f474bfad802c2fff883f118ff5363ca4ae3edf", + "sha256:5e1f65e576ab07aed83f444e201d86deb01cd27dcf3f37c727bc8729246a60a8", + "sha256:5f10a31f288bf055be76c57710807a8f0efdb2b82be6c2a2b8f9a61f33a40cea", + "sha256:6aaaf90b420dc40d9a0e1996b82c6a0ff91d9680bebe2135e67c9e6d197c0a53", + "sha256:75238d3c16cab96947705d5709187a49ebb844f54354cdf0814d195dd4c045de", + "sha256:7f7e7b24b1d392bb5947ba91c981e7d1a43293113642e0d8870706c8e70cdc71", + "sha256:84b91153102c4bcf5d0f57d1a66a0f03c31e9e6525a5f656f52fc615a675c748", + "sha256:944f6bb5c63140d76494467444fd92bebd8674236837480a3c75b01fe17df1ab", + "sha256:a1f957c20c9f51d43903881399b078cddcf710d34a2950e88bce4e494dcaa4d1", + "sha256:a49fd42a29c1cc1aa9f461c5f2f5e0303adba7c945138b35ee7f4ab675b9f754", + "sha256:a99ae601b4f6917985e9bb071549e30b6f93c72f5060853e197bdc4b7d357e5f", + "sha256:ad48865a29efa8a0cecf266432ea7bc34e319954e55cf104be0319c177e6c8f5", + "sha256:b08e425cf93b4e018ab21dc8fdbc25d7d0502a23cc4fea2380010cf8cf11e462", + "sha256:bb10361293d96aa92be6261fa4d15476bca56203b3a11c62c61bd14df0ef89ba", + "sha256:bd1a769d65257a7a12e2613070ca8155ee348aa9183f2aadf1c8b8552a5510f5", + "sha256:cb3b7156ef6b1a119e68fbe3a54e0a0c40ecacc6b7838d57dd708c90b62a06dc", + "sha256:e8e4efb52ec2df8d046395ca4c84ae0056cf507b2f713ec803c65a8102d010de", + "sha256:f37c29da2a5b0c5e31e6f8aab885625ea76c807082f70b2d334d3fd573c3100a", + "sha256:f4d558bc5668d2345773a9ff8c39e2462dafcb1f6772a2e582fbced389ce527f", + "sha256:f5b6d015587a1d6f582ba03b226a9ddb1dfb09878b3be04ef48b01b7d4eb6b2a" + ], + "version": "==19.0.0" }, "qtconsole": { "hashes": [ - "sha256:4de25b8895957d23ceacf2526b6f0a76da4e60e60115611930d387c853f3cb08", - "sha256:654f423662e7dfe6a9b26fac8ec76aedcf742c339909ac49f1f0c1a1b744bcd1" + "sha256:5c8889015ed7eca912fe0e70945ab1e0c312cdc550df52996ebe04958fafdb97", + "sha256:d51c1c51c81fbd1fac62b2d4bdc8b54fb6b7cbe6cbf70c3baeea11516525c956" ], - "version": "==4.6.0" + "version": "==4.7.1" + }, + "qtpy": { + "hashes": [ + "sha256:2db72c44b55d0fe1407be8fba35c838ad0d6d3bb81f23007886dc1fc0f459c8d", + "sha256:fa0b8363b363e89b2a6f49eddc162a04c0699ae95e109a6be3bb145a913190ea" + ], + "version": "==1.9.0" }, "send2trash": { "hashes": [ @@ -1086,15 +1157,17 @@ }, "tornado": { "hashes": [ - "sha256:349884248c36801afa19e342a77cc4458caca694b0eda633f5878e458a44cb2c", - "sha256:398e0d35e086ba38a0427c3b37f4337327231942e731edaa6e9fd1865bbd6f60", - "sha256:4e73ef678b1a859f0cb29e1d895526a20ea64b5ffd510a2307b5998c7df24281", - "sha256:559bce3d31484b665259f50cd94c5c28b961b09315ccd838f284687245f416e5", - "sha256:abbe53a39734ef4aba061fca54e30c6b4639d3e1f59653f0da37a0003de148c7", - "sha256:c845db36ba616912074c5b1ee897f8e0124df269468f25e4fe21fe72f6edd7a9", - "sha256:c9399267c926a4e7c418baa5cbe91c7d1cf362d505a1ef898fde44a07c9dd8a5" + "sha256:0fe2d45ba43b00a41cd73f8be321a44936dc1aba233dee979f17a042b83eb6dc", + "sha256:22aed82c2ea340c3771e3babc5ef220272f6fd06b5108a53b4976d0d722bcd52", + "sha256:2c027eb2a393d964b22b5c154d1a23a5f8727db6fda837118a776b29e2b8ebc6", + "sha256:5217e601700f24e966ddab689f90b7ea4bd91ff3357c3600fa1045e26d68e55d", + "sha256:5618f72e947533832cbc3dec54e1dffc1747a5cb17d1fd91577ed14fa0dc081b", + "sha256:5f6a07e62e799be5d2330e68d808c8ac41d4a259b9cea61da4101b83cb5dc673", + "sha256:c58d56003daf1b616336781b26d184023ea4af13ae143d9dda65e31e534940b9", + "sha256:c952975c8ba74f546ae6de2e226ab3cc3cc11ae47baf607459a6728585bb542a", + "sha256:c98232a3ac391f5faea6821b53db8db461157baa788f5d6222a193e9456e1740" ], - "version": "==6.0.3" + "version": "==6.0.4" }, "traitlets": { "hashes": [ @@ -1103,33 +1176,6 @@ ], "version": "==4.3.3" }, - "typed-ast": { - "hashes": [ - "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355", - "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919", - "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa", - "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652", - "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75", - "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01", - "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d", - "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1", - "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907", - "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c", - "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3", - "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b", - "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614", - "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb", - "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b", - "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41", - "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6", - "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34", - "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe", - "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4", - "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7" - ], - "markers": "implementation_name == 'cpython' and python_version < '3.8'", - "version": "==1.4.1" - }, "wcwidth": { "hashes": [ "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603", @@ -1160,11 +1206,11 @@ }, "zipp": { "hashes": [ - "sha256:ccc94ed0909b58ffe34430ea5451f07bc0c76467d7081619a454bf5c98b89e28", - "sha256:feae2f18633c32fc71f2de629bfb3bd3c9325cd4419642b1f1da42ee488d9b98" + "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b", + "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96" ], "index": "pypi", - "version": "==2.1.0" + "version": "==3.1.0" } } } diff --git a/backend/metagenedb/__init__.py b/backend/metagenedb/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c08a520f4d5799162247ba9912dba241b61342e6 100644 --- a/backend/metagenedb/__init__.py +++ b/backend/metagenedb/__init__.py @@ -0,0 +1,3 @@ +from .celery_app import app as celery_app # noqa + +__all__ = ('celery_app') diff --git a/backend/metagenedb/api/catalog/urls.py b/backend/metagenedb/api/catalog/urls.py index 8864400a52a17275575e729a4bb74e7165576a64..b794346b8831a94f63c8bc9f87b915161097a87c 100644 --- a/backend/metagenedb/api/catalog/urls.py +++ b/backend/metagenedb/api/catalog/urls.py @@ -4,6 +4,8 @@ from rest_framework.routers import DefaultRouter, DynamicRoute, Route from metagenedb.api.catalog import views +from metagenedb.api.catalog.views.celery_test import celery_test_view, test_task_view + class CustomRouter(DefaultRouter): @@ -63,5 +65,7 @@ api_router.register(r'statistics', views.StatisticsViewSet, basename='statistics urlpatterns = [ url(r'v1/', include((api_router.urls, 'v1'))), - path('admin/', include(('metagenedb.api.catalog.admin_urls', 'admin'))) + path('admin/', include(('metagenedb.api.catalog.admin_urls', 'admin'))), + path('celery-test/', celery_test_view, name='celery-test'), + path('celery-task-test/', test_task_view, name='celery-task-test') ] diff --git a/backend/metagenedb/api/catalog/views/celery_test.py b/backend/metagenedb/api/catalog/views/celery_test.py new file mode 100644 index 0000000000000000000000000000000000000000..0e670547f8e9797f87695e86cda9a6ee3451dd1d --- /dev/null +++ b/backend/metagenedb/api/catalog/views/celery_test.py @@ -0,0 +1,33 @@ +import logging + +from celery.decorators import task +from rest_framework.decorators import api_view +from rest_framework.response import Response + +from metagenedb.celery_app import debug_task + +logger = logging.getLogger(__name__) + + +@api_view() +def celery_test_view(request): + debug_task.delay() + return Response({"message": "Your task is being processed!"}) + + +@task(name="test_celery_task") +def test_task(msg): + logger.info("Test Celery Task") + return msg + + +@task(name="poete") +def mul(x, y): + return x * y + + +@api_view() +def test_task_view(request): + msg = test_task.delay("poooouet") + muli = mul.delay(2, 4) + return Response({"message": f"Tested celery task: {msg.get(timeout=1)} {muli.get(timeout=1)}"}) diff --git a/backend/metagenedb/apps/core/__init__.py b/backend/metagenedb/apps/core/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/metagenedb/apps/core/management/__init__.py b/backend/metagenedb/apps/core/management/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/metagenedb/apps/core/management/commands/__init__.py b/backend/metagenedb/apps/core/management/commands/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/metagenedb/apps/core/management/commands/watch_celery.py b/backend/metagenedb/apps/core/management/commands/watch_celery.py new file mode 100644 index 0000000000000000000000000000000000000000..91704388f4114e71ae113020de6b98ccec9ca0ff --- /dev/null +++ b/backend/metagenedb/apps/core/management/commands/watch_celery.py @@ -0,0 +1,27 @@ +""" +This command allows for celery to be reloaded when project +code is saved. This command is called in +`docker-compose.dev.yml` and is only for use in development + +https://avilpage.com/2017/05/how-to-auto-reload-celery-workers-in-development.html +""" + +import shlex +import subprocess + +from django.core.management.base import BaseCommand +from django.utils import autoreload + + +def restart_celery(): + cmd = 'pkill -9 celery' + subprocess.call(shlex.split(cmd)) + cmd = 'celery worker --app=metagenedb.celery_app:app --loglevel=info' + subprocess.call(shlex.split(cmd)) + + +class Command(BaseCommand): + + def handle(self, *args, **options): + print('Starting celery worker with autoreload...') + autoreload.run_with_reloader(restart_celery) diff --git a/backend/metagenedb/celery_app.py b/backend/metagenedb/celery_app.py new file mode 100644 index 0000000000000000000000000000000000000000..0632df001b6a2c532a3d6d7dd9528cc28e87bdca --- /dev/null +++ b/backend/metagenedb/celery_app.py @@ -0,0 +1,19 @@ +import os +from celery import Celery + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'metagenedb.settings') +app = Celery('metagenedb') +app.config_from_object('django.conf:settings', namespace='CELERY') +app.autodiscover_tasks() + +app.conf.beat_schedule = { + 'display_time-20-seconds': { + 'task': 'demoapp.tasks.display_time', + 'schedule': 20.0 + }, +} + + +@app.task(bind=True) +def debug_task(self): + print('Request: {0!r}'.format(self.request)) diff --git a/backend/metagenedb/demoapp/__init__.py b/backend/metagenedb/demoapp/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/metagenedb/demoapp/tasks.py b/backend/metagenedb/demoapp/tasks.py new file mode 100644 index 0000000000000000000000000000000000000000..028827518eed62ab292e2a2c2dd98125719b8ed4 --- /dev/null +++ b/backend/metagenedb/demoapp/tasks.py @@ -0,0 +1,8 @@ +from datetime import datetime +from celery import shared_task + + +@shared_task +def display_time(): + print("The time is %s :" % str(datetime.now())) + return True diff --git a/backend/metagenedb/settings/__init__.py b/backend/metagenedb/settings/__init__.py index d74b912b79bc14049cd898fb009af55bb35ece44..0e822e11f55be6c91aab82b5da26e25e414db2e4 100644 --- a/backend/metagenedb/settings/__init__.py +++ b/backend/metagenedb/settings/__init__.py @@ -1 +1,2 @@ from .django import * # noqa +from .celery import * # noqa diff --git a/backend/metagenedb/settings/celery.py b/backend/metagenedb/settings/celery.py new file mode 100644 index 0000000000000000000000000000000000000000..05b277b3969a9e6bb81d8fe2451869650370b857 --- /dev/null +++ b/backend/metagenedb/settings/celery.py @@ -0,0 +1,26 @@ +import os + +# REDIS +REDIS_URL = "redis://{host}:{port}/1".format( + host=os.getenv('REDIS_HOST', 'redis'), + port=os.getenv('REDIS_PORT', '6379') + +) +# CELERY +CELERY_BROKER_URL = REDIS_URL +CELERY_RESULT_BACKEND = REDIS_URL +CELERY_ACCEPT_CONTENT = ['application/json'] +CELERY_RESULT_SERIALIZER = 'json' +CELERY_TASK_SERIALIZER = 'json' + +# CACHE +CACHES = { + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": REDIS_URL, + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient" + }, + "KEY_PREFIX": "example" + } +} diff --git a/backend/metagenedb/settings/django.py b/backend/metagenedb/settings/django.py index efdcda28f064f58abd25e5aa71e6d355a416a1fa..35e6f33deadbb29b68b980ceb8e505053966d957 100644 --- a/backend/metagenedb/settings/django.py +++ b/backend/metagenedb/settings/django.py @@ -10,6 +10,7 @@ environ.Env.read_env(root('.env')) # reading .env file INSTALLED_APPS = [ 'metagenedb.apps.catalog', + 'metagenedb.apps.core', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', diff --git a/docker-compose.yaml b/docker-compose.yaml index 1c78a23476ee3ad4879256b3c3da1588012ab46c..17e5ba0549de71c3bbc8e80b447d4bd74c716fe7 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -53,16 +53,63 @@ services: depends_on: - backend - frontend + - flower + - portainer volumes: - ./nginx/dev/nginx.conf:/etc/nginx/nginx.conf:ro - django-static:/usr/src/app/static networks: - main + redis: + image: redis:alpine + container_name: redis + networks: + - main + + celery: + container_name: celery + build: + context: ./backend + volumes: + - ./backend:/code + depends_on: + - postgresql + - redis + command: bash -c 'manage.py watch_celery' + networks: + - main + + flower: + image: mher/flower + container_name: flower + command: flower --url_prefix=flower + environment: + - CELERY_BROKER_URL=redis://redis:6379 + - FLOWER_PORT=5555 + ports: + - 5555:5555 + networks: + - main + depends_on: + - celery + - redis + + portainer: + image: portainer/portainer + container_name: portainer + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - portainer-data:/data + ports: + - 9000:9000 + networks: + - main volumes: postgresql-data: django-static: + portainer-data: networks: main: diff --git a/nginx/dev/nginx.conf b/nginx/dev/nginx.conf index 112daecc6e15679ee671585e6f97d44cee93cab5..c2d8bd6afe773682e540e049f8ea3608639b7258 100644 --- a/nginx/dev/nginx.conf +++ b/nginx/dev/nginx.conf @@ -17,6 +17,14 @@ http { server frontend:8080; } + upstream flower { + server flower:5555; + } + + upstream portainer { + server portainer:9000; + } + server { listen 80; charset utf-8; @@ -48,5 +56,29 @@ http { proxy_set_header Host $http_host; } + # flower + location /flower/ { + rewrite ^/flower/(.*)$ /$1 break; + proxy_pass http://flower/; + proxy_set_header Host $host; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # portainer + location /portainer/ { + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_pass http://portainer/; + } + location /portainer/api/websocket/ { + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_http_version 1.1; + proxy_pass http://portainer/api/websocket/; + } + } }