From a7a62d70f738e25732dd17d48807eda907692e30 Mon Sep 17 00:00:00 2001 From: Travis Briggs Date: Mon, 6 Jan 2025 11:12:09 -0800 Subject: [PATCH 1/9] Install celery --- Pipfile | 1 + Pipfile.lock | 554 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 367 insertions(+), 188 deletions(-) diff --git a/Pipfile b/Pipfile index e5d1102..37ab80f 100644 --- a/Pipfile +++ b/Pipfile @@ -19,6 +19,7 @@ alembic = "*" authlib = "*" pymysql = "*" minio = "*" +celery = {extras = ["redis"], version = "*"} [dev-packages] pytest = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 3a8fe38..e1d2e6d 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "327157e4676efb3377cabab61d4a576046970a699435d65bfedad4c3c4e1ee8d" + "sha256": "353b1561420d67d3b9b12366b8445005b82690ed20d3e0cccf801bb39b261e89" }, "pipfile-spec": 6, "requires": { @@ -25,6 +25,14 @@ "markers": "python_version >= '3.8'", "version": "==1.14.0" }, + "amqp": { + "hashes": [ + "sha256:43b3319e1b4e7d1251833a93d672b4af1e40f3d632d479b98661a95f117880a2", + "sha256:cddc00c725449522023bad949f70fff7b48f0b1ade74d170a6f10ab044739432" + ], + "markers": "python_version >= '3.6'", + "version": "==5.3.1" + }, "argon2-cffi": { "hashes": [ "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", @@ -62,12 +70,20 @@ }, "authlib": { "hashes": [ - "sha256:4b16130117f9eb82aa6eec97f6dd4673c3f960ac0283ccdae2897ee4bc030ba2", - "sha256:ede026a95e9f5cdc2d4364a52103f5405e75aa156357e831ef2bfd0bc5094dfc" + "sha256:1c1e6608b5ed3624aeeee136ca7f8c120d6f51f731aa152b153d54741840e1f2", + "sha256:4bb20b978c8b636222b549317c1815e1fe62234fc1c5efe8855d84aebf3a74e3" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.3.2" + "markers": "python_version >= '3.9'", + "version": "==1.4.0" + }, + "billiard": { + "hashes": [ + "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f", + "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb" + ], + "markers": "python_version >= '3.7'", + "version": "==4.2.1" }, "blinker": { "hashes": [ @@ -85,6 +101,17 @@ "markers": "python_version >= '3.7'", "version": "==5.5.0" }, + "celery": { + "extras": [ + "redis" + ], + "hashes": [ + "sha256:369631eb580cf8c51a82721ec538684994f8277637edde2dfc0dacd73ed97f64", + "sha256:504a19140e8d3029d5acad88330c541d4c3f64c789d85f94756762d8bca7e706" + ], + "markers": "python_version >= '3.8'", + "version": "==5.4.0" + }, "certifi": { "hashes": [ "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", @@ -168,122 +195,132 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", - "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", - "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", - "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", - "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", - "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", - "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", - "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", - "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", - "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", - "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", - "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", - "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", - "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", - "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", - "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", - "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", - "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", - "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", - "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", - "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", - "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", - "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", - "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", - "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", - "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", - "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", - "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", - "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", - "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", - "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", - "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", - "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", - "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", - "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", - "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", - "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", - "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", - "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", - "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", - "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", - "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", - "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", - "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", - "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", - "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", - "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", - "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", - "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", - "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", - "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", - "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", - "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", - "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", - "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", - "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", - "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", - "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", - "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", - "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", - "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", - "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", - "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", - "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", - "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", - "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", - "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", - "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", - "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", - "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", - "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", - "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", - "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", - "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", - "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", - "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", - "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", - "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", - "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", - "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", - "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", - "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", - "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", - "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", - "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", - "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", - "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", - "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", - "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", - "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", - "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" + "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", + "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", + "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", + "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", + "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", + "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", + "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", + "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", + "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", + "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", + "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", + "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", + "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", + "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", + "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", + "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", + "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", + "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", + "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", + "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", + "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", + "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", + "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", + "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", + "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", + "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", + "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", + "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", + "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", + "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", + "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", + "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", + "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", + "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", + "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", + "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", + "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", + "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", + "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", + "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", + "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", + "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", + "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", + "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", + "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", + "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", + "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", + "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", + "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", + "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", + "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", + "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", + "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", + "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", + "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", + "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", + "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", + "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", + "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", + "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", + "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", + "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", + "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", + "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", + "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", + "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", + "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", + "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", + "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", + "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.4.0" + "markers": "python_version >= '3.7'", + "version": "==3.4.1" }, "click": { "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", + "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" ], "markers": "python_version >= '3.7'", - "version": "==8.1.7" + "version": "==8.1.8" + }, + "click-didyoumean": { + "hashes": [ + "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463", + "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c" + ], + "markers": "python_full_version >= '3.6.2'", + "version": "==0.3.1" + }, + "click-plugins": { + "hashes": [ + "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b", + "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8" + ], + "version": "==1.1.1" + }, + "click-repl": { + "hashes": [ + "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9", + "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812" + ], + "markers": "python_version >= '3.6'", + "version": "==0.3.0" }, "cryptography": { "hashes": [ @@ -349,6 +386,85 @@ "markers": "python_version >= '3.7'", "version": "==2.37.0" }, + "greenlet": { + "hashes": [ + "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", + "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7", + "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", + "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", + "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", + "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", + "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", + "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", + "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", + "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa", + "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", + "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", + "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", + "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22", + "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9", + "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", + "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba", + "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3", + "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", + "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", + "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291", + "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", + "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", + "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", + "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", + "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef", + "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c", + "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", + "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c", + "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", + "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", + "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8", + "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d", + "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", + "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145", + "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", + "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", + "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e", + "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", + "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1", + "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef", + "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", + "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", + "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", + "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437", + "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd", + "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981", + "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", + "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", + "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798", + "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", + "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", + "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", + "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", + "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af", + "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", + "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", + "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42", + "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e", + "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81", + "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", + "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", + "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc", + "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de", + "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111", + "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", + "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", + "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", + "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", + "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", + "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803", + "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", + "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f" + ], + "markers": "python_version < '3.13' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.1.1" + }, "gunicorn": { "hashes": [ "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", @@ -376,11 +492,19 @@ }, "jinja2": { "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", + "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb" ], "markers": "python_version >= '3.7'", - "version": "==3.1.4" + "version": "==3.1.5" + }, + "kombu": { + "hashes": [ + "sha256:14212f5ccf022fc0a70453bb025a1dcc32782a588c49ea866884047d66e14763", + "sha256:eef572dd2fd9fc614b37580e3caeafdd5af46c1eff31e7fba89138cdb406f2cf" + ], + "markers": "python_version >= '3.8'", + "version": "==5.4.2" }, "mako": { "hashes": [ @@ -459,12 +583,12 @@ }, "minio": { "hashes": [ - "sha256:2a3fcf4ab753824de8ae3ffeb14da33d6ad416f83a7e82363a27b34da8e91f27", - "sha256:4b63370ca83f82c23e6fb0a094a1e2b08b275884ae43f6a90c4388a45633e3f5" + "sha256:868dfe907e1702ce4bec86df1f3ced577a73ca85f344ef898d94fe2b5237f8c1", + "sha256:f5c24bf236fefd2edc567cd4455dc49a11ad8ff7ac984bb031b849d82f01222a" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.2.12" + "version": "==7.2.14" }, "packaging": { "hashes": [ @@ -474,6 +598,14 @@ "markers": "python_version >= '3.8'", "version": "==24.2" }, + "prompt-toolkit": { + "hashes": [ + "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", + "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.0.48" + }, "pyasn1": { "hashes": [ "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", @@ -556,6 +688,14 @@ "markers": "python_version >= '3.7'", "version": "==1.1.1" }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==2.9.0.post0" + }, "python-dotenv": { "hashes": [ "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", @@ -565,6 +705,13 @@ "markers": "python_version >= '3.8'", "version": "==1.0.1" }, + "redis": { + "hashes": [ + "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f", + "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4" + ], + "version": "==5.2.1" + }, "requests": { "hashes": [ "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", @@ -582,6 +729,14 @@ "markers": "python_version >= '3.6' and python_version < '4'", "version": "==4.9" }, + "six": { + "hashes": [ + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.17.0" + }, "sqlalchemy": { "hashes": [ "sha256:03e08af7a5f9386a43919eda9de33ffda16b44eb11f3b313e6822243770e9763", @@ -654,13 +809,21 @@ "markers": "python_version >= '3.8'", "version": "==4.12.2" }, + "tzdata": { + "hashes": [ + "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc", + "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd" + ], + "markers": "python_version >= '2'", + "version": "==2024.2" + }, "urllib3": { "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" ], - "markers": "python_version >= '3.8'", - "version": "==2.2.3" + "markers": "python_version >= '3.9'", + "version": "==2.3.0" }, "uuid7": { "hashes": [ @@ -671,6 +834,21 @@ "markers": "python_version >= '3.7'", "version": "==0.1.0" }, + "vine": { + "hashes": [ + "sha256:40fdf3c48b2cfe1c38a49e9ae2da6fda88e4794c810050a728bd7413811fb1dc", + "sha256:8b62e981d35c41049211cf62a0a1242d8c1ee9bd15bb196ce38aefd6799e61e0" + ], + "markers": "python_version >= '3.6'", + "version": "==5.1.0" + }, + "wcwidth": { + "hashes": [ + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" + ], + "version": "==0.2.13" + }, "werkzeug": { "hashes": [ "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", @@ -686,71 +864,71 @@ "toml" ], "hashes": [ - "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4", - "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c", - "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f", - "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b", - "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6", - "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae", - "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692", - "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4", - "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4", - "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717", - "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d", - "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198", - "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1", - "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3", - "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb", - "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d", - "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08", - "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf", - "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b", - "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710", - "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c", - "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae", - "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077", - "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00", - "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb", - "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664", - "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014", - "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9", - "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6", - "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e", - "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9", - "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa", - "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611", - "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b", - "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a", - "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8", - "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030", - "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678", - "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015", - "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902", - "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97", - "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845", - "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419", - "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464", - "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be", - "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9", - "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7", - "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be", - "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1", - "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba", - "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5", - "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073", - "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4", - "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a", - "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a", - "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3", - "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599", - "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0", - "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b", - "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec", - "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1", - "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3" + "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", + "sha256:0aa9692b4fdd83a4647eeb7db46410ea1322b5ed94cd1715ef09d1d5922ba87f", + "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", + "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", + "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", + "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", + "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", + "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", + "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", + "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", + "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", + "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", + "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", + "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", + "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", + "sha256:457574f4599d2b00f7f637a0700a6422243b3565509457b2dbd3f50703e11f59", + "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", + "sha256:4bcc276261505d82f0ad426870c3b12cb177752834a633e737ec5ee79bbdff18", + "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", + "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", + "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", + "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", + "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", + "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", + "sha256:59af35558ba08b758aec4d56182b222976330ef8d2feacbb93964f576a7e7a90", + "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", + "sha256:656c82b8a0ead8bba147de9a89bda95064874c91a3ed43a00e687f23cc19d53a", + "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", + "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", + "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", + "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", + "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", + "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", + "sha256:7ed2f37cfce1ce101e6dffdfd1c99e729dd2ffc291d02d3e2d0af8b53d13840d", + "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", + "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", + "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", + "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", + "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", + "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", + "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", + "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", + "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", + "sha256:a5e37dc41d57ceba70956fa2fc5b63c26dba863c946ace9705f8eca99daecdc4", + "sha256:aa744da1820678b475e4ba3dfd994c321c5b13381d1041fe9c608620e6676e25", + "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", + "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", + "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", + "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", + "sha256:c0b1818063dc9e9d838c09e3a473c1422f517889436dd980f5d721899e66f315", + "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", + "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", + "sha256:ccc2b70a7ed475c68ceb548bf69cec1e27305c1c2606a5eb7c3afff56a1b3b27", + "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", + "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", + "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", + "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", + "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", + "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", + "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", + "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", + "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f" ], "markers": "python_version >= '3.9'", - "version": "==7.6.9" + "version": "==7.6.10" }, "iniconfig": { "hashes": [ From cfa8f922ed6d71987b5bae4b8c58a393ea3e11b0 Mon Sep 17 00:00:00 2001 From: Travis Briggs Date: Mon, 6 Jan 2025 11:54:23 -0800 Subject: [PATCH 2/9] Hello world sample task with celery --- rainfall/site.py | 3 +++ rainfall/tasks.py | 12 ++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 rainfall/tasks.py diff --git a/rainfall/site.py b/rainfall/site.py index dac0805..ff310e3 100644 --- a/rainfall/site.py +++ b/rainfall/site.py @@ -12,6 +12,7 @@ from rainfall import object_storage from rainfall.db import db from rainfall.models.site import Site +from rainfall import tasks log = logging.getLogger(__name__) @@ -118,6 +119,8 @@ def cleanup_site(data_dir_path, preview_dir_path, site_id): def generate_site(data_dir_path, preview_dir_path, site_id): + tasks.add.delay(42, 10) + download_site_objects(data_dir_path, site_id) generate_eno_files(data_dir_path, site_id) diff --git a/rainfall/tasks.py b/rainfall/tasks.py new file mode 100644 index 0000000..42d0a98 --- /dev/null +++ b/rainfall/tasks.py @@ -0,0 +1,12 @@ +import os + +from celery import Celery + +task_app = Celery('tasks', + broker_url=os.environ['REDIS_URL'], + result_backend=os.environ['REDIS_URL']) + + +@task_app.task +def add(x, y): + return x + y From 91fd947588477621bbd43cd6c01ec2d49bed92b4 Mon Sep 17 00:00:00 2001 From: Travis Briggs Date: Mon, 6 Jan 2025 11:54:38 -0800 Subject: [PATCH 3/9] Fly io configuration to run celery tasks as separate worker --- Dockerfile | 2 +- docker-compose-dev.yml | 6 ++++++ entrypoint.sh | 9 +++++++++ fly.toml | 4 ++++ 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100755 entrypoint.sh diff --git a/Dockerfile b/Dockerfile index d71c773..abec7c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -56,4 +56,4 @@ RUN pipenv install --deploy --ignore-pipfile COPY . . COPY --from=build /usr/src/app/frontend ./rainfall-frontend -CMD ["pipenv", "run", "gunicorn", "--error-logfile", "-", "--access-logfile", "-", "-b", "0.0.0.0", "rainfall.main:create_app()"] +ENTRYPOINT ["./entrypoint.sh"] diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml index 1d0a857..a77fb60 100644 --- a/docker-compose-dev.yml +++ b/docker-compose-dev.yml @@ -22,6 +22,12 @@ services: MINIO_ROOT_PASSWORD: rainfall-minio command: server --console-address :9001 /data + redis: + image: redis:latest + ports: + - "6379:6379" + + # Used for formatting the volume as ext4. Otherwise, some minio operations may fail. # Uncomment to format (with docker compose up) and comment afterwards so the volume # is not formatted again. diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..f428204 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +if [[ $# -gt 0 ]]; then + # If we pass a command, run it (for celery workers) + exec "$@" +else + # Else default to starting the server + exec "pipenv run gunicorn --error-logfile - --access-logfile - -b 0.0.0.0 rainfall.main:create_app()" +fi \ No newline at end of file diff --git a/fly.toml b/fly.toml index 5b8c920..b74f8bc 100644 --- a/fly.toml +++ b/fly.toml @@ -8,6 +8,10 @@ primary_region = "sjc" [build] +[processes] + app = "pipenv run gunicorn --error-logfile - --access-logfile - -b 0.0.0.0 rainfall.main:create_app()" + worker = "pipenv run python -m celery -A rainfall.tasks worker -l info" + [mounts] source="rainfall_data" destination="/data" From 86365ffbb6edb1061078f7a418c8156c64959061 Mon Sep 17 00:00:00 2001 From: Travis Briggs Date: Mon, 6 Jan 2025 15:21:20 -0800 Subject: [PATCH 4/9] Attach volume to worker process --- fly.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/fly.toml b/fly.toml index b74f8bc..ac69b04 100644 --- a/fly.toml +++ b/fly.toml @@ -15,6 +15,7 @@ primary_region = "sjc" [mounts] source="rainfall_data" destination="/data" + processes = ["worker"] [http_service] internal_port = 8000 From d98165efa02b975c914f669661af88418fc0a2ea Mon Sep 17 00:00:00 2001 From: Travis Briggs Date: Mon, 6 Jan 2025 15:21:40 -0800 Subject: [PATCH 5/9] Migration for adding preview task id to site --- .../20a525107a88_add_task_id_to_sites.py | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 alembic/versions/20a525107a88_add_task_id_to_sites.py diff --git a/alembic/versions/20a525107a88_add_task_id_to_sites.py b/alembic/versions/20a525107a88_add_task_id_to_sites.py new file mode 100644 index 0000000..c20c777 --- /dev/null +++ b/alembic/versions/20a525107a88_add_task_id_to_sites.py @@ -0,0 +1,34 @@ +"""Add task id to sites + +Revision ID: 20a525107a88 +Revises: 3b83d643e6cb +Create Date: 2025-01-06 14:57:01.760943 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '20a525107a88' +down_revision: Union[str, None] = '3b83d643e6cb' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('sites', sa.Column('preview_task_id', sa.String(length=255), nullable=True)) + op.drop_index('fk_sites_sites_users_id', table_name='sites') + op.create_foreign_key(None, 'sites', 'users', ['user_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'sites', type_='foreignkey') + op.create_index('fk_sites_sites_users_id', 'sites', ['user_id'], unique=False) + op.drop_column('sites', 'preview_task_id') + # ### end Alembic commands ### From 7e11b1a68e38f11160b3895dff91d3e797fc79b4 Mon Sep 17 00:00:00 2001 From: Travis Briggs Date: Mon, 6 Jan 2025 15:22:34 -0800 Subject: [PATCH 6/9] Implementation of async generate site, with status endpoint --- Pipfile | 3 +++ rainfall/main.py | 34 ++++++++++++++++++++++++++++------ rainfall/models/site.py | 1 + rainfall/site.py | 3 --- rainfall/tasks.py | 12 ------------ 5 files changed, 32 insertions(+), 21 deletions(-) delete mode 100644 rainfall/tasks.py diff --git a/Pipfile b/Pipfile index 37ab80f..8c197eb 100644 --- a/Pipfile +++ b/Pipfile @@ -27,3 +27,6 @@ pytest-cov = "*" [requires] python_version = "3.12" + +[scripts] +worker = "pipenv run python -m celery -A rainfall.main worker -l info" diff --git a/rainfall/main.py b/rainfall/main.py index f3a80e9..6fcceb1 100644 --- a/rainfall/main.py +++ b/rainfall/main.py @@ -3,6 +3,8 @@ import flask from authlib.integrations.flask_client import OAuth +from celery import Celery +from celery.result import AsyncResult from flask_seasurf import SeaSurf from rainfall import object_storage @@ -21,6 +23,17 @@ log = logging.getLogger(__name__) logging.basicConfig(level=logging.DEBUG) +task_app = Celery('tasks', + broker_url=os.environ['REDIS_URL'], + result_backend=os.environ['REDIS_URL']) + + +@task_app.task +def generate_site_async(data_dir_path, preview_dir_path, site_id): + app = create_app() + with app.app_context(): + generate_site(data_dir_path, preview_dir_path, site_id) + def create_app(): app = flask.Flask(__name__) @@ -79,12 +92,21 @@ def create_preview(site, user): else: return '', 404 - result = generate_site(app.config['DATA_DIR'], app.config['PREVIEW_DIR'], - str(site.id)) - if result[0]: - return '', 204 - else: - return flask.jsonify(status=500, error=result[1]), 500 + result = generate_site_async.delay(app.config['DATA_DIR'], + app.config['PREVIEW_DIR'], str(site.id)) + site.preview_task_id = result.id + db.session.add(site) + db.session.commit() + return '', 204 + + @app.route('/api/v1/preview//status') + @with_current_user + @with_current_site + def preview_status(site, user): + if site.preview_task_id is None: + return flask.jsonify(status=404, error='No preview task found'), 404 + result = AsyncResult(site.preview_task_id, app=task_app) + return flask.jsonify(status=200, task_status=result.status) @app.route('/preview//') @with_current_user diff --git a/rainfall/models/site.py b/rainfall/models/site.py index 78361df..4e8c1ec 100644 --- a/rainfall/models/site.py +++ b/rainfall/models/site.py @@ -25,6 +25,7 @@ class Site(db.Model): releases: Mapped[List['Release']] = relationship(back_populates='site', cascade='all, delete-orphan') + preview_task_id: Mapped[str] = mapped_column(String(255), nullable=True) def __repr__(self) -> str: return f'Site(id={self.id!r}, user_id={self.user_id!r}, name={self.name!r})' diff --git a/rainfall/site.py b/rainfall/site.py index ff310e3..dac0805 100644 --- a/rainfall/site.py +++ b/rainfall/site.py @@ -12,7 +12,6 @@ from rainfall import object_storage from rainfall.db import db from rainfall.models.site import Site -from rainfall import tasks log = logging.getLogger(__name__) @@ -119,8 +118,6 @@ def cleanup_site(data_dir_path, preview_dir_path, site_id): def generate_site(data_dir_path, preview_dir_path, site_id): - tasks.add.delay(42, 10) - download_site_objects(data_dir_path, site_id) generate_eno_files(data_dir_path, site_id) diff --git a/rainfall/tasks.py b/rainfall/tasks.py deleted file mode 100644 index 42d0a98..0000000 --- a/rainfall/tasks.py +++ /dev/null @@ -1,12 +0,0 @@ -import os - -from celery import Celery - -task_app = Celery('tasks', - broker_url=os.environ['REDIS_URL'], - result_backend=os.environ['REDIS_URL']) - - -@task_app.task -def add(x, y): - return x + y From ecc08a0ee30fca78d0bde31d8603984b53ac0086 Mon Sep 17 00:00:00 2001 From: Travis Briggs Date: Mon, 6 Jan 2025 15:37:44 -0800 Subject: [PATCH 7/9] Frontend polling for preview status --- .../src/components/PreviewSiteButton.vue | 38 +++++++++++++++---- rainfall/main.py | 2 +- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/rainfall-frontend/src/components/PreviewSiteButton.vue b/rainfall-frontend/src/components/PreviewSiteButton.vue index c28614e..f9e4009 100644 --- a/rainfall-frontend/src/components/PreviewSiteButton.vue +++ b/rainfall-frontend/src/components/PreviewSiteButton.vue @@ -5,12 +5,12 @@ export default { props: ['cardinality', 'siteId', 'readyForPreview'], data(): { previewError: string; - previewUrl: undefined | string; + previewUrl?: string; previewLoading: boolean; } { return { previewError: '', - previewUrl: '', + previewUrl: undefined, previewLoading: false, }; }, @@ -26,16 +26,16 @@ export default { method: 'POST', headers: { 'X-CSRFToken': getCsrf() }, }); + this.$emit('preview-requested'); + + this.pollForPreview(); - setTimeout(() => { - this.previewLoading = false; - }, 250); if (resp.ok) { - this.previewUrl = `/preview/${this.siteId}`; - this.$emit('preview-requested'); return; } - + this.showError(resp); + }, + async showError(resp: Response) { let error = 'An unknown error occurred'; if (resp.headers.get('Content-Type') == 'application/json') { const data = await resp.json(); @@ -45,6 +45,28 @@ export default { this.previewError = error; }, 250); }, + async pollForPreview() { + if (this.previewLoading) { + const resp = await fetch(`/api/v1/preview/${this.siteId}/status`, { + method: 'GET', + headers: { 'X-CSRFToken': getCsrf() }, + }); + if (resp.ok) { + const data = await resp.json(); + if (data.task_status == 'SUCCESS') { + this.previewLoading = false; + this.previewUrl = `/preview/${this.siteId}`; + } else if (data.task_status == 'FAILURE') { + this.previewLoading = false; + this.previewError = 'An error occurred while generating the preview'; + } else { + setTimeout(this.pollForPreview, 5000); + } + } + this.showError(resp); + } + return ''; + }, invalidatePreview() { this.previewError = ''; this.previewUrl = undefined; diff --git a/rainfall/main.py b/rainfall/main.py index 6fcceb1..599c85d 100644 --- a/rainfall/main.py +++ b/rainfall/main.py @@ -32,7 +32,7 @@ def generate_site_async(data_dir_path, preview_dir_path, site_id): app = create_app() with app.app_context(): - generate_site(data_dir_path, preview_dir_path, site_id) + return generate_site(data_dir_path, preview_dir_path, site_id) def create_app(): From 2a2e43b6c320729271cfd55a4311284c335b749e Mon Sep 17 00:00:00 2001 From: Travis Briggs Date: Mon, 6 Jan 2025 16:38:02 -0800 Subject: [PATCH 8/9] Tests for frontend preview --- rainfall-frontend/cypress/e2e/edit_site.cy.ts | 485 +++++++++--------- .../src/components/PreviewSiteButton.vue | 4 +- 2 files changed, 255 insertions(+), 234 deletions(-) diff --git a/rainfall-frontend/cypress/e2e/edit_site.cy.ts b/rainfall-frontend/cypress/e2e/edit_site.cy.ts index 547dca8..d53ef50 100644 --- a/rainfall-frontend/cypress/e2e/edit_site.cy.ts +++ b/rainfall-frontend/cypress/e2e/edit_site.cy.ts @@ -37,77 +37,58 @@ describe('Edit Site test', () => { }); }); - describe('when there is one release', () => { + describe('when there are more than 0 releases', () => { beforeEach(() => { - let count = 0; - cy.intercept('GET', 'api/v1/site/06547ed8-206f-7d3d-8000-20ab423e0bb9', (req) => { - if (count === 0) { - count++; - req.reply((res) => { - res.send({ statusCode: 200, fixture: 'site.json' }); - }); - } else if (count === 1) { - count++; - req.reply((res) => { - res.send({ statusCode: 200, fixture: 'site-2.json' }); - }); - } else { - req.reply((res) => { - res.send({ statusCode: 200, fixture: 'site-3.json' }); - }); - } - }).as('load-site'); - cy.visit('/site/06547ed8-206f-7d3d-8000-20ab423e0bb9'); - cy.wait('@load-site'); - }); - - it('shows the add release button', () => { - cy.get('#new-release-button').should('be.visible'); + cy.intercept('GET', 'api/v1/preview/06547ed8-206f-7d3d-8000-20ab423e0bb9', { + statusCode: 204, + }).as('check-site-preview'); }); - - it('shows the preview button', () => { - cy.get('#preview-site-button').should('be.visible'); - }); - - it('has the preview button disabled when there are no releases', () => { - cy.get('#preview-site-button').should('be.disabled'); - }); - - it('starts with the add release button disabled', () => { - cy.get('#new-release-button').should('be.disabled'); - }); - - describe('when a release is added', () => { + describe('when there is one release', () => { beforeEach(() => { - cy.intercept('POST', 'api/v1/release', { - status: 204, - }).as('new-release'); - cy.get('#new-release').click().type('Super Cool Stuff'); - cy.get('#new-release-button').click(); + let count = 0; + cy.intercept('GET', 'api/v1/site/06547ed8-206f-7d3d-8000-20ab423e0bb9', (req) => { + if (count === 0) { + count++; + req.reply((res) => { + res.send({ statusCode: 200, fixture: 'site.json' }); + }); + } else if (count === 1) { + count++; + req.reply((res) => { + res.send({ statusCode: 200, fixture: 'site-2.json' }); + }); + } else { + req.reply((res) => { + res.send({ statusCode: 200, fixture: 'site-3.json' }); + }); + } + }).as('load-site'); + cy.visit('/site/06547ed8-206f-7d3d-8000-20ab423e0bb9'); cy.wait('@load-site'); }); - it('sends a POST request', () => { - cy.get('@new-release') - .its('request.body') - .should('deep.equal', { - release: { - name: `Super Cool Stuff`, - site_id: '06547ed8-206f-7d3d-8000-20ab423e0bb9', - }, - }); + it('shows the add release button', () => { + cy.get('#new-release-button').should('be.visible'); + }); + + it('shows the preview button', () => { + cy.get('#preview-site-button').should('be.visible'); + }); + + it('has the preview button disabled when there are no releases', () => { + cy.get('#preview-site-button').should('be.disabled'); }); - it('displays the newly created release', () => { - cy.get('.release-name').contains('Super Cool Stuff'); + it('starts with the add release button disabled', () => { + cy.get('#new-release-button').should('be.disabled'); }); - describe('when the button is clicked again', () => { + describe('when a release is added', () => { beforeEach(() => { cy.intercept('POST', 'api/v1/release', { status: 204, }).as('new-release'); - cy.get('#new-release').click().clear().type('Release 2'); + cy.get('#new-release').click().type('Super Cool Stuff'); cy.get('#new-release-button').click(); cy.wait('@load-site'); }); @@ -117,240 +98,280 @@ describe('Edit Site test', () => { .its('request.body') .should('deep.equal', { release: { - name: `Release 2`, + name: `Super Cool Stuff`, site_id: '06547ed8-206f-7d3d-8000-20ab423e0bb9', }, }); }); it('displays the newly created release', () => { - cy.get('.release-name').contains('Release 2'); + cy.get('.release-name').contains('Super Cool Stuff'); }); - }); - }); - }); - describe('when there are two releases', () => { - let calledUpload = false; - beforeEach(() => { - let cnt = 0; - cy.intercept('GET', 'api/v1/site/06547ed8-206f-7d3d-8000-20ab423e0bb9', (req) => { - if (cnt === 0) { - cnt++; - req.reply((res) => { - res.send({ statusCode: 200, fixture: 'site-3.json' }); + describe('when the button is clicked again', () => { + beforeEach(() => { + cy.intercept('POST', 'api/v1/release', { + status: 204, + }).as('new-release'); + cy.get('#new-release').click().clear().type('Release 2'); + cy.get('#new-release-button').click(); + cy.wait('@load-site'); }); - } else if (cnt === 1) { - req.reply((res) => { - res.send({ statusCode: 200, fixture: 'site-4.json' }); + + it('sends a POST request', () => { + cy.get('@new-release') + .its('request.body') + .should('deep.equal', { + release: { + name: `Release 2`, + site_id: '06547ed8-206f-7d3d-8000-20ab423e0bb9', + }, + }); }); - } - }).as('load-site'); - cy.intercept('POST', 'api/v1/upload/**', (req) => { - calledUpload = true; - req.reply(204, '', {}); - }).as('upload-songs'); - cy.intercept('GET', 'api/v1/preview/**', (req) => { - req.reply(204, '', {}); - }); - cy.fixture('song.json').as('song'); - cy.visit('/site/06547ed8-206f-7d3d-8000-20ab423e0bb9'); - cy.wait('@load-site'); - }); - it(`doesn't allow you to click Upload Songs without selecting a file`, () => { - cy.get('.upload-songs-button').should('be.disabled'); + it('displays the newly created release', () => { + cy.get('.release-name').contains('Release 2'); + }); + }); + }); }); - describe('when a file is selected for release 1', () => { + describe('when there are two releases', () => { + let calledUpload = false; beforeEach(() => { - cy.get('.upload-input').first().selectFile('@song'); - }); - - it('enables the corresponding upload button', () => { - cy.get('.upload-songs-button').first().should('not.be.disabled'); + let cnt = 0; + cy.intercept('GET', 'api/v1/site/06547ed8-206f-7d3d-8000-20ab423e0bb9', (req) => { + if (cnt === 0) { + cnt++; + req.reply((res) => { + res.send({ statusCode: 200, fixture: 'site-3.json' }); + }); + } else if (cnt === 1) { + req.reply((res) => { + res.send({ statusCode: 200, fixture: 'site-4.json' }); + }); + } + }).as('load-site'); + cy.intercept('POST', 'api/v1/upload/**', (req) => { + calledUpload = true; + req.reply(204, '', {}); + }).as('upload-songs'); + cy.intercept('GET', 'api/v1/preview/**', (req) => { + req.reply(204, '', {}); + }); + cy.fixture('song.json').as('song'); + cy.visit('/site/06547ed8-206f-7d3d-8000-20ab423e0bb9'); + cy.wait('@load-site'); }); - it('does not enable the other upload button', () => { - cy.get('.upload-songs-button').eq(1).should('be.disabled'); + it(`doesn't allow you to click Upload Songs without selecting a file`, () => { + cy.get('.upload-songs-button').should('be.disabled'); }); - describe('when the upload button is clicked', () => { + describe('when a file is selected for release 1', () => { beforeEach(() => { - cy.get('.upload-songs-button').first().click(); + cy.get('.upload-input').first().selectFile('@song'); }); - it('uploads the song', () => { - cy.wait('@upload-songs').then(() => { - cy.wrap(calledUpload).should('eq', true); - }); + it('enables the corresponding upload button', () => { + cy.get('.upload-songs-button').first().should('not.be.disabled'); }); - it('displays the new song', () => { - cy.wait('@upload-songs').then(() => { - cy.get('.file-name').contains('song-1.mp3'); - }); + it('does not enable the other upload button', () => { + cy.get('.upload-songs-button').eq(1).should('be.disabled'); }); - }); - }); - }); - describe('when there is a release with an upload', () => { - beforeEach(() => { - cy.intercept('GET', 'api/v1/user', { - fixture: 'user_welcomed.json', - }); - cy.intercept('GET', 'api/v1/site/06547ed8-206f-7d3d-8000-20ab423e0bb9', { - fixture: 'site-4.json', - }).as('load-site'); - cy.visit('/site/06547ed8-206f-7d3d-8000-20ab423e0bb9'); - cy.wait('@load-site'); - }); + describe('when the upload button is clicked', () => { + beforeEach(() => { + cy.get('.upload-songs-button').first().click(); + }); + + it('uploads the song', () => { + cy.wait('@upload-songs').then(() => { + cy.wrap(calledUpload).should('eq', true); + }); + }); - it('has the preview button enabled', () => { - cy.get('#preview-site-button').should('not.be.disabled'); + it('displays the new song', () => { + cy.wait('@upload-songs').then(() => { + cy.get('.file-name').contains('song-1.mp3'); + }); + }); + }); + }); }); - describe('when the preview button is clicked', () => { - let calledPreview = false; + describe('when there is a release with an upload', () => { beforeEach(() => { - cy.intercept('POST', 'api/v1/preview/06547ed8-206f-7d3d-8000-20ab423e0bb9', (req) => { - calledPreview = true; - req.reply(204, '', {}); - }).as('preview-site'); - cy.get('#preview-site-button').click(); + cy.intercept('GET', 'api/v1/user', { + fixture: 'user_welcomed.json', + }); + cy.intercept('GET', 'api/v1/site/06547ed8-206f-7d3d-8000-20ab423e0bb9', { + fixture: 'site-4.json', + }).as('load-site'); + cy.visit('/site/06547ed8-206f-7d3d-8000-20ab423e0bb9'); + cy.wait('@load-site'); }); - it('calls the preview endpoint', () => { - cy.wait('@preview-site'); - cy.wrap(calledPreview).should('eq', true); + it('has the preview button enabled', () => { + cy.get('#preview-site-button').should('not.be.disabled'); }); - it('shows a loading message', () => { - cy.get('.preview-load').find('.loader').should('be.visible'); - cy.get('.preview-load').should('not.contain', 'Open preview in new window'); - }); + describe.only('when the preview button is clicked', () => { + let calledPreview = false; + beforeEach(() => { + cy.intercept('POST', 'api/v1/preview/06547ed8-206f-7d3d-8000-20ab423e0bb9', (req) => { + calledPreview = true; + req.reply(204, '', {}); + }).as('preview-site'); + + let cnt = 0; + cy.intercept( + 'GET', + 'api/v1/preview/06547ed8-206f-7d3d-8000-20ab423e0bb9/status', + async (req) => { + await new Promise((resolve) => setTimeout(resolve, 250)); + cnt++; + if (cnt < 3) { + req.reply(200, { status: 200, task_status: 'PENDING' }); + } else { + req.reply(200, { tatus: 200, task_status: 'SUCCESS' }); + } + }, + ).as('preview-status'); + cy.get('#preview-site-button').click(); + }); - it('shows the preview link', () => { - cy.wait('@preview-site'); - cy.get('.preview-load').contains('Open preview in new window'); - }); + it('calls the preview endpoint', () => { + cy.wait('@preview-site'); + cy.wrap(calledPreview).should('eq', true); + }); - it('has the right URL for the preview link', () => { - cy.wait('@preview-site'); - cy.get('.preview-link') - .should('have.attr', 'href') - .should('not.be.empty') - .and('contain', '/preview'); - }); - }); + it('shows a loading message', () => { + cy.get('.preview-load').find('.loader').should('be.visible'); + cy.get('.preview-load').should('not.contain', 'Open preview in new window'); + }); - describe('and the delete button is successfully pressed for one of the files', () => { - let calledDelete = false; - beforeEach(() => { - cy.intercept('DELETE', 'api/v1/file/06552cb9-7fe0-7723-8000-82163fc21234', (req) => { - calledDelete = true; - req.reply(204, '', {}); - }).as('delete-song'); - cy.get('.file-name').contains('song-2.mp3').siblings('button').click(); - }); + it('shows the preview link', () => { + cy.wait('@preview-site'); + cy.get('.preview-load').contains('Open preview in new window'); + }); - it('calls the delete endpoint', () => { - cy.wait('@delete-song'); - cy.wrap(calledDelete).should('eq', true); + it('has the right URL for the preview link', () => { + cy.wait('@preview-site'); + cy.get('.preview-link') + .should('have.attr', 'href') + .should('not.be.empty') + .and('contain', '/preview'); + }); }); - it('removes the file from the list', () => { - cy.get('.file-name').contains('song-2.mp3').should('not.exist'); - }); - }); + describe('and the delete button is successfully pressed for one of the files', () => { + let calledDelete = false; + beforeEach(() => { + cy.intercept('DELETE', 'api/v1/file/06552cb9-7fe0-7723-8000-82163fc21234', (req) => { + calledDelete = true; + req.reply(204, '', {}); + }).as('delete-song'); + cy.get('.file-name').contains('song-2.mp3').siblings('button').click(); + }); - describe('and the delete button is successfully pressed for the last file in the list', () => { - let calledDelete = false; - beforeEach(() => { - cy.intercept('DELETE', 'api/v1/file/06552cb9-7fe0-7723-8000-82163fc25478', (req) => { - calledDelete = true; - req.reply(204, '', {}); - }).as('delete-song'); - cy.get('.file-name').contains('a-great-song.mp3').siblings('button').click(); - }); + it('calls the delete endpoint', () => { + cy.wait('@delete-song'); + cy.wrap(calledDelete).should('eq', true); + }); - it('calls the delete endpoint', () => { - cy.wait('@delete-song'); - cy.wrap(calledDelete).should('eq', true); + it('removes the file from the list', () => { + cy.get('.file-name').contains('song-2.mp3').should('not.exist'); + }); }); - it('removes the file from the list', () => { - cy.get('.file-name').contains('a-great-song.mp3').should('not.exist'); - }); + describe('and the delete button is successfully pressed for the last file in the list', () => { + let calledDelete = false; + beforeEach(() => { + cy.intercept('DELETE', 'api/v1/file/06552cb9-7fe0-7723-8000-82163fc25478', (req) => { + calledDelete = true; + req.reply(204, '', {}); + }).as('delete-song'); + cy.get('.file-name').contains('a-great-song.mp3').siblings('button').click(); + }); - it('shows the "no files" message', () => { - cy.get('.no-files-msg').should('be.visible'); - }); - }); + it('calls the delete endpoint', () => { + cy.wait('@delete-song'); + cy.wrap(calledDelete).should('eq', true); + }); - describe('and the delete call returns an error', () => { - let calledDelete = false; - beforeEach(() => { - cy.intercept('DELETE', 'api/v1/file/06552cb9-7fe0-7723-8000-82163fc21234', (req) => { - calledDelete = true; - req.reply(500, '', {}); - }).as('delete-song'); - cy.get('.file-name').contains('song-2.mp3').siblings('button').click(); - }); + it('removes the file from the list', () => { + cy.get('.file-name').contains('a-great-song.mp3').should('not.exist'); + }); - it('calls the delete endpoint', () => { - cy.wait('@delete-song'); - cy.wrap(calledDelete).should('eq', true); + it('shows the "no files" message', () => { + cy.get('.no-files-msg').should('be.visible'); + }); }); - it('leaves the file in the list', () => { - cy.get('.file-name').contains('song-2.mp3').should('be.visible'); - }); - }); + describe('and the delete call returns an error', () => { + let calledDelete = false; + beforeEach(() => { + cy.intercept('DELETE', 'api/v1/file/06552cb9-7fe0-7723-8000-82163fc21234', (req) => { + calledDelete = true; + req.reply(500, '', {}); + }).as('delete-song'); + cy.get('.file-name').contains('song-2.mp3').siblings('button').click(); + }); - describe('and the user clicks the release delete button', () => { - beforeEach(() => { - cy.intercept('DELETE', 'api/v1/release/06552cb9-0c60-7066-8000-3c3da08a9e9d', { - statusCode: 204, - }).as('delete-release'); - cy.get('.delete-release-overview-button').first().click(); - }); + it('calls the delete endpoint', () => { + cy.wait('@delete-song'); + cy.wrap(calledDelete).should('eq', true); + }); - it('displays a confirmation dialog', () => { - cy.get('.delete-modal').should('be.visible'); + it('leaves the file in the list', () => { + cy.get('.file-name').contains('song-2.mp3').should('be.visible'); + }); }); - // There are multiple modals on the page, one for each release and one for the site. - // We hardcode the index here to select the correct modal. - it('deletes the release', () => { - cy.get('.delete-modal').first().find('.confirm-delete').click(); - cy.wait('@delete-release'); - }); + describe('and the user clicks the release delete button', () => { + beforeEach(() => { + cy.intercept('DELETE', 'api/v1/release/06552cb9-0c60-7066-8000-3c3da08a9e9d', { + statusCode: 204, + }).as('delete-release'); + cy.get('.delete-release-overview-button').first().click(); + }); - it('reloads the site with the release removed', () => { - cy.get('.delete-modal').first().find('.confirm-delete').click(); - cy.wait('@delete-release'); - cy.wait('@load-site'); - }); + it('displays a confirmation dialog', () => { + cy.get('.delete-modal').should('be.visible'); + }); - it('closes the modal on cancel', () => { - cy.get('.delete-modal').first().find('.cancel-delete').click(); - cy.get('.delete-modal').first().should('not.be.visible'); - }); + // There are multiple modals on the page, one for each release and one for the site. + // We hardcode the index here to select the correct modal. + it('deletes the release', () => { + cy.get('.delete-modal').first().find('.confirm-delete').click(); + cy.wait('@delete-release'); + }); - it('closes the modal on close button click', () => { - cy.get('.delete-modal').first().find('.close-modal-button').click(); - cy.get('.delete-modal').first().should('not.be.visible'); - }); + it('reloads the site with the release removed', () => { + cy.get('.delete-modal').first().find('.confirm-delete').click(); + cy.wait('@delete-release'); + cy.wait('@load-site'); + }); + + it('closes the modal on cancel', () => { + cy.get('.delete-modal').first().find('.cancel-delete').click(); + cy.get('.delete-modal').first().should('not.be.visible'); + }); - it('closes the modal on background click', () => { - cy.get('#app').click('topLeft'); - cy.get('.delete-modal').first().should('not.be.visible'); + it('closes the modal on close button click', () => { + cy.get('.delete-modal').first().find('.close-modal-button').click(); + cy.get('.delete-modal').first().should('not.be.visible'); + }); + + it('closes the modal on background click', () => { + cy.get('#app').click('topLeft'); + cy.get('.delete-modal').first().should('not.be.visible'); + }); }); }); }); - describe('editing name', () => { beforeEach(() => { cy.intercept('GET', 'api/v1/site/06547ed8-206f-7d3d-8000-20ab423e0bb9', { diff --git a/rainfall-frontend/src/components/PreviewSiteButton.vue b/rainfall-frontend/src/components/PreviewSiteButton.vue index f9e4009..d7e81be 100644 --- a/rainfall-frontend/src/components/PreviewSiteButton.vue +++ b/rainfall-frontend/src/components/PreviewSiteButton.vue @@ -60,12 +60,12 @@ export default { this.previewLoading = false; this.previewError = 'An error occurred while generating the preview'; } else { - setTimeout(this.pollForPreview, 5000); + setTimeout(this.pollForPreview, import.meta.env.VITE_PREVIEW_POLL_INTERVAL); } + return; } this.showError(resp); } - return ''; }, invalidatePreview() { this.previewError = ''; From 514cf9d6767f7c13bbfb33cf5af033598824889a Mon Sep 17 00:00:00 2001 From: Travis Briggs Date: Mon, 6 Jan 2025 16:45:30 -0800 Subject: [PATCH 9/9] Config for CI --- .env.ci | 2 ++ .github/workflows/ci.yml | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/.env.ci b/.env.ci index 5e5c4cb..a05bd69 100644 --- a/.env.ci +++ b/.env.ci @@ -18,6 +18,8 @@ MINIO_ACCESS_KEY=rainfall-ci-minio-access-key MINIO_SECRET_KEY=rainfall-ci-minio-secret-key MINIO_BUCKET=rainfall-test +REDIS_URL=redis://localhost:6379 + RAINFALL_ENV=test MASTODON_REDIRECT_URL=http://localhost:5000/api/v1/mastodon/login MASTODON_APP_NAME='Rainfall Dev' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3a95484..84874e9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,11 @@ jobs: --health-timeout 5s --health-retries 3 + redis: + image: redis + ports: + - 6379:6379 + steps: - uses: actions/checkout@v4 - name: Set up Python