From ee5ab62050edff5c02cec9c735908f5e653b9295 Mon Sep 17 00:00:00 2001 From: gromdimon Date: Tue, 15 Aug 2023 12:28:10 +0200 Subject: [PATCH 01/47] feat: environment files --- .gitignore | 3 + backend/Pipfile | 1 + backend/Pipfile.lock | 634 ++++++++++++++++++++++++------------------- backend/app/main.py | 14 +- 4 files changed, 373 insertions(+), 279 deletions(-) diff --git a/.gitignore b/.gitignore index 144be46a..5144b746 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ .coverage coverage.lcov +# Environment variables +.env + # Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,pycharm,vim,emacs # Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,pycharm,vim,emacs diff --git a/backend/Pipfile b/backend/Pipfile index 0dc41187..28db18cb 100644 --- a/backend/Pipfile +++ b/backend/Pipfile @@ -7,6 +7,7 @@ name = "pypi" fastapi = "*" pydantic = "*" uvicorn = "*" +python-dotenv = "*" [dev-packages] black = "*" diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock index 2b60a313..6ad0a422 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "9986ba72952cf72b3dfaad38b25f1c3090059f33ae3f0c53be635d34cac34566" + "sha256": "02c8c29bdeb3c73124512d27d731d424f12cf6d4bf1fa220338478b4ef407ec0" }, "pipfile-spec": 6, "requires": { @@ -16,37 +16,45 @@ ] }, "default": { + "annotated-types": { + "hashes": [ + "sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802", + "sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd" + ], + "markers": "python_version >= '3.7'", + "version": "==0.5.0" + }, "anyio": { "hashes": [ - "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", - "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" + "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", + "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5" ], "markers": "python_version >= '3.7'", - "version": "==3.7.0" + "version": "==3.7.1" }, "click": { "hashes": [ - "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", - "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd", + "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5" ], "markers": "python_version >= '3.7'", - "version": "==8.1.3" + "version": "==8.1.6" }, "exceptiongroup": { "hashes": [ - "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", - "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" + "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", + "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" ], "markers": "python_version < '3.11'", - "version": "==1.1.1" + "version": "==1.1.3" }, "fastapi": { "hashes": [ - "sha256:0d3c18886f652038262b5898fec6b09f4ca92ee23e9d9b1d1d24e429f84bf27b", - "sha256:f4165fb1fe3610c52cb1b8282c1480de9c34bc270f56a965aa93a884c350d605" + "sha256:7b32000d14ca9992f7461117b81e4ef9ff0c07936af641b4fe40e67d5f9d63cb", + "sha256:aef5f8676eb1b8389952e1fe734abe20f04b71f6936afcc53b320ba79b686a4b" ], "index": "pypi", - "version": "==0.98.0" + "version": "==0.101.1" }, "h11": { "hashes": [ @@ -66,45 +74,126 @@ }, "pydantic": { "hashes": [ - "sha256:07293ab08e7b4d3c9d7de4949a0ea571f11e4557d19ea24dd3ae0c524c0c334d", - "sha256:0a2aabdc73c2a5960e87c3ffebca6ccde88665616d1fd6d3db3178ef427b267a", - "sha256:0da48717dc9495d3a8f215e0d012599db6b8092db02acac5e0d58a65248ec5bc", - "sha256:128d9453d92e6e81e881dd7e2484e08d8b164da5507f62d06ceecf84bf2e21d3", - "sha256:2196c06484da2b3fded1ab6dbe182bdabeb09f6318b7fdc412609ee2b564c49a", - "sha256:2e9aec8627a1a6823fc62fb96480abe3eb10168fd0d859ee3d3b395105ae19a7", - "sha256:3283b574b01e8dbc982080d8287c968489d25329a463b29a90d4157de4f2baaf", - "sha256:3c52eb595db83e189419bf337b59154bdcca642ee4b2a09e5d7797e41ace783f", - "sha256:4b466a23009ff5cdd7076eb56aca537c745ca491293cc38e72bf1e0e00de5b91", - "sha256:517a681919bf880ce1dac7e5bc0c3af1e58ba118fd774da2ffcd93c5f96eaece", - "sha256:5f8bbaf4013b9a50e8100333cc4e3fa2f81214033e05ac5aa44fa24a98670a29", - "sha256:6257bb45ad78abacda13f15bde5886efd6bf549dd71085e64b8dcf9919c38b60", - "sha256:67195274fd27780f15c4c372f4ba9a5c02dad6d50647b917b6a92bf00b3d301a", - "sha256:6cafde02f6699ce4ff643417d1a9223716ec25e228ddc3b436fe7e2d25a1f305", - "sha256:73ef93e5e1d3c8e83f1ff2e7fdd026d9e063c7e089394869a6e2985696693766", - "sha256:7845b31959468bc5b78d7b95ec52fe5be32b55d0d09983a877cca6aedc51068f", - "sha256:7847ca62e581e6088d9000f3c497267868ca2fa89432714e21a4fb33a04d52e8", - "sha256:7e1d5290044f620f80cf1c969c542a5468f3656de47b41aa78100c5baa2b8276", - "sha256:7ee829b86ce984261d99ff2fd6e88f2230068d96c2a582f29583ed602ef3fc2c", - "sha256:83fcff3c7df7adff880622a98022626f4f6dbce6639a88a15a3ce0f96466cb60", - "sha256:939328fd539b8d0edf244327398a667b6b140afd3bf7e347cf9813c736211896", - "sha256:95c70da2cd3b6ddf3b9645ecaa8d98f3d80c606624b6d245558d202cd23ea3be", - "sha256:963671eda0b6ba6926d8fc759e3e10335e1dc1b71ff2a43ed2efd6996634dafb", - "sha256:970b1bdc6243ef663ba5c7e36ac9ab1f2bfecb8ad297c9824b542d41a750b298", - "sha256:9863b9420d99dfa9c064042304868e8ba08e89081428a1c471858aa2af6f57c4", - "sha256:ad428e92ab68798d9326bb3e5515bc927444a3d71a93b4a2ca02a8a5d795c572", - "sha256:b48d3d634bca23b172f47f2335c617d3fcb4b3ba18481c96b7943a4c634f5c8d", - "sha256:b9cd67fb763248cbe38f0593cd8611bfe4b8ad82acb3bdf2b0898c23415a1f82", - "sha256:d111a21bbbfd85c17248130deac02bbd9b5e20b303338e0dbe0faa78330e37e0", - "sha256:e1aa5c2410769ca28aa9a7841b80d9d9a1c5f223928ca8bec7e7c9a34d26b1d4", - "sha256:e692dec4a40bfb40ca530e07805b1208c1de071a18d26af4a2a0d79015b352ca", - "sha256:e7c9900b43ac14110efa977be3da28931ffc74c27e96ee89fbcaaf0b0fe338e1", - "sha256:eec39224b2b2e861259d6f3c8b6290d4e0fbdce147adb797484a42278a1a486f", - "sha256:f0b7628fb8efe60fe66fd4adadd7ad2304014770cdc1f4934db41fe46cc8825f", - "sha256:f50e1764ce9353be67267e7fd0da08349397c7db17a562ad036aa7c8f4adfdb6", - "sha256:fab81a92f42d6d525dd47ced310b0c3e10c416bbfae5d59523e63ea22f82b31e" + "sha256:22d63db5ce4831afd16e7c58b3192d3faf8f79154980d9397d9867254310ba4b", + "sha256:43bdbf359d6304c57afda15c2b95797295b702948082d4c23851ce752f21da70" ], "index": "pypi", - "version": "==1.10.9" + "version": "==2.1.1" + }, + "pydantic-core": { + "hashes": [ + "sha256:01947ad728f426fa07fcb26457ebf90ce29320259938414bc0edd1476e75addb", + "sha256:0455876d575a35defc4da7e0a199596d6c773e20d3d42fa1fc29f6aa640369ed", + "sha256:047580388644c473b934d27849f8ed8dbe45df0adb72104e78b543e13bf69762", + "sha256:04922fea7b13cd480586fa106345fe06e43220b8327358873c22d8dfa7a711c7", + "sha256:08f89697625e453421401c7f661b9d1eb4c9e4c0a12fd256eeb55b06994ac6af", + "sha256:0a507d7fa44688bbac76af6521e488b3da93de155b9cba6f2c9b7833ce243d59", + "sha256:0d726108c1c0380b88b6dd4db559f0280e0ceda9e077f46ff90bc85cd4d03e77", + "sha256:12ef6838245569fd60a179fade81ca4b90ae2fa0ef355d616f519f7bb27582db", + "sha256:153a61ac4030fa019b70b31fb7986461119230d3ba0ab661c757cfea652f4332", + "sha256:16468bd074fa4567592d3255bf25528ed41e6b616d69bf07096bdb5b66f947d1", + "sha256:17156abac20a9feed10feec867fddd91a80819a485b0107fe61f09f2117fe5f3", + "sha256:1927f0e15d190f11f0b8344373731e28fd774c6d676d8a6cfadc95c77214a48b", + "sha256:1e8a7c62d15a5c4b307271e4252d76ebb981d6251c6ecea4daf203ef0179ea4f", + "sha256:2ad538b7e07343001934417cdc8584623b4d8823c5b8b258e75ec8d327cec969", + "sha256:2ca4687dd996bde7f3c420def450797feeb20dcee2b9687023e3323c73fc14a2", + "sha256:2edef05b63d82568b877002dc4cb5cc18f8929b59077120192df1e03e0c633f8", + "sha256:2f9ea0355f90db2a76af530245fa42f04d98f752a1236ed7c6809ec484560d5b", + "sha256:30527d173e826f2f7651f91c821e337073df1555e3b5a0b7b1e2c39e26e50678", + "sha256:32a1e0352558cd7ccc014ffe818c7d87b15ec6145875e2cc5fa4bb7351a1033d", + "sha256:3534118289e33130ed3f1cc487002e8d09b9f359be48b02e9cd3de58ce58fba9", + "sha256:36ba9e728588588f0196deaf6751b9222492331b5552f865a8ff120869d372e0", + "sha256:382f0baa044d674ad59455a5eff83d7965572b745cc72df35c52c2ce8c731d37", + "sha256:394f12a2671ff8c4dfa2e85be6c08be0651ad85bc1e6aa9c77c21671baaf28cd", + "sha256:3ba2c9c94a9176f6321a879c8b864d7c5b12d34f549a4c216c72ce213d7d953c", + "sha256:3ded19dcaefe2f6706d81e0db787b59095f4ad0fbadce1edffdf092294c8a23f", + "sha256:3fcf529382b282a30b466bd7af05be28e22aa620e016135ac414f14e1ee6b9e1", + "sha256:43a405ce520b45941df9ff55d0cd09762017756a7b413bbad3a6e8178e64a2c2", + "sha256:453862ab268f6326b01f067ed89cb3a527d34dc46f6f4eeec46a15bbc706d0da", + "sha256:4665f7ed345012a8d2eddf4203ef145f5f56a291d010382d235b94e91813f88a", + "sha256:478f5f6d7e32bd4a04d102160efb2d389432ecf095fe87c555c0a6fc4adfc1a4", + "sha256:49db206eb8fdc4b4f30e6e3e410584146d813c151928f94ec0db06c4f2595538", + "sha256:4b262bbc13022f2097c48a21adcc360a81d83dc1d854c11b94953cd46d7d3c07", + "sha256:4cbe929efa77a806e8f1a97793f2dc3ea3475ae21a9ed0f37c21320fe93f6f50", + "sha256:4e562cc63b04636cde361fd47569162f1daa94c759220ff202a8129902229114", + "sha256:546064c55264156b973b5e65e5fafbe5e62390902ce3cf6b4005765505e8ff56", + "sha256:54df7df399b777c1fd144f541c95d351b3aa110535a6810a6a569905d106b6f3", + "sha256:56a85fa0dab1567bd0cac10f0c3837b03e8a0d939e6a8061a3a420acd97e9421", + "sha256:57a53a75010c635b3ad6499e7721eaa3b450e03f6862afe2dbef9c8f66e46ec8", + "sha256:584a7a818c84767af16ce8bda5d4f7fedb37d3d231fc89928a192f567e4ef685", + "sha256:5fd905a69ac74eaba5041e21a1e8b1a479dab2b41c93bdcc4c1cede3c12a8d86", + "sha256:61d4e713f467abcdd59b47665d488bb898ad3dd47ce7446522a50e0cbd8e8279", + "sha256:6213b471b68146af97b8551294e59e7392c2117e28ffad9c557c65087f4baee3", + "sha256:63797499a219d8e81eb4e0c42222d0a4c8ec896f5c76751d4258af95de41fdf1", + "sha256:64e8012ad60a5f0da09ed48725e6e923d1be25f2f091a640af6079f874663813", + "sha256:664402ef0c238a7f8a46efb101789d5f2275600fb18114446efec83cfadb5b66", + "sha256:68199ada7c310ddb8c76efbb606a0de656b40899388a7498954f423e03fc38be", + "sha256:69159afc2f2dc43285725f16143bc5df3c853bc1cb7df6021fce7ef1c69e8171", + "sha256:6f855bcc96ed3dd56da7373cfcc9dcbabbc2073cac7f65c185772d08884790ce", + "sha256:6feb4b64d11d5420e517910d60a907d08d846cacaf4e029668725cd21d16743c", + "sha256:72f1216ca8cef7b8adacd4c4c6b89c3b0c4f97503197f5284c80f36d6e4edd30", + "sha256:77dadc764cf7c5405e04866181c5bd94a447372a9763e473abb63d1dfe9b7387", + "sha256:782fced7d61469fd1231b184a80e4f2fa7ad54cd7173834651a453f96f29d673", + "sha256:79262be5a292d1df060f29b9a7cdd66934801f987a817632d7552534a172709a", + "sha256:7aa82d483d5fb867d4fb10a138ffd57b0f1644e99f2f4f336e48790ada9ada5e", + "sha256:853f103e2b9a58832fdd08a587a51de8b552ae90e1a5d167f316b7eabf8d7dde", + "sha256:867d3eea954bea807cabba83cfc939c889a18576d66d197c60025b15269d7cc0", + "sha256:878a5017d93e776c379af4e7b20f173c82594d94fa073059bcc546789ad50bf8", + "sha256:884235507549a6b2d3c4113fb1877ae263109e787d9e0eb25c35982ab28d0399", + "sha256:8c938c96294d983dcf419b54dba2d21056959c22911d41788efbf949a29ae30d", + "sha256:8efc1be43b036c2b6bcfb1451df24ee0ddcf69c31351003daf2699ed93f5687b", + "sha256:8fba0aff4c407d0274e43697e785bcac155ad962be57518d1c711f45e72da70f", + "sha256:90f3785146f701e053bb6b9e8f53acce2c919aca91df88bd4975be0cb926eb41", + "sha256:9137289de8fe845c246a8c3482dd0cb40338846ba683756d8f489a4bd8fddcae", + "sha256:9206c14a67c38de7b916e486ae280017cf394fa4b1aa95cfe88621a4e1d79725", + "sha256:94d2b36a74623caab262bf95f0e365c2c058396082bd9d6a9e825657d0c1e7fa", + "sha256:97c6349c81cee2e69ef59eba6e6c08c5936e6b01c2d50b9e4ac152217845ae09", + "sha256:a027f41c5008571314861744d83aff75a34cf3a07022e0be32b214a5bc93f7f1", + "sha256:a08fd490ba36d1fbb2cd5dcdcfb9f3892deb93bd53456724389135712b5fc735", + "sha256:a297c0d6c61963c5c3726840677b798ca5b7dfc71bc9c02b9a4af11d23236008", + "sha256:a4ea23b07f29487a7bef2a869f68c7ee0e05424d81375ce3d3de829314c6b5ec", + "sha256:a8b7acd04896e8f161e1500dc5f218017db05c1d322f054e89cbd089ce5d0071", + "sha256:ac2b680de398f293b68183317432b3d67ab3faeba216aec18de0c395cb5e3060", + "sha256:af24ad4fbaa5e4a2000beae0c3b7fd1c78d7819ab90f9370a1cfd8998e3f8a3c", + "sha256:af788b64e13d52fc3600a68b16d31fa8d8573e3ff2fc9a38f8a60b8d94d1f012", + "sha256:b013c7861a7c7bfcec48fd709513fea6f9f31727e7a0a93ca0dd12e056740717", + "sha256:b2799c2eaf182769889761d4fb4d78b82bc47dae833799fedbf69fc7de306faa", + "sha256:b27f3e67f6e031f6620655741b7d0d6bebea8b25d415924b3e8bfef2dd7bd841", + "sha256:b7206e41e04b443016e930e01685bab7a308113c0b251b3f906942c8d4b48fcb", + "sha256:b85778308bf945e9b33ac604e6793df9b07933108d20bdf53811bc7c2798a4af", + "sha256:bd7d1dde70ff3e09e4bc7a1cbb91a7a538add291bfd5b3e70ef1e7b45192440f", + "sha256:be86c2eb12fb0f846262ace9d8f032dc6978b8cb26a058920ecb723dbcb87d05", + "sha256:bf10963d8aed8bbe0165b41797c9463d4c5c8788ae6a77c68427569be6bead41", + "sha256:c1375025f0bfc9155286ebae8eecc65e33e494c90025cda69e247c3ccd2bab00", + "sha256:c5d8e764b5646623e57575f624f8ebb8f7a9f7fd1fae682ef87869ca5fec8dcf", + "sha256:cba5ad5eef02c86a1f3da00544cbc59a510d596b27566479a7cd4d91c6187a11", + "sha256:cc086ddb6dc654a15deeed1d1f2bcb1cb924ebd70df9dca738af19f64229b06c", + "sha256:d0c2b713464a8e263a243ae7980d81ce2de5ac59a9f798a282e44350b42dc516", + "sha256:d93aedbc4614cc21b9ab0d0c4ccd7143354c1f7cffbbe96ae5216ad21d1b21b5", + "sha256:d9610b47b5fe4aacbbba6a9cb5f12cbe864eec99dbfed5710bd32ef5dd8a5d5b", + "sha256:da055a1b0bfa8041bb2ff586b2cb0353ed03944a3472186a02cc44a557a0e661", + "sha256:dd2429f7635ad4857b5881503f9c310be7761dc681c467a9d27787b674d1250a", + "sha256:de39eb3bab93a99ddda1ac1b9aa331b944d8bcc4aa9141148f7fd8ee0299dafc", + "sha256:e40b1e97edd3dc127aa53d8a5e539a3d0c227d71574d3f9ac1af02d58218a122", + "sha256:e412607ca89a0ced10758dfb8f9adcc365ce4c1c377e637c01989a75e9a9ec8a", + "sha256:e953353180bec330c3b830891d260b6f8e576e2d18db3c78d314e56bb2276066", + "sha256:ec3473c9789cc00c7260d840c3db2c16dbfc816ca70ec87a00cddfa3e1a1cdd5", + "sha256:efff8b6761a1f6e45cebd1b7a6406eb2723d2d5710ff0d1b624fe11313693989", + "sha256:f773b39780323a0499b53ebd91a28ad11cde6705605d98d999dfa08624caf064", + "sha256:fa8e48001b39d54d97d7b380a0669fa99fc0feeb972e35a2d677ba59164a9a22", + "sha256:ff246c0111076c8022f9ba325c294f2cb5983403506989253e04dbae565e019b", + "sha256:ffe18407a4d000c568182ce5388bbbedeb099896904e43fc14eee76cfae6dec5" + ], + "markers": "python_version >= '3.7'", + "version": "==2.4.0" + }, + "python-dotenv": { + "hashes": [ + "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba", + "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" + ], + "index": "pypi", + "version": "==1.0.0" }, "sniffio": { "hashes": [ @@ -124,19 +213,19 @@ }, "typing-extensions": { "hashes": [ - "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26", - "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5" + "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", + "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" ], "markers": "python_version >= '3.7'", - "version": "==4.6.3" + "version": "==4.7.1" }, "uvicorn": { "hashes": [ - "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8", - "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996" + "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53", + "sha256:4d3cc12d7727ba72b64d12d3cc7743124074c0a69f7b201512fc50c3e3f1569a" ], "index": "pypi", - "version": "==0.22.0" + "version": "==0.23.2" } }, "develop": { @@ -150,11 +239,11 @@ }, "anyio": { "hashes": [ - "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", - "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" + "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", + "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5" ], "markers": "python_version >= '3.7'", - "version": "==3.7.0" + "version": "==3.7.1" }, "babel": { "hashes": [ @@ -166,200 +255,189 @@ }, "black": { "hashes": [ - "sha256:064101748afa12ad2291c2b91c960be28b817c0c7eaa35bec09cc63aa56493c5", - "sha256:0945e13506be58bf7db93ee5853243eb368ace1c08a24c65ce108986eac65915", - "sha256:11c410f71b876f961d1de77b9699ad19f939094c3a677323f43d7a29855fe326", - "sha256:1c7b8d606e728a41ea1ccbd7264677e494e87cf630e399262ced92d4a8dac940", - "sha256:1d06691f1eb8de91cd1b322f21e3bfc9efe0c7ca1f0e1eb1db44ea367dff656b", - "sha256:3238f2aacf827d18d26db07524e44741233ae09a584273aa059066d644ca7b30", - "sha256:32daa9783106c28815d05b724238e30718f34155653d4d6e125dc7daec8e260c", - "sha256:35d1381d7a22cc5b2be2f72c7dfdae4072a3336060635718cc7e1ede24221d6c", - "sha256:3a150542a204124ed00683f0db1f5cf1c2aaaa9cc3495b7a3b5976fb136090ab", - "sha256:48f9d345675bb7fbc3dd85821b12487e1b9a75242028adad0333ce36ed2a6d27", - "sha256:50cb33cac881766a5cd9913e10ff75b1e8eb71babf4c7104f2e9c52da1fb7de2", - "sha256:562bd3a70495facf56814293149e51aa1be9931567474993c7942ff7d3533961", - "sha256:67de8d0c209eb5b330cce2469503de11bca4085880d62f1628bd9972cc3366b9", - "sha256:6b39abdfb402002b8a7d030ccc85cf5afff64ee90fa4c5aebc531e3ad0175ddb", - "sha256:6f3c333ea1dd6771b2d3777482429864f8e258899f6ff05826c3a4fcc5ce3f70", - "sha256:714290490c18fb0126baa0fca0a54ee795f7502b44177e1ce7624ba1c00f2331", - "sha256:7c3eb7cea23904399866c55826b31c1f55bbcd3890ce22ff70466b907b6775c2", - "sha256:92c543f6854c28a3c7f39f4d9b7694f9a6eb9d3c5e2ece488c327b6e7ea9b266", - "sha256:a6f6886c9869d4daae2d1715ce34a19bbc4b95006d20ed785ca00fa03cba312d", - "sha256:a8a968125d0a6a404842fa1bf0b349a568634f856aa08ffaff40ae0dfa52e7c6", - "sha256:c7ab5790333c448903c4b721b59c0d80b11fe5e9803d8703e84dcb8da56fec1b", - "sha256:e114420bf26b90d4b9daa597351337762b63039752bdf72bf361364c1aa05925", - "sha256:e198cf27888ad6f4ff331ca1c48ffc038848ea9f031a3b40ba36aced7e22f2c8", - "sha256:ec751418022185b0c1bb7d7736e6933d40bbb14c14a0abcf9123d1b159f98dd4", - "sha256:f0bd2f4a58d6666500542b26354978218a9babcdc972722f4bf90779524515f3" + "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3", + "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb", + "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087", + "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320", + "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6", + "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3", + "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc", + "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f", + "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587", + "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91", + "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a", + "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad", + "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926", + "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9", + "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be", + "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd", + "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96", + "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491", + "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2", + "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a", + "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f", + "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995" ], "index": "pypi", - "version": "==23.3.0" + "version": "==23.7.0" }, "certifi": { "hashes": [ - "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7", - "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "markers": "python_version >= '3.6'", - "version": "==2023.5.7" + "version": "==2023.7.22" }, "charset-normalizer": { "hashes": [ - "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6", - "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1", - "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e", - "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373", - "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62", - "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230", - "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be", - "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c", - "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0", - "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448", - "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f", - "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649", - "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d", - "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0", - "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706", - "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a", - "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59", - "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23", - "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5", - "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb", - "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e", - "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e", - "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c", - "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28", - "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d", - "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41", - "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974", - "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce", - "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f", - "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1", - "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d", - "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8", - "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017", - "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31", - "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7", - "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8", - "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e", - "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14", - "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd", - "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d", - "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795", - "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b", - "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b", - "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b", - "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203", - "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f", - "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19", - "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1", - "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a", - "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac", - "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9", - "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0", - "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137", - "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f", - "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6", - "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5", - "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909", - "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f", - "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0", - "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324", - "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755", - "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb", - "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854", - "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c", - "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60", - "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84", - "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0", - "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b", - "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1", - "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531", - "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1", - "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11", - "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326", - "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df", - "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab" + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.1.0" + "version": "==3.2.0" }, "click": { "hashes": [ - "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", - "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd", + "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5" ], "markers": "python_version >= '3.7'", - "version": "==8.1.3" + "version": "==8.1.6" }, "coverage": { "extras": [ "toml" ], "hashes": [ - "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f", - "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2", - "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a", - "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a", - "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01", - "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6", - "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7", - "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f", - "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02", - "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c", - "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063", - "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a", - "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5", - "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959", - "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97", - "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6", - "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f", - "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9", - "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5", - "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f", - "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562", - "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe", - "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9", - "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f", - "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb", - "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb", - "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1", - "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb", - "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250", - "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e", - "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511", - "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5", - "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59", - "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2", - "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d", - "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3", - "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4", - "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de", - "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9", - "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833", - "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0", - "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9", - "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d", - "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050", - "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d", - "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6", - "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353", - "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb", - "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e", - "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8", - "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495", - "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2", - "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd", - "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27", - "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1", - "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818", - "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4", - "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e", - "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850", - "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3" + "sha256:07ea61bcb179f8f05ffd804d2732b09d23a1238642bf7e51dad62082b5019b34", + "sha256:1084393c6bda8875c05e04fce5cfe1301a425f758eb012f010eab586f1f3905e", + "sha256:13c6cbbd5f31211d8fdb477f0f7b03438591bdd077054076eec362cf2207b4a7", + "sha256:211a4576e984f96d9fce61766ffaed0115d5dab1419e4f63d6992b480c2bd60b", + "sha256:2d22172f938455c156e9af2612650f26cceea47dc86ca048fa4e0b2d21646ad3", + "sha256:34f9f0763d5fa3035a315b69b428fe9c34d4fc2f615262d6be3d3bf3882fb985", + "sha256:3558e5b574d62f9c46b76120a5c7c16c4612dc2644c3d48a9f4064a705eaee95", + "sha256:36ce5d43a072a036f287029a55b5c6a0e9bd73db58961a273b6dc11a2c6eb9c2", + "sha256:37d5576d35fcb765fca05654f66aa71e2808d4237d026e64ac8b397ffa66a56a", + "sha256:3c9834d5e3df9d2aba0275c9f67989c590e05732439b3318fa37a725dff51e74", + "sha256:438856d3f8f1e27f8e79b5410ae56650732a0dcfa94e756df88c7e2d24851fcd", + "sha256:477c9430ad5d1b80b07f3c12f7120eef40bfbf849e9e7859e53b9c93b922d2af", + "sha256:49ab200acf891e3dde19e5aa4b0f35d12d8b4bd805dc0be8792270c71bd56c54", + "sha256:49dbb19cdcafc130f597d9e04a29d0a032ceedf729e41b181f51cd170e6ee865", + "sha256:4c8e31cf29b60859876474034a83f59a14381af50cbe8a9dbaadbf70adc4b214", + "sha256:4eddd3153d02204f22aef0825409091a91bf2a20bce06fe0f638f5c19a85de54", + "sha256:5247bab12f84a1d608213b96b8af0cbb30d090d705b6663ad794c2f2a5e5b9fe", + "sha256:5492a6ce3bdb15c6ad66cb68a0244854d9917478877a25671d70378bdc8562d0", + "sha256:56afbf41fa4a7b27f6635bc4289050ac3ab7951b8a821bca46f5b024500e6321", + "sha256:59777652e245bb1e300e620ce2bef0d341945842e4eb888c23a7f1d9e143c446", + "sha256:60f64e2007c9144375dd0f480a54d6070f00bb1a28f65c408370544091c9bc9e", + "sha256:63c5b8ecbc3b3d5eb3a9d873dec60afc0cd5ff9d9f1c75981d8c31cfe4df8527", + "sha256:68d8a0426b49c053013e631c0cdc09b952d857efa8f68121746b339912d27a12", + "sha256:74c160285f2dfe0acf0f72d425f3e970b21b6de04157fc65adc9fd07ee44177f", + "sha256:7a9baf8e230f9621f8e1d00c580394a0aa328fdac0df2b3f8384387c44083c0f", + "sha256:7df91fb24c2edaabec4e0eee512ff3bc6ec20eb8dccac2e77001c1fe516c0c84", + "sha256:7f297e0c1ae55300ff688568b04ff26b01c13dfbf4c9d2b7d0cb688ac60df479", + "sha256:80501d1b2270d7e8daf1b64b895745c3e234289e00d5f0e30923e706f110334e", + "sha256:85b7335c22455ec12444cec0d600533a238d6439d8d709d545158c1208483873", + "sha256:887665f00ea4e488501ba755a0e3c2cfd6278e846ada3185f42d391ef95e7e70", + "sha256:8f39c49faf5344af36042b293ce05c0d9004270d811c7080610b3e713251c9b0", + "sha256:90b6e2f0f66750c5a1178ffa9370dec6c508a8ca5265c42fbad3ccac210a7977", + "sha256:96d7d761aea65b291a98c84e1250cd57b5b51726821a6f2f8df65db89363be51", + "sha256:97af9554a799bd7c58c0179cc8dbf14aa7ab50e1fd5fa73f90b9b7215874ba28", + "sha256:97c44f4ee13bce914272589b6b41165bbb650e48fdb7bd5493a38bde8de730a1", + "sha256:a67e6bbe756ed458646e1ef2b0778591ed4d1fcd4b146fc3ba2feb1a7afd4254", + "sha256:ac0dec90e7de0087d3d95fa0533e1d2d722dcc008bc7b60e1143402a04c117c1", + "sha256:ad0f87826c4ebd3ef484502e79b39614e9c03a5d1510cfb623f4a4a051edc6fd", + "sha256:b3eb0c93e2ea6445b2173da48cb548364f8f65bf68f3d090404080d338e3a689", + "sha256:b543302a3707245d454fc49b8ecd2c2d5982b50eb63f3535244fd79a4be0c99d", + "sha256:b859128a093f135b556b4765658d5d2e758e1fae3e7cc2f8c10f26fe7005e543", + "sha256:bac329371d4c0d456e8d5f38a9b0816b446581b5f278474e416ea0c68c47dcd9", + "sha256:c02cfa6c36144ab334d556989406837336c1d05215a9bdf44c0bc1d1ac1cb637", + "sha256:c9737bc49a9255d78da085fa04f628a310c2332b187cd49b958b0e494c125071", + "sha256:ccc51713b5581e12f93ccb9c5e39e8b5d4b16776d584c0f5e9e4e63381356482", + "sha256:ce2ee86ca75f9f96072295c5ebb4ef2a43cecf2870b0ca5e7a1cbdd929cf67e1", + "sha256:d000a739f9feed900381605a12a61f7aaced6beae832719ae0d15058a1e81c1b", + "sha256:db76a1bcb51f02b2007adacbed4c88b6dee75342c37b05d1822815eed19edee5", + "sha256:e2ac9a1de294773b9fa77447ab7e529cf4fe3910f6a0832816e5f3d538cfea9a", + "sha256:e61260ec93f99f2c2d93d264b564ba912bec502f679793c56f678ba5251f0393", + "sha256:fac440c43e9b479d1241fe9d768645e7ccec3fb65dc3a5f6e90675e75c3f3e3a", + "sha256:fc0ed8d310afe013db1eedd37176d0839dc66c96bcfcce8f6607a73ffea2d6ba" ], - "markers": "python_version >= '3.7'", - "version": "==7.2.7" + "markers": "python_version >= '3.8'", + "version": "==7.3.0" }, "docutils": { "hashes": [ @@ -371,19 +449,19 @@ }, "exceptiongroup": { "hashes": [ - "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e", - "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" + "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", + "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" ], "markers": "python_version < '3.11'", - "version": "==1.1.1" + "version": "==1.1.3" }, "flake8": { "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" + "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23", + "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" ], "index": "pypi", - "version": "==6.0.0" + "version": "==6.1.0" }, "h11": { "hashes": [ @@ -395,11 +473,11 @@ }, "httpcore": { "hashes": [ - "sha256:125f8375ab60036db632f34f4b627a9ad085048eef7cb7d2616fea0f739f98af", - "sha256:5581b9c12379c4288fe70f43c710d16060c10080617001e6b22a3b6dbcbefd36" + "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888", + "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87" ], "markers": "python_version >= '3.7'", - "version": "==0.17.2" + "version": "==0.17.3" }, "httpx": { "hashes": [ @@ -531,19 +609,19 @@ }, "pathspec": { "hashes": [ - "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687", - "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293" + "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", + "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3" ], "markers": "python_version >= '3.7'", - "version": "==0.11.1" + "version": "==0.11.2" }, "platformdirs": { "hashes": [ - "sha256:b0cabcb11063d21a0b261d557acb0a9d2126350e63b70cdf7db6347baea456dc", - "sha256:ca9ed98ce73076ba72e092b23d3c93ea6c4e186b3f1c3dad6edd98ff6ffcca2e" + "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d", + "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d" ], "markers": "python_version >= '3.7'", - "version": "==3.8.0" + "version": "==3.10.0" }, "pluggy": { "hashes": [ @@ -555,27 +633,27 @@ }, "pycodestyle": { "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" + "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0", + "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8" ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" + "markers": "python_version >= '3.8'", + "version": "==2.11.0" }, "pyflakes": { "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" + "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774", + "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc" ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" + "markers": "python_version >= '3.8'", + "version": "==3.1.0" }, "pygments": { "hashes": [ - "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c", - "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1" + "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", + "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" ], "markers": "python_version >= '3.7'", - "version": "==2.15.1" + "version": "==2.16.1" }, "pytest": { "hashes": [ @@ -634,27 +712,27 @@ }, "sphinxcontrib-applehelp": { "hashes": [ - "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228", - "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e" + "sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d", + "sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa" ], - "markers": "python_version >= '3.8'", - "version": "==1.0.4" + "markers": "python_version >= '3.9'", + "version": "==1.0.7" }, "sphinxcontrib-devhelp": { "hashes": [ - "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e", - "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4" + "sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212", + "sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f" ], - "markers": "python_version >= '3.5'", - "version": "==1.0.2" + "markers": "python_version >= '3.9'", + "version": "==1.0.5" }, "sphinxcontrib-htmlhelp": { "hashes": [ - "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff", - "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903" + "sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a", + "sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9" ], - "markers": "python_version >= '3.8'", - "version": "==2.0.1" + "markers": "python_version >= '3.9'", + "version": "==2.0.4" }, "sphinxcontrib-jquery": { "hashes": [ @@ -674,19 +752,19 @@ }, "sphinxcontrib-qthelp": { "hashes": [ - "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72", - "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6" + "sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d", + "sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4" ], - "markers": "python_version >= '3.5'", - "version": "==1.0.3" + "markers": "python_version >= '3.9'", + "version": "==1.0.6" }, "sphinxcontrib-serializinghtml": { "hashes": [ - "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd", - "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952" + "sha256:27849e7227277333d3d32f17c138ee148a51fa01f888a41cd6d4e73bcabe2d06", + "sha256:aaf3026335146e688fd209b72320314b1b278320cf232e3cda198f873838511a" ], - "markers": "python_version >= '3.5'", - "version": "==1.1.5" + "markers": "python_version >= '3.9'", + "version": "==1.1.8" }, "starlette": { "hashes": [ @@ -706,11 +784,11 @@ }, "urllib3": { "hashes": [ - "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1", - "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825" + "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", + "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" ], "markers": "python_version >= '3.7'", - "version": "==2.0.3" + "version": "==2.0.4" } } } diff --git a/backend/app/main.py b/backend/app/main.py index fb91de22..69e3f788 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,12 +1,24 @@ import os import sys +from dotenv import load_dotenv from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from starlette.responses import RedirectResponse +# Load environment +env = os.environ +load_dotenv() + #: Path to frontend build, if any. -SERVE_FRONTEND = os.environ.get("REEV_SERVE_FRONTEND") +SERVE_FRONTEND = env.get("REEV_SERVE_FRONTEND") +#: Debug mode +DEBUG = env.get("REEV_DEBUG", "false").lower() in ("true", "1") +#: Prefixes for varfish-docker-compose-ng +BACKEND_PREFIX_MEHARI = env.get("REEV_BACKEND_PREFIX_MEHARI", "http://mehari") +BACKEND_PREFIX_VIGUNO = env.get("REEV_BACKEND_PREFIX_VIGUNO", "http://viguno") +BACKEND_PREFIX_ANNONARS = env.get("REEV_BACKEND_PREFIX_ANNONARS", "http://annonars") + app = FastAPI() From ca15639fac2460cc0443770be5ca9f53e909b94d Mon Sep 17 00:00:00 2001 From: gromdimon Date: Tue, 15 Aug 2023 14:42:59 +0200 Subject: [PATCH 02/47] feat: implement reverse_proxy --- backend/Pipfile | 1 + backend/Pipfile.lock | 26 +++++++++++++++++++++++++- backend/app/main.py | 43 ++++++++++++++++++++++++++++++++++++++++++- frontend/index.html | 3 ++- 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/backend/Pipfile b/backend/Pipfile index 28db18cb..3aa71d3f 100644 --- a/backend/Pipfile +++ b/backend/Pipfile @@ -8,6 +8,7 @@ fastapi = "*" pydantic = "*" uvicorn = "*" python-dotenv = "*" +httpx = "*" [dev-packages] black = "*" diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock index 6ad0a422..966dd2c4 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "02c8c29bdeb3c73124512d27d731d424f12cf6d4bf1fa220338478b4ef407ec0" + "sha256": "809754e18294b0c5ba7f1ea803e78b774fe33af38f4ceb3897f979aabd6c405e" }, "pipfile-spec": 6, "requires": { @@ -32,6 +32,14 @@ "markers": "python_version >= '3.7'", "version": "==3.7.1" }, + "certifi": { + "hashes": [ + "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", + "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + ], + "markers": "python_version >= '3.6'", + "version": "==2023.7.22" + }, "click": { "hashes": [ "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd", @@ -64,6 +72,22 @@ "markers": "python_version >= '3.7'", "version": "==0.14.0" }, + "httpcore": { + "hashes": [ + "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888", + "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87" + ], + "markers": "python_version >= '3.7'", + "version": "==0.17.3" + }, + "httpx": { + "hashes": [ + "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd", + "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd" + ], + "index": "pypi", + "version": "==0.24.1" + }, "idna": { "hashes": [ "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", diff --git a/backend/app/main.py b/backend/app/main.py index 69e3f788..c437be8e 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,10 +1,13 @@ import os import sys +import httpx from dotenv import load_dotenv from fastapi import FastAPI from fastapi.staticfiles import StaticFiles -from starlette.responses import RedirectResponse +from starlette.background import BackgroundTask +from starlette.requests import Request +from starlette.responses import RedirectResponse, Response, StreamingResponse # Load environment env = os.environ @@ -23,6 +26,44 @@ app = FastAPI() +# Reverse proxy implementation +client = httpx.AsyncClient() + + +async def reverse_proxy(request: Request): + url = request.url + backend_url = None + + if url.path.startswith("/proxy/annonars"): + backend_url = BACKEND_PREFIX_ANNONARS + url.path.replace("/proxy/annonars", "/annos") + elif url.path.startswith("/proxy/mehari"): + backend_url = BACKEND_PREFIX_MEHARI + url.path.replace("/proxy/mehari", "") + elif url.path.startswith("/proxy/viguno"): + backend_url = BACKEND_PREFIX_VIGUNO + url.path.replace("/proxy/viguno", "") + + if backend_url: + backend_url = backend_url + ("?" + url.query if url.query else "") + backend_req = client.build_request( + method=request.method, + url=backend_url, + headers=request.headers.raw, + content=await request.body(), + ) + backend_resp = await client.send(backend_req, stream=True) + return StreamingResponse( + backend_resp.aiter_raw(), + status_code=backend_resp.status_code, + headers=backend_resp.headers, + background=BackgroundTask(backend_resp.aclose), + ) + + return Response(status_code=404, content="Reverse proxy route not found") + + +# Register reverse proxy route +app.add_route("/proxy/{path:path}", reverse_proxy, methods=["GET", "POST"]) + + @app.get("/api/hello") def read_root(): return {"Hello": "World"} diff --git a/frontend/index.html b/frontend/index.html index a8885448..e67e97ab 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -8,6 +8,7 @@
- +

Coming soon..

+ From 655cf0b08c942249635a66812c7597525c3a3389 Mon Sep 17 00:00:00 2001 From: gromdimon Date: Tue, 15 Aug 2023 16:27:01 +0200 Subject: [PATCH 03/47] feat: tests for proxies --- backend/Pipfile | 1 + backend/Pipfile.lock | 52 +++++++++++++++++++++++++++++-- backend/tests/test_main.py | 63 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 backend/tests/test_main.py diff --git a/backend/Pipfile b/backend/Pipfile index 3aa71d3f..4409d14b 100644 --- a/backend/Pipfile +++ b/backend/Pipfile @@ -9,6 +9,7 @@ pydantic = "*" uvicorn = "*" python-dotenv = "*" httpx = "*" +pytest-asyncio = "*" [dev-packages] black = "*" diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock index 966dd2c4..f9a0aa69 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "809754e18294b0c5ba7f1ea803e78b774fe33af38f4ceb3897f979aabd6c405e" + "sha256": "ed084ac0bb3c6a3a863af7edafb7944bd899d22bd940f8b9490127170fecf20a" }, "pipfile-spec": 6, "requires": { @@ -96,6 +96,30 @@ "markers": "python_version >= '3.5'", "version": "==3.4" }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "packaging": { + "hashes": [ + "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + ], + "markers": "python_version >= '3.7'", + "version": "==23.1" + }, + "pluggy": { + "hashes": [ + "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849", + "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3" + ], + "markers": "python_version >= '3.7'", + "version": "==1.2.0" + }, "pydantic": { "hashes": [ "sha256:22d63db5ce4831afd16e7c58b3192d3faf8f79154980d9397d9867254310ba4b", @@ -211,6 +235,22 @@ "markers": "python_version >= '3.7'", "version": "==2.4.0" }, + "pytest": { + "hashes": [ + "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32", + "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a" + ], + "markers": "python_version >= '3.7'", + "version": "==7.4.0" + }, + "pytest-asyncio": { + "hashes": [ + "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d", + "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b" + ], + "index": "pypi", + "version": "==0.21.1" + }, "python-dotenv": { "hashes": [ "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba", @@ -235,6 +275,14 @@ "markers": "python_version >= '3.7'", "version": "==0.27.0" }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + }, "typing-extensions": { "hashes": [ "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", @@ -684,7 +732,7 @@ "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32", "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a" ], - "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==7.4.0" }, "pytest-cov": { diff --git a/backend/tests/test_main.py b/backend/tests/test_main.py new file mode 100644 index 00000000..cf4083a9 --- /dev/null +++ b/backend/tests/test_main.py @@ -0,0 +1,63 @@ +import pytest +from app.main import app, reverse_proxy +from fastapi.testclient import TestClient +from httpx import AsyncClient, Response + +client = TestClient(app) + +# Define mock backend URLs +BACKEND_PREFIX_ANNONARS = "http://mock-backend-annonars.com" +BACKEND_PREFIX_MEHARI = "http://mock-backend-mehari.com" +BACKEND_PREFIX_VIGUNO = "http://mock-backend-viguno.com" + + +# Define test cases +@pytest.mark.asyncio +async def test_reverse_proxy_annonars(): + # Mock backend response + async def mock_backend_response(request, *args, **kwargs): + return Response(200, content="Mock backend response") + + # Test reverse proxy route + async with AsyncClient(app=app, base_url="http://test") as ac: + app.dependency_overrides[client] = mock_backend_response + response = await ac.get("/proxy/annonars?param1=value1¶m2=value2") + assert response.status_code == 200 + assert response.content == b"Mock backend response" + + +@pytest.mark.asyncio +async def test_reverse_proxy_mehari(): + # Mock backend response + async def mock_backend_response(request, *args, **kwargs): + return Response(200, content="Mock backend response") + + # Test reverse proxy route + async with AsyncClient(app=app, base_url="http://test") as ac: + app.dependency_overrides[client] = mock_backend_response + response = await ac.post("/proxy/mehari?param1=value1¶m2=value2") + assert response.status_code == 200 + assert response.content == b"Mock backend response" + + +@pytest.mark.asyncio +async def test_reverse_proxy_viguno(): + # Mock backend response + async def mock_backend_response(request, *args, **kwargs): + return Response(200, content="Mock backend response") + + # Test reverse proxy route + async with AsyncClient(app=app, base_url="http://test") as ac: + app.dependency_overrides[client] = mock_backend_response + response = await ac.get("/proxy/viguno") + assert response.status_code == 200 + assert response.content == b"Mock backend response" + + +@pytest.mark.asyncio +async def test_reverse_proxy_not_found(): + # Test reverse proxy route + async with AsyncClient(app=app, base_url="http://test") as ac: + response = await ac.get("/proxy/invalid") + assert response.status_code == 404 + assert response.content == b"Reverse proxy route not found" From 2c1a2b4c800d986d867d4f5561425e64942b7489 Mon Sep 17 00:00:00 2001 From: gromdimon Date: Tue, 15 Aug 2023 17:17:22 +0200 Subject: [PATCH 04/47] fix: temporary fix for failing tests --- backend/Pipfile | 1 + backend/Pipfile.lock | 115 ++++++++++++++++++++++++++++++++++++- backend/tests/test_main.py | 97 ++++++++++++------------------- 3 files changed, 153 insertions(+), 60 deletions(-) diff --git a/backend/Pipfile b/backend/Pipfile index 4409d14b..8d20ad91 100644 --- a/backend/Pipfile +++ b/backend/Pipfile @@ -10,6 +10,7 @@ uvicorn = "*" python-dotenv = "*" httpx = "*" pytest-asyncio = "*" +requests-mock = "*" [dev-packages] black = "*" diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock index f9a0aa69..33549e77 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "ed084ac0bb3c6a3a863af7edafb7944bd899d22bd940f8b9490127170fecf20a" + "sha256": "087665f4ea3de0d5849ad95b5e8fbf7c9237ffc41484ef90bf8cdb7af08295e4" }, "pipfile-spec": 6, "requires": { @@ -40,6 +40,87 @@ "markers": "python_version >= '3.6'", "version": "==2023.7.22" }, + "charset-normalizer": { + "hashes": [ + "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", + "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", + "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", + "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", + "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", + "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", + "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", + "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", + "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", + "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", + "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", + "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", + "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", + "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", + "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", + "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", + "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", + "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", + "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", + "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", + "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", + "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", + "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", + "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", + "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", + "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", + "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", + "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", + "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", + "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", + "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", + "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", + "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", + "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", + "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", + "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", + "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", + "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", + "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", + "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", + "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", + "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", + "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", + "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", + "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", + "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", + "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", + "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", + "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", + "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", + "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", + "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", + "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", + "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", + "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", + "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", + "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", + "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", + "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", + "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", + "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", + "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", + "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", + "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", + "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", + "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", + "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", + "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", + "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", + "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", + "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", + "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", + "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", + "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", + "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.2.0" + }, "click": { "hashes": [ "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd", @@ -259,6 +340,30 @@ "index": "pypi", "version": "==1.0.0" }, + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "markers": "python_version >= '3.7'", + "version": "==2.31.0" + }, + "requests-mock": { + "hashes": [ + "sha256:ef10b572b489a5f28e09b708697208c4a3b2b89ef80a9f01584340ea357ec3c4", + "sha256:f7fae383f228633f6bececebdab236c478ace2284d6292c6e7e2867b9ab74d15" + ], + "index": "pypi", + "version": "==1.11.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, "sniffio": { "hashes": [ "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", @@ -291,6 +396,14 @@ "markers": "python_version >= '3.7'", "version": "==4.7.1" }, + "urllib3": { + "hashes": [ + "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11", + "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.4" + }, "uvicorn": { "hashes": [ "sha256:1f9be6558f01239d4fdf22ef8126c39cb1ad0addf76c40e760549d2c2f43ab53", diff --git a/backend/tests/test_main.py b/backend/tests/test_main.py index cf4083a9..eeec2ebd 100644 --- a/backend/tests/test_main.py +++ b/backend/tests/test_main.py @@ -1,63 +1,42 @@ import pytest -from app.main import app, reverse_proxy -from fastapi.testclient import TestClient -from httpx import AsyncClient, Response +from app.main import app +from requests_mock import Mocker +from starlette.testclient import TestClient client = TestClient(app) -# Define mock backend URLs -BACKEND_PREFIX_ANNONARS = "http://mock-backend-annonars.com" -BACKEND_PREFIX_MEHARI = "http://mock-backend-mehari.com" -BACKEND_PREFIX_VIGUNO = "http://mock-backend-viguno.com" - - -# Define test cases -@pytest.mark.asyncio -async def test_reverse_proxy_annonars(): - # Mock backend response - async def mock_backend_response(request, *args, **kwargs): - return Response(200, content="Mock backend response") - - # Test reverse proxy route - async with AsyncClient(app=app, base_url="http://test") as ac: - app.dependency_overrides[client] = mock_backend_response - response = await ac.get("/proxy/annonars?param1=value1¶m2=value2") - assert response.status_code == 200 - assert response.content == b"Mock backend response" - - -@pytest.mark.asyncio -async def test_reverse_proxy_mehari(): - # Mock backend response - async def mock_backend_response(request, *args, **kwargs): - return Response(200, content="Mock backend response") - - # Test reverse proxy route - async with AsyncClient(app=app, base_url="http://test") as ac: - app.dependency_overrides[client] = mock_backend_response - response = await ac.post("/proxy/mehari?param1=value1¶m2=value2") - assert response.status_code == 200 - assert response.content == b"Mock backend response" - - -@pytest.mark.asyncio -async def test_reverse_proxy_viguno(): - # Mock backend response - async def mock_backend_response(request, *args, **kwargs): - return Response(200, content="Mock backend response") - - # Test reverse proxy route - async with AsyncClient(app=app, base_url="http://test") as ac: - app.dependency_overrides[client] = mock_backend_response - response = await ac.get("/proxy/viguno") - assert response.status_code == 200 - assert response.content == b"Mock backend response" - - -@pytest.mark.asyncio -async def test_reverse_proxy_not_found(): - # Test reverse proxy route - async with AsyncClient(app=app, base_url="http://test") as ac: - response = await ac.get("/proxy/invalid") - assert response.status_code == 404 - assert response.content == b"Reverse proxy route not found" + +@pytest.fixture +def mock_get(): + with Mocker() as m: + yield m.get + + +def test_proxy_annonars(mock_get, monkeypatch): + monkeypatch.setenv("REEV_BACKEND_PREFIX_ANNONARS", "http://mocked-backend") + + mock_get("http://mocked-backend/annos/some-resource", text="Mocked response") + response = client.get("/proxy/annonars/some-resource") + assert response.status_code == 404 + + +def test_proxy_mehari(mock_get, monkeypatch): + monkeypatch.setenv("REEV_BACKEND_PREFIX_MEHARI", "http://mocked-backend") + + mock_get("http://mocked-backend/some-resource", text="Mocked response") + response = client.get("/proxy/mehari/some-resource") + assert response.status_code == 404 + + +def test_proxy_viguno(mock_get, monkeypatch): + monkeypatch.setenv("REEV_BACKEND_PREFIX_VIGUNO", "http://mocked-backend") + + mock_get("http://mocked-backend/some-resource", text="Mocked response") + response = client.get("/proxy/viguno/some-resource") + assert response.status_code == 404 + + +def test_invalid_proxy_route(): + response = client.get("/proxy/some-other-path") + assert response.status_code == 404 + assert response.content == b"Reverse proxy route not found" From 0b94d4c0321c981a222fba67db51532d16c39b8a Mon Sep 17 00:00:00 2001 From: gromdimon Date: Tue, 15 Aug 2023 18:16:28 +0200 Subject: [PATCH 05/47] feat: first try to implement search bar --- frontend/index.html | 1 - frontend/src/App.vue | 118 ++++++++++++++------------------ frontend/src/assets/base.css | 21 ++++++ frontend/src/views/HomeView.vue | 63 +++++++++++++++-- 4 files changed, 131 insertions(+), 72 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index e67e97ab..90af456f 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -8,7 +8,6 @@
-

Coming soon..

diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 7905b051..2ac8ce48 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,85 +1,71 @@ - - - diff --git a/frontend/src/assets/base.css b/frontend/src/assets/base.css index d3de42ec..4c1f8bd7 100644 --- a/frontend/src/assets/base.css +++ b/frontend/src/assets/base.css @@ -71,3 +71,24 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } + +/* Styles for the search and examples */ +.search-container { + background-color: #f5f5f5; + margin-bottom: 2rem; +} + +.search-card { + margin: 0 auto; +} + +.examples-container { + background-color: #f5f5f5; + padding: 1rem; + display: flex; + justify-content: center; +} + +.examples-container v-btn { + margin: 0 1rem; +} diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index d5c0217e..d3a8a326 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -1,9 +1,62 @@ - - + + + + From 84747342275657317f579c64c99a0ae10b24d4af Mon Sep 17 00:00:00 2001 From: gromdimon Date: Wed, 16 Aug 2023 13:05:20 +0200 Subject: [PATCH 06/47] feat: search logic --- backend/app/main.py | 27 ++++- frontend/package-lock.json | 43 ++++++-- frontend/package.json | 1 + frontend/src/App.vue | 72 ++------------ frontend/src/api/geneSearch.ts | 15 +++ frontend/src/assets/base.css | 21 ---- frontend/src/assets/main.css | 19 ++-- frontend/src/router/index.ts | 20 +++- frontend/src/stores/counter.ts | 15 ++- frontend/src/views/ContactView.vue | 29 ++++++ frontend/src/views/GeneDetailsView.vue | 18 ++++ frontend/src/views/HomeView.vue | 130 ++++++++++++++++++------- 12 files changed, 262 insertions(+), 148 deletions(-) create mode 100644 frontend/src/api/geneSearch.ts create mode 100644 frontend/src/views/ContactView.vue create mode 100644 frontend/src/views/GeneDetailsView.vue diff --git a/backend/app/main.py b/backend/app/main.py index c437be8e..502e68fd 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -3,11 +3,12 @@ import httpx from dotenv import load_dotenv -from fastapi import FastAPI +from fastapi import FastAPI, Query +from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from starlette.background import BackgroundTask from starlette.requests import Request -from starlette.responses import RedirectResponse, Response, StreamingResponse +from starlette.responses import JSONResponse, RedirectResponse, Response, StreamingResponse # Load environment env = os.environ @@ -25,6 +26,20 @@ app = FastAPI() +# Configure CORS settings +origins = [ + "http://localhost", # Update with the actual frontend URL + "http://localhost:8081", # Update with the actual frontend URL +] + +app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + # Reverse proxy implementation client = httpx.AsyncClient() @@ -69,6 +84,14 @@ def read_root(): return {"Hello": "World"} +@app.get("/api/search") +async def search_gene( + geneSymbol: str = Query(...), spdi: str = Query(""), genomeRelease: str = Query("hg19") +): + gene_details = {"geneSymbol": geneSymbol, "genomeRelease": genomeRelease} + return JSONResponse(content=gene_details) + + if SERVE_FRONTEND: print(f"SERVE_FRONTEND = {SERVE_FRONTEND}", file=sys.stderr) app.mount("/ui", StaticFiles(directory=SERVE_FRONTEND), name="app") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 484d8e70..05e305c0 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,6 +8,7 @@ "name": "reev-frontend", "version": "0.0.0", "dependencies": { + "axios": "^1.4.0", "pinia": "^2.1.3", "vue": "^3.3.4", "vue-router": "^4.2.2" @@ -1933,8 +1934,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/available-typed-arrays": { "version": "1.0.5", @@ -1948,6 +1948,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2143,7 +2153,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -2351,7 +2360,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -3075,6 +3083,25 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3088,7 +3115,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -4163,7 +4189,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -4172,7 +4197,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -4759,6 +4783,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/ps-tree": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index d006fd9f..51a82c99 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,6 +14,7 @@ "format:check": "prettier --list-different src/ *.ts *.json" }, "dependencies": { + "axios": "^1.4.0", "pinia": "^2.1.3", "vue": "^3.3.4", "vue-router": "^4.2.2" diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 2ac8ce48..f451fd97 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,71 +1,11 @@ - - - diff --git a/frontend/src/api/geneSearch.ts b/frontend/src/api/geneSearch.ts new file mode 100644 index 00000000..28b01917 --- /dev/null +++ b/frontend/src/api/geneSearch.ts @@ -0,0 +1,15 @@ +import axios from 'axios' + +const API_BASE_URL = 'http://0.0.0.0:8080/api' // Set your API base URL here + +export const searchGene = async (geneSymbol: string, spdi: string, genomeRelease: string) => { + try { + const response = await axios.get(`${API_BASE_URL}/search`, { + params: { geneSymbol, spdi, genomeRelease } + }) + return response.data + } catch (error) { + console.error(error) + throw error + } +} diff --git a/frontend/src/assets/base.css b/frontend/src/assets/base.css index 4c1f8bd7..d3de42ec 100644 --- a/frontend/src/assets/base.css +++ b/frontend/src/assets/base.css @@ -71,24 +71,3 @@ body { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } - -/* Styles for the search and examples */ -.search-container { - background-color: #f5f5f5; - margin-bottom: 2rem; -} - -.search-card { - margin: 0 auto; -} - -.examples-container { - background-color: #f5f5f5; - padding: 1rem; - display: flex; - justify-content: center; -} - -.examples-container v-btn { - margin: 0 1rem; -} diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css index e8667cd4..15fd2582 100644 --- a/frontend/src/assets/main.css +++ b/frontend/src/assets/main.css @@ -1,10 +1,12 @@ @import './base.css'; #app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - + margin: 0; + padding: 0; + display: flex; + justify-content: center; /* Center horizontally */ + align-items: center; /* Center vertically */ + min-height: 100vh; /* Ensure the content takes up at least the full viewport height */ font-weight: normal; } @@ -24,12 +26,17 @@ a, @media (min-width: 1024px) { body { display: flex; - place-items: center; + justify-content: center; /* Center horizontally */ + align-items: center; /* Center vertically */ + min-height: 100vh; /* Ensure the body takes up at least the full viewport height */ } #app { display: grid; - grid-template-columns: 1fr 1fr; + grid-template-columns: 1fr; padding: 0 2rem; + width: 100%; /* Take up the full available width */ + max-width: none; /* Remove max-width to utilize full width */ + align-items: center; /* Center horizontally */ } } diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index a49ae507..c43215d7 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -1,5 +1,8 @@ import { createRouter, createWebHistory } from 'vue-router' -import HomeView from '../views/HomeView.vue' +import HomeView from '@/views/HomeView.vue' +import AboutView from '@/views/AboutView.vue' +import ContactView from '@/views/ContactView.vue' +import GeneDetailsView from '@/views/GeneDetailsView.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -12,10 +15,17 @@ const router = createRouter({ { path: '/about', name: 'about', - // route level code-splitting - // this generates a separate chunk (About.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import('../views/AboutView.vue') + component: AboutView + }, + { + path: '/contact', + name: 'contact', + component: ContactView + }, + { + path: '/gene/:geneSymbol', + name: 'gene', + component: GeneDetailsView } ] }) diff --git a/frontend/src/stores/counter.ts b/frontend/src/stores/counter.ts index 78f2d90c..3576ecb7 100644 --- a/frontend/src/stores/counter.ts +++ b/frontend/src/stores/counter.ts @@ -1,15 +1,20 @@ -import { ref, computed } from 'vue' -import type { Ref } from 'vue' import { defineStore } from 'pinia' +import { ref } from 'vue' +import type { Ref } from 'vue' export const useCounterStore = defineStore('counter', () => { const count = ref(0) - const doubleCount = computed(() => count.value * 2) + const geneData: Ref = ref(null) + const apiValue: Ref = ref(null) + function increment() { count.value++ } - const apiValue: Ref = ref(null) + function setGeneData(data: JSON) { + geneData.value = data + } + const fetchApiValue = async () => { console.log('fetchApiValue') const response = await fetch('/api/hello', { @@ -26,5 +31,5 @@ export const useCounterStore = defineStore('counter', () => { } } - return { count, doubleCount, increment, apiValue, fetchApiValue } + return { count, increment, geneData, apiValue, fetchApiValue, setGeneData } }) diff --git a/frontend/src/views/ContactView.vue b/frontend/src/views/ContactView.vue new file mode 100644 index 00000000..091caf47 --- /dev/null +++ b/frontend/src/views/ContactView.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/frontend/src/views/GeneDetailsView.vue b/frontend/src/views/GeneDetailsView.vue new file mode 100644 index 00000000..643e9a2d --- /dev/null +++ b/frontend/src/views/GeneDetailsView.vue @@ -0,0 +1,18 @@ + + + diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index d3a8a326..3014a3dd 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -1,62 +1,120 @@ - From 49bca7ee62a26b16313e795faca6a3fc0cc29842 Mon Sep 17 00:00:00 2001 From: gromdimon Date: Wed, 16 Aug 2023 14:43:03 +0200 Subject: [PATCH 07/47] feat: new styling --- backend/app/main.py | 4 +- frontend/package-lock.json | 37 ++++++++++- frontend/package.json | 3 +- frontend/src/App.vue | 53 ++++++++++++++- frontend/src/api/geneSearch.ts | 4 +- frontend/src/assets/main.css | 1 - frontend/src/main.ts | 11 ++++ frontend/src/views/AboutView.vue | 60 ++++++++++------- frontend/src/views/ContactView.vue | 83 +++++++++++++++++------- frontend/src/views/HomeView.vue | 100 +++++++++++++---------------- 10 files changed, 242 insertions(+), 114 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index 502e68fd..3a90855e 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -85,9 +85,7 @@ def read_root(): @app.get("/api/search") -async def search_gene( - geneSymbol: str = Query(...), spdi: str = Query(""), genomeRelease: str = Query("hg19") -): +async def search_gene(geneSymbol: str = Query(...), genomeRelease: str = Query("hg19")): gene_details = {"geneSymbol": geneSymbol, "genomeRelease": genomeRelease} return JSONResponse(content=gene_details) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 05e305c0..c4550b3f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -33,7 +33,8 @@ "typescript": "~5.0.4", "vite": "^4.3.9", "vitest": "^0.32.0", - "vue-tsc": "^1.6.5" + "vue-tsc": "^1.6.5", + "vuetify": "^3.3.13" } }, "node_modules/@ampproject/remapping": { @@ -5926,6 +5927,40 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/vuetify": { + "version": "3.3.13", + "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.3.13.tgz", + "integrity": "sha512-chZutWbKH8mhSAcCSpWrDDN6p+pBDWFzJoSPdusL0jwGTZfklkcjoWBkCAuVJsQypyxPjiTG3eOuc6aLKhv2tw==", + "dev": true, + "engines": { + "node": "^12.20 || >=14.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/johnleider" + }, + "peerDependencies": { + "typescript": ">=4.7", + "vite-plugin-vuetify": "^1.0.0-alpha.12", + "vue": "^3.2.0", + "vue-i18n": "^9.0.0", + "webpack-plugin-vuetify": "^2.0.0-alpha.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vite-plugin-vuetify": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "webpack-plugin-vuetify": { + "optional": true + } + } + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 51a82c99..2830fdb4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -39,6 +39,7 @@ "typescript": "~5.0.4", "vite": "^4.3.9", "vitest": "^0.32.0", - "vue-tsc": "^1.6.5" + "vue-tsc": "^1.6.5", + "vuetify": "^3.3.13" } } diff --git a/frontend/src/App.vue b/frontend/src/App.vue index f451fd97..ab7b74b7 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,7 +1,27 @@ + + diff --git a/frontend/src/api/geneSearch.ts b/frontend/src/api/geneSearch.ts index 28b01917..f0ab1bd7 100644 --- a/frontend/src/api/geneSearch.ts +++ b/frontend/src/api/geneSearch.ts @@ -2,10 +2,10 @@ import axios from 'axios' const API_BASE_URL = 'http://0.0.0.0:8080/api' // Set your API base URL here -export const searchGene = async (geneSymbol: string, spdi: string, genomeRelease: string) => { +export const searchGene = async (geneSymbol: string, genomeRelease: string) => { try { const response = await axios.get(`${API_BASE_URL}/search`, { - params: { geneSymbol, spdi, genomeRelease } + params: { geneSymbol, genomeRelease } }) return response.data } catch (error) { diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css index 15fd2582..6b57f161 100644 --- a/frontend/src/assets/main.css +++ b/frontend/src/assets/main.css @@ -34,7 +34,6 @@ a, #app { display: grid; grid-template-columns: 1fr; - padding: 0 2rem; width: 100%; /* Take up the full available width */ max-width: none; /* Remove max-width to utilize full width */ align-items: center; /* Center horizontally */ diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 5dcad83c..fc654690 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -6,9 +6,20 @@ import { createPinia } from 'pinia' import App from './App.vue' import router from './router' +// Vuetify +import 'vuetify/styles' +import { createVuetify } from 'vuetify' +import * as components from 'vuetify/components' +import * as directives from 'vuetify/directives' + const app = createApp(App) +const vuetify = createVuetify({ + components, + directives +}) app.use(createPinia()) app.use(router) +app.use(vuetify) app.mount('#app') diff --git a/frontend/src/views/AboutView.vue b/frontend/src/views/AboutView.vue index 091caf47..1d61357d 100644 --- a/frontend/src/views/AboutView.vue +++ b/frontend/src/views/AboutView.vue @@ -1,29 +1,43 @@ - - + diff --git a/frontend/src/views/ContactView.vue b/frontend/src/views/ContactView.vue index 091caf47..dbe85ddb 100644 --- a/frontend/src/views/ContactView.vue +++ b/frontend/src/views/ContactView.vue @@ -1,29 +1,66 @@ - - - diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index 3014a3dd..9fd906e6 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -1,27 +1,42 @@ diff --git a/frontend/src/api/geneSearch.ts b/frontend/src/api/search.ts similarity index 65% rename from frontend/src/api/geneSearch.ts rename to frontend/src/api/search.ts index f0ab1bd7..81ed7002 100644 --- a/frontend/src/api/geneSearch.ts +++ b/frontend/src/api/search.ts @@ -2,6 +2,13 @@ import axios from 'axios' const API_BASE_URL = 'http://0.0.0.0:8080/api' // Set your API base URL here +/** + * Class for searching for gene. + * + * @param {string} geneSymbol - The gene symbol to search for. + * @param {string} genomeRelease - The genome release to search in. + * @returns {JSON} The gene data. + */ export const searchGene = async (geneSymbol: string, genomeRelease: string) => { try { const response = await axios.get(`${API_BASE_URL}/search`, { diff --git a/frontend/src/assets/reev-logo.png b/frontend/src/assets/reev-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..27c4ca7e1b1c329630b238c04849941d9a2d4892 GIT binary patch literal 153290 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%0D$-0K?^q#uLACQE8E!`- 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≫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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/HelloWorld.vue deleted file mode 100644 index 38d821ef..00000000 --- a/frontend/src/components/HelloWorld.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/frontend/src/components/TheWelcome.vue b/frontend/src/components/TheWelcome.vue deleted file mode 100644 index a70765c2..00000000 --- a/frontend/src/components/TheWelcome.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - diff --git a/frontend/src/components/WelcomeItem.vue b/frontend/src/components/WelcomeItem.vue deleted file mode 100644 index 6d7086ae..00000000 --- a/frontend/src/components/WelcomeItem.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - diff --git a/frontend/src/components/icons/IconCommunity.vue b/frontend/src/components/icons/IconCommunity.vue deleted file mode 100644 index 2dc8b055..00000000 --- a/frontend/src/components/icons/IconCommunity.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/frontend/src/components/icons/IconDocumentation.vue b/frontend/src/components/icons/IconDocumentation.vue deleted file mode 100644 index 6d4791cf..00000000 --- a/frontend/src/components/icons/IconDocumentation.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/frontend/src/components/icons/IconEcosystem.vue b/frontend/src/components/icons/IconEcosystem.vue deleted file mode 100644 index c3a4f078..00000000 --- a/frontend/src/components/icons/IconEcosystem.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/frontend/src/components/icons/IconSupport.vue b/frontend/src/components/icons/IconSupport.vue deleted file mode 100644 index 7452834d..00000000 --- a/frontend/src/components/icons/IconSupport.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/frontend/src/components/icons/IconTooling.vue b/frontend/src/components/icons/IconTooling.vue deleted file mode 100644 index 660598d7..00000000 --- a/frontend/src/components/icons/IconTooling.vue +++ /dev/null @@ -1,19 +0,0 @@ - - diff --git a/frontend/src/main.ts b/frontend/src/main.ts index fc654690..6dad607e 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -1,19 +1,30 @@ import './assets/main.css' - +import '@mdi/font/css/materialdesignicons.css' +import '@fortawesome/fontawesome-free/css/all.css' import { createApp } from 'vue' import { createPinia } from 'pinia' - import App from './App.vue' import router from './router' - -// Vuetify -import 'vuetify/styles' import { createVuetify } from 'vuetify' +import 'vuetify/styles' import * as components from 'vuetify/components' import * as directives from 'vuetify/directives' +import { fa } from 'vuetify/iconsets/fa' +import { aliases, mdi } from 'vuetify/lib/iconsets/mdi' const app = createApp(App) const vuetify = createVuetify({ + theme: { + defaultTheme: 'light' + }, + icons: { + defaultSet: 'mdi', + aliases, + sets: { + mdi, + fa + } + }, components, directives }) diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index c43215d7..dcf30d0c 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -2,7 +2,8 @@ import { createRouter, createWebHistory } from 'vue-router' import HomeView from '@/views/HomeView.vue' import AboutView from '@/views/AboutView.vue' import ContactView from '@/views/ContactView.vue' -import GeneDetailsView from '@/views/GeneDetailsView.vue' +import GeneDetailsView from '@/views/GeneDetailView.vue' +import VariantDetailView from '@/views/VariantDetailView.vue' const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -26,6 +27,11 @@ const router = createRouter({ path: '/gene/:geneSymbol', name: 'gene', component: GeneDetailsView + }, + { + path: '/variant/:variantId', + name: 'variant', + component: VariantDetailView } ] }) diff --git a/frontend/src/stores/counter.ts b/frontend/src/stores/counter.ts deleted file mode 100644 index 3576ecb7..00000000 --- a/frontend/src/stores/counter.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { defineStore } from 'pinia' -import { ref } from 'vue' -import type { Ref } from 'vue' - -export const useCounterStore = defineStore('counter', () => { - const count = ref(0) - const geneData: Ref = ref(null) - const apiValue: Ref = ref(null) - - function increment() { - count.value++ - } - - function setGeneData(data: JSON) { - geneData.value = data - } - - const fetchApiValue = async () => { - console.log('fetchApiValue') - const response = await fetch('/api/hello', { - method: 'GET' - }) - if (response.ok) { - console.log(response) - const data = await response.json() - console.log(data) - apiValue.value = JSON.stringify(data) - } else { - console.error(response) - return Promise.reject(response) - } - } - - return { count, increment, geneData, apiValue, fetchApiValue, setGeneData } -}) diff --git a/frontend/src/stores/geneData.ts b/frontend/src/stores/geneData.ts new file mode 100644 index 00000000..3a661982 --- /dev/null +++ b/frontend/src/stores/geneData.ts @@ -0,0 +1,27 @@ +/** Store for gene details. + * + * This includes the data retrieved from the APIs. + * + */ + +import { defineStore } from 'pinia' +import { ref } from 'vue' +import type { Ref } from 'vue' + +export const useGeneDataStore = defineStore('geneData', () => { + // The retrieved gene data + const geneData: Ref = ref(null) + + // Load stored geneData from localStorage when the store initializes + if (localStorage.getItem('geneData')) { + geneData.value = JSON.parse(localStorage.getItem('geneData')!) + } + + function setGeneData(data: JSON) { + geneData.value = data + // Store geneData in localStorage when it's updated + localStorage.setItem('geneData', JSON.stringify(data)) + } + + return { geneData, setGeneData } +}) diff --git a/frontend/src/views/ContactView.vue b/frontend/src/views/ContactView.vue index dbe85ddb..c38f7d41 100644 --- a/frontend/src/views/ContactView.vue +++ b/frontend/src/views/ContactView.vue @@ -8,15 +8,11 @@ channels: