From cfc7c8f3aad8c70eaa65d9659157e47d098fecf7 Mon Sep 17 00:00:00 2001 From: loki Date: Sat, 21 Jun 2025 22:18:04 +1000 Subject: [PATCH 1/7] remove build psypg --- pyproject.toml | 2 +- uv.lock | 64 ++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0815cb5..c8d79de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ dependencies = [ "gevent>=25.5.1", "gunicorn>=23.0.0", "markdown>=3.7", - "psycopg2>=2.9.10", + "psycopg2-binary>=2.9.10", "python-dotenv>=1.0.1", ] diff --git a/uv.lock b/uv.lock index 2a31bce..1266eed 100644 --- a/uv.lock +++ b/uv.lock @@ -369,7 +369,7 @@ dependencies = [ { name = "gevent" }, { name = "gunicorn" }, { name = "markdown" }, - { name = "psycopg2" }, + { name = "psycopg2-binary" }, { name = "python-dotenv" }, ] @@ -392,7 +392,7 @@ requires-dist = [ { name = "gevent", specifier = ">=25.5.1" }, { name = "gunicorn", specifier = ">=23.0.0" }, { name = "markdown", specifier = ">=3.7" }, - { name = "psycopg2", specifier = ">=2.9.10" }, + { name = "psycopg2-binary", specifier = ">=2.9.10" }, { name = "python-dotenv", specifier = ">=1.0.1" }, ] @@ -588,18 +588,58 @@ wheels = [ ] [[package]] -name = "psycopg2" +name = "psycopg2-binary" version = "2.9.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/62/51/2007ea29e605957a17ac6357115d0c1a1b60c8c984951c19419b3474cdfd/psycopg2-2.9.10.tar.gz", hash = "sha256:12ec0b40b0273f95296233e8750441339298e6a572f7039da5b260e3c8b60e11", size = 385672, upload-time = "2024-10-16T11:24:54.832Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/a9/146b6bdc0d33539a359f5e134ee6dda9173fb8121c5b96af33fa299e50c4/psycopg2-2.9.10-cp310-cp310-win32.whl", hash = "sha256:5df2b672140f95adb453af93a7d669d7a7bf0a56bcd26f1502329166f4a61716", size = 1024527, upload-time = "2024-10-16T11:18:24.43Z" }, - { url = "https://files.pythonhosted.org/packages/47/50/c509e56f725fd2572b59b69bd964edaf064deebf1c896b2452f6b46fdfb3/psycopg2-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:c6f7b8561225f9e711a9c47087388a97fdc948211c10a4bccbf0ba68ab7b3b5a", size = 1163735, upload-time = "2024-10-16T11:18:29.586Z" }, - { url = "https://files.pythonhosted.org/packages/20/a2/c51ca3e667c34e7852157b665e3d49418e68182081060231d514dd823225/psycopg2-2.9.10-cp311-cp311-win32.whl", hash = "sha256:47c4f9875125344f4c2b870e41b6aad585901318068acd01de93f3677a6522c2", size = 1024538, upload-time = "2024-10-16T11:18:33.48Z" }, - { url = "https://files.pythonhosted.org/packages/33/39/5a9a229bb5414abeb86e33b8fc8143ab0aecce5a7f698a53e31367d30caa/psycopg2-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:0435034157049f6846e95103bd8f5a668788dd913a7c30162ca9503fdf542cb4", size = 1163736, upload-time = "2024-10-16T11:18:36.616Z" }, - { url = "https://files.pythonhosted.org/packages/3d/16/4623fad6076448df21c1a870c93a9774ad8a7b4dd1660223b59082dd8fec/psycopg2-2.9.10-cp312-cp312-win32.whl", hash = "sha256:65a63d7ab0e067e2cdb3cf266de39663203d38d6a8ed97f5ca0cb315c73fe067", size = 1025113, upload-time = "2024-10-16T11:18:40.148Z" }, - { url = "https://files.pythonhosted.org/packages/66/de/baed128ae0fc07460d9399d82e631ea31a1f171c0c4ae18f9808ac6759e3/psycopg2-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:4a579d6243da40a7b3182e0430493dbd55950c493d8c68f4eec0b302f6bbf20e", size = 1163951, upload-time = "2024-10-16T11:18:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/ae/49/a6cfc94a9c483b1fa401fbcb23aca7892f60c7269c5ffa2ac408364f80dc/psycopg2-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:91fd603a2155da8d0cfcdbf8ab24a2d54bca72795b90d2a3ed2b6da8d979dee2", size = 2569060, upload-time = "2025-01-04T20:09:15.28Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/bdc8274dc0585090b4e3432267d7be4dfbfd8971c0fa59167c711105a6bf/psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", size = 385764, upload-time = "2024-10-16T11:24:58.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/81/331257dbf2801cdb82105306042f7a1637cc752f65f2bb688188e0de5f0b/psycopg2_binary-2.9.10-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f", size = 3043397, upload-time = "2024-10-16T11:18:58.647Z" }, + { url = "https://files.pythonhosted.org/packages/e7/9a/7f4f2f031010bbfe6a02b4a15c01e12eb6b9b7b358ab33229f28baadbfc1/psycopg2_binary-2.9.10-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906", size = 3274806, upload-time = "2024-10-16T11:19:03.935Z" }, + { url = "https://files.pythonhosted.org/packages/e5/57/8ddd4b374fa811a0b0a0f49b6abad1cde9cb34df73ea3348cc283fcd70b4/psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92", size = 2851361, upload-time = "2024-10-16T11:19:07.277Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/d1e52c20d283f1f3a8e7e5c1e06851d432f123ef57b13043b4f9b21ffa1f/psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007", size = 3080836, upload-time = "2024-10-16T11:19:11.033Z" }, + { url = "https://files.pythonhosted.org/packages/a0/cb/592d44a9546aba78f8a1249021fe7c59d3afb8a0ba51434d6610cc3462b6/psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0", size = 3264552, upload-time = "2024-10-16T11:19:14.606Z" }, + { url = "https://files.pythonhosted.org/packages/64/33/c8548560b94b7617f203d7236d6cdf36fe1a5a3645600ada6efd79da946f/psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4", size = 3019789, upload-time = "2024-10-16T11:19:18.889Z" }, + { url = "https://files.pythonhosted.org/packages/b0/0e/c2da0db5bea88a3be52307f88b75eec72c4de62814cbe9ee600c29c06334/psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1", size = 2871776, upload-time = "2024-10-16T11:19:23.023Z" }, + { url = "https://files.pythonhosted.org/packages/15/d7/774afa1eadb787ddf41aab52d4c62785563e29949613c958955031408ae6/psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5", size = 2820959, upload-time = "2024-10-16T11:19:26.906Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ed/440dc3f5991a8c6172a1cde44850ead0e483a375277a1aef7cfcec00af07/psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5", size = 2919329, upload-time = "2024-10-16T11:19:30.027Z" }, + { url = "https://files.pythonhosted.org/packages/03/be/2cc8f4282898306732d2ae7b7378ae14e8df3c1231b53579efa056aae887/psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53", size = 2957659, upload-time = "2024-10-16T11:19:32.864Z" }, + { url = "https://files.pythonhosted.org/packages/d0/12/fb8e4f485d98c570e00dad5800e9a2349cfe0f71a767c856857160d343a5/psycopg2_binary-2.9.10-cp310-cp310-win32.whl", hash = "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b", size = 1024605, upload-time = "2024-10-16T11:19:35.462Z" }, + { url = "https://files.pythonhosted.org/packages/22/4f/217cd2471ecf45d82905dd09085e049af8de6cfdc008b6663c3226dc1c98/psycopg2_binary-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1", size = 1163817, upload-time = "2024-10-16T11:19:37.384Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8f/9feb01291d0d7a0a4c6a6bab24094135c2b59c6a81943752f632c75896d6/psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff", size = 3043397, upload-time = "2024-10-16T11:19:40.033Z" }, + { url = "https://files.pythonhosted.org/packages/15/30/346e4683532011561cd9c8dfeac6a8153dd96452fee0b12666058ab7893c/psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c", size = 3274806, upload-time = "2024-10-16T11:19:43.5Z" }, + { url = "https://files.pythonhosted.org/packages/66/6e/4efebe76f76aee7ec99166b6c023ff8abdc4e183f7b70913d7c047701b79/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c", size = 2851370, upload-time = "2024-10-16T11:19:46.986Z" }, + { url = "https://files.pythonhosted.org/packages/7f/fd/ff83313f86b50f7ca089b161b8e0a22bb3c319974096093cd50680433fdb/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb", size = 3080780, upload-time = "2024-10-16T11:19:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c4/bfadd202dcda8333a7ccafdc51c541dbdfce7c2c7cda89fa2374455d795f/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341", size = 3264583, upload-time = "2024-10-16T11:19:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f1/09f45ac25e704ac954862581f9f9ae21303cc5ded3d0b775532b407f0e90/psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a", size = 3019831, upload-time = "2024-10-16T11:19:57.762Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2e/9beaea078095cc558f215e38f647c7114987d9febfc25cb2beed7c3582a5/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b", size = 2871822, upload-time = "2024-10-16T11:20:04.693Z" }, + { url = "https://files.pythonhosted.org/packages/01/9e/ef93c5d93f3dc9fc92786ffab39e323b9aed066ba59fdc34cf85e2722271/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7", size = 2820975, upload-time = "2024-10-16T11:20:11.401Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f0/049e9631e3268fe4c5a387f6fc27e267ebe199acf1bc1bc9cbde4bd6916c/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e", size = 2919320, upload-time = "2024-10-16T11:20:17.959Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9a/bcb8773b88e45fb5a5ea8339e2104d82c863a3b8558fbb2aadfe66df86b3/psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68", size = 2957617, upload-time = "2024-10-16T11:20:24.711Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6b/144336a9bf08a67d217b3af3246abb1d027095dab726f0687f01f43e8c03/psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392", size = 1024618, upload-time = "2024-10-16T11:20:27.718Z" }, + { url = "https://files.pythonhosted.org/packages/61/69/3b3d7bd583c6d3cbe5100802efa5beacaacc86e37b653fc708bf3d6853b8/psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4", size = 1163816, upload-time = "2024-10-16T11:20:30.777Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/465cc9795cf76f6d329efdafca74693714556ea3891813701ac1fee87545/psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0", size = 3044771, upload-time = "2024-10-16T11:20:35.234Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/6d225b7b641a1a2148e3ed65e1aa74fc86ba3fee850545e27be9e1de893d/psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a", size = 3275336, upload-time = "2024-10-16T11:20:38.742Z" }, + { url = "https://files.pythonhosted.org/packages/30/b7/a68c2b4bff1cbb1728e3ec864b2d92327c77ad52edcd27922535a8366f68/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539", size = 2851637, upload-time = "2024-10-16T11:20:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b1/cfedc0e0e6f9ad61f8657fd173b2f831ce261c02a08c0b09c652b127d813/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526", size = 3082097, upload-time = "2024-10-16T11:20:46.185Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/0a8e4153c9b769f59c02fb5e7914f20f0b2483a19dae7bf2db54b743d0d0/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1", size = 3264776, upload-time = "2024-10-16T11:20:50.879Z" }, + { url = "https://files.pythonhosted.org/packages/10/db/d09da68c6a0cdab41566b74e0a6068a425f077169bed0946559b7348ebe9/psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e", size = 3020968, upload-time = "2024-10-16T11:20:56.819Z" }, + { url = "https://files.pythonhosted.org/packages/94/28/4d6f8c255f0dfffb410db2b3f9ac5218d959a66c715c34cac31081e19b95/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f", size = 2872334, upload-time = "2024-10-16T11:21:02.411Z" }, + { url = "https://files.pythonhosted.org/packages/05/f7/20d7bf796593c4fea95e12119d6cc384ff1f6141a24fbb7df5a668d29d29/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00", size = 2822722, upload-time = "2024-10-16T11:21:09.01Z" }, + { url = "https://files.pythonhosted.org/packages/4d/e4/0c407ae919ef626dbdb32835a03b6737013c3cc7240169843965cada2bdf/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5", size = 2920132, upload-time = "2024-10-16T11:21:16.339Z" }, + { url = "https://files.pythonhosted.org/packages/2d/70/aa69c9f69cf09a01da224909ff6ce8b68faeef476f00f7ec377e8f03be70/psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47", size = 2959312, upload-time = "2024-10-16T11:21:25.584Z" }, + { url = "https://files.pythonhosted.org/packages/d3/bd/213e59854fafe87ba47814bf413ace0dcee33a89c8c8c814faca6bc7cf3c/psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64", size = 1025191, upload-time = "2024-10-16T11:21:29.912Z" }, + { url = "https://files.pythonhosted.org/packages/92/29/06261ea000e2dc1e22907dbbc483a1093665509ea586b29b8986a0e56733/psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0", size = 1164031, upload-time = "2024-10-16T11:21:34.211Z" }, + { url = "https://files.pythonhosted.org/packages/3e/30/d41d3ba765609c0763505d565c4d12d8f3c79793f0d0f044ff5a28bf395b/psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", size = 3044699, upload-time = "2024-10-16T11:21:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/35/44/257ddadec7ef04536ba71af6bc6a75ec05c5343004a7ec93006bee66c0bc/psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", size = 3275245, upload-time = "2024-10-16T11:21:51.989Z" }, + { url = "https://files.pythonhosted.org/packages/1b/11/48ea1cd11de67f9efd7262085588790a95d9dfcd9b8a687d46caf7305c1a/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", size = 2851631, upload-time = "2024-10-16T11:21:57.584Z" }, + { url = "https://files.pythonhosted.org/packages/62/e0/62ce5ee650e6c86719d621a761fe4bc846ab9eff8c1f12b1ed5741bf1c9b/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", size = 3082140, upload-time = "2024-10-16T11:22:02.005Z" }, + { url = "https://files.pythonhosted.org/packages/27/ce/63f946c098611f7be234c0dd7cb1ad68b0b5744d34f68062bb3c5aa510c8/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", size = 3264762, upload-time = "2024-10-16T11:22:06.412Z" }, + { url = "https://files.pythonhosted.org/packages/43/25/c603cd81402e69edf7daa59b1602bd41eb9859e2824b8c0855d748366ac9/psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", size = 3020967, upload-time = "2024-10-16T11:22:11.583Z" }, + { url = "https://files.pythonhosted.org/packages/5f/d6/8708d8c6fca531057fa170cdde8df870e8b6a9b136e82b361c65e42b841e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", size = 2872326, upload-time = "2024-10-16T11:22:16.406Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ac/5b1ea50fc08a9df82de7e1771537557f07c2632231bbab652c7e22597908/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", size = 2822712, upload-time = "2024-10-16T11:22:21.366Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fc/504d4503b2abc4570fac3ca56eb8fed5e437bf9c9ef13f36b6621db8ef00/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", size = 2920155, upload-time = "2024-10-16T11:22:25.684Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d1/323581e9273ad2c0dbd1902f3fb50c441da86e894b6e25a73c3fda32c57e/psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", size = 2959356, upload-time = "2024-10-16T11:22:30.562Z" }, + { url = "https://files.pythonhosted.org/packages/08/50/d13ea0a054189ae1bc21af1d85b6f8bb9bbc5572991055d70ad9006fe2d6/psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142", size = 2569224, upload-time = "2025-01-04T20:09:19.234Z" }, ] [[package]] From 8f0f74f2336b4359c354dd36d33801fad771031e Mon Sep 17 00:00:00 2001 From: loki Date: Sat, 21 Jun 2025 22:18:11 +1000 Subject: [PATCH 2/7] redocker --- Dockerfile | 42 ++++++++++++------------------------------ Makefile | 6 +++++- entrypoint.sh | 8 ++++---- 3 files changed, 21 insertions(+), 35 deletions(-) diff --git a/Dockerfile b/Dockerfile index f1a67fb..1b24f38 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,63 +7,45 @@ ENV SQLALCHEMY_DATABASE_URI="sqlite:////app/tmp/dev.db" WORKDIR /app -RUN apk update && apk add make -RUN python -m venv /app/venv - +RUN apk update && apk add --no-cache nodejs npm make uv COPY . . -RUN /app/venv/bin/python3 -m pip install -r requirements.txt -RUN /app/venv/bin/python3 -m pip install -r dev.txt - - -RUN source /app/venv/bin/activate && make check +RUN uv sync && make check && make test -FROM python:3.10-alpine AS build-image +FROM python:3.10-alpine ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 ENV FLASK_APP="blog" ENV SQLALCHEMY_DATABASE_URI="sqlite:////app/tmp/dev.db" -WORKDIR /app - - -RUN python -m venv /app/venv - -COPY requirements.txt . -RUN /app/venv/bin/python3 -m pip install -r requirements.txt - - - -FROM python:3.10-alpine -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 - +RUN apk update && apk add --no-cache uv WORKDIR /app -ARG UID=10001 +ARG UID=10000 RUN adduser \ --disabled-password \ --gecos "" \ - --home "/nonexistent" \ + --home "/app" \ --shell "/sbin/nologin" \ - --no-create-home \ --uid "${UID}" \ appuser +# --no-create-home \ +# appuser -USER appuser -COPY --from=build-image /app/venv /app/venv # Copy the source code into the container. COPY . . - +RUN uv sync --no-dev -n # Expose the port that the application listens on. EXPOSE 5000 ENV PATH=/app/venv/bin:$PATH +#USER appuser + # Run the application. ENTRYPOINT [ "./entrypoint.sh" ] -CMD [ "gunicorn -c gunicorn.py 'app:create_app()'" ] +#CMD [ "uv", "run gunicorn -c gunicorn.py "] diff --git a/Makefile b/Makefile index b3691c2..f34a587 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION = 0.0.6 +VERSION = 0.0.7 all: check @@ -16,6 +16,10 @@ lint-types: uv run pyright . +test: + FLASK_ENV=testing FLASK_APP=blog uv run pytest + + test-coverage: ( \ . venv/bin/activate;\ diff --git a/entrypoint.sh b/entrypoint.sh index b0fe2fa..c6d1957 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,10 +1,10 @@ #!/bin/sh echo "wait until database started" -while ! nc -z $DB_HOST $DB_PORT; do sleep 1; done +#while ! nc -z $DB_HOST $DB_PORT; do sleep 1; done -source /app/venv/bin/activate +#source /app/venv/bin/activate echo "run migrates" -FLASK_APP=blog /app/venv/bin/flask db upgrade +FLASK_APP=blog uv run flask db upgrade -exec "$@" +exec uv run gunicorn -c gunicorn.py # "$@" From c6fa2866804d8063edfabf5f023f03cd2c730f16 Mon Sep 17 00:00:00 2001 From: loki Date: Sat, 21 Jun 2025 23:06:26 +1000 Subject: [PATCH 3/7] make f --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index f34a587..7beecc4 100644 --- a/Makefile +++ b/Makefile @@ -29,8 +29,8 @@ test-coverage: check: lint test run: - flask db upgrade - flask run --host="0.0.0.0" --debug + uv run flask db upgrade + uv run flask run --host="0.0.0.0" --debug docker-build: docker build . --tag="gunlinux:$(VERSION)" From ec9509c0758ab095b56f924fa8338a90824741a2 Mon Sep 17 00:00:00 2001 From: loki Date: Sat, 21 Jun 2025 23:18:24 +1000 Subject: [PATCH 4/7] lock wtfforms --- pyproject.toml | 1 + uv.lock | 11 +++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index c8d79de..2dd7b55 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,6 +19,7 @@ dependencies = [ "markdown>=3.7", "psycopg2-binary>=2.9.10", "python-dotenv>=1.0.1", + "wtforms==2.2.1", ] [project.scripts] diff --git a/uv.lock b/uv.lock index 1266eed..ce34754 100644 --- a/uv.lock +++ b/uv.lock @@ -371,6 +371,7 @@ dependencies = [ { name = "markdown" }, { name = "psycopg2-binary" }, { name = "python-dotenv" }, + { name = "wtforms" }, ] [package.dev-dependencies] @@ -394,6 +395,7 @@ requires-dist = [ { name = "markdown", specifier = ">=3.7" }, { name = "psycopg2-binary", specifier = ">=2.9.10" }, { name = "python-dotenv", specifier = ">=1.0.1" }, + { name = "wtforms", specifier = "==2.2.1" }, ] [package.metadata.requires-dev] @@ -819,14 +821,11 @@ wheels = [ [[package]] name = "wtforms" -version = "3.2.1" +version = "2.2.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/01/e4/633d080897e769ed5712dcfad626e55dbd6cf45db0ff4d9884315c6a82da/wtforms-3.2.1.tar.gz", hash = "sha256:df3e6b70f3192e92623128123ec8dca3067df9cfadd43d59681e210cfb8d4682", size = 137801, upload-time = "2024-10-21T11:34:00.108Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/1d/7221354ebfc32b868740d02e44225c2ce00769b0d3dc370e463e2bc4b446/WTForms-2.2.1.tar.gz", hash = "sha256:0cdbac3e7f6878086c334aa25dc5a33869a3954e9d1e015130d65a69309b3b61", size = 156904, upload-time = "2018-06-07T22:16:35.601Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/c9/2088fb5645cd289c99ebe0d4cdcc723922a1d8e1beaefb0f6f76dff9b21c/wtforms-3.2.1-py3-none-any.whl", hash = "sha256:583bad77ba1dd7286463f21e11aa3043ca4869d03575921d1a1698d0715e0fd4", size = 152454, upload-time = "2024-10-21T11:33:58.44Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c8/dac5dce9908df1d9d48ec0e26e2a250839fa36ea2c602cc4f85ccfeb5c65/WTForms-2.2.1-py2.py3-none-any.whl", hash = "sha256:e3ee092c827582c50877cdbd49e9ce6d2c5c1f6561f849b3b068c1b8029626f1", size = 166353, upload-time = "2018-06-07T22:16:33.906Z" }, ] [[package]] From 7f950d9e08f7d5e59322639643766c21f73b5bef Mon Sep 17 00:00:00 2001 From: loki Date: Sat, 21 Jun 2025 23:42:55 +1000 Subject: [PATCH 5/7] ability to change page template via admin --- blog/category/models.py | 5 +++-- blog/post/views.py | 6 +++++- migrations/versions/49df8e610d33_.py | 31 ++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 migrations/versions/49df8e610d33_.py diff --git a/blog/category/models.py b/blog/category/models.py index c1a00dc..809a48f 100644 --- a/blog/category/models.py +++ b/blog/category/models.py @@ -1,6 +1,6 @@ """SqlAlchemy models.""" -from typing import TYPE_CHECKING, List +from typing import TYPE_CHECKING from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -17,7 +17,8 @@ class Category(db.Model): id: Mapped[int] = mapped_column(primary_key=True) title: Mapped[str] = mapped_column(default="") alias: Mapped[str] = mapped_column(unique=True) - posts: Mapped[List["Post"]] = relationship() + posts: Mapped[list["Post"]] = relationship() + template: Mapped[str] = mapped_column(default='post.html', nullable=False) def __str__(self): return f"Category(id={self.id}, title={self.title})" diff --git a/blog/post/views.py b/blog/post/views.py index aba6d35..730027b 100644 --- a/blog/post/views.py +++ b/blog/post/views.py @@ -15,6 +15,7 @@ from blog import cache, db from blog.post.models import Post +from blog.category.models import Category post = Blueprint("postb", __name__) @@ -52,7 +53,10 @@ def view(alias=None, **kwargs): Post.alias == alias, ) post = db.first_or_404(post_query) - return render_template("post.html", post=post, **kwargs) + page_category_obj = db.first_or_404( + sa.select(Category).where(Category.id == Post.category_id) + ) + return render_template(page_category_obj.template, post=post, **kwargs) @post.route("/md/", methods=["POST", "GET"]) diff --git a/migrations/versions/49df8e610d33_.py b/migrations/versions/49df8e610d33_.py new file mode 100644 index 0000000..e56efeb --- /dev/null +++ b/migrations/versions/49df8e610d33_.py @@ -0,0 +1,31 @@ +"""empty message +Revision ID: 49df8e610d33 +Revises: 81d804b1c18c +Create Date: 2025-06-21 23:24:05.447521 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '49df8e610d33' +down_revision = '81d804b1c18c' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('categories', schema=None) as batch_op: + batch_op.add_column(sa.Column('template', sa.String(), server_default='post.html', nullable=True)) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('categories', schema=None) as batch_op: + batch_op.drop_column('template') + + # ### end Alembic commands ### From fd0014ba3a657b8ba62cf50ff0a73db3a086fc32 Mon Sep 17 00:00:00 2001 From: loki Date: Sun, 22 Jun 2025 23:23:09 +1000 Subject: [PATCH 6/7] bump wtforms --- pyproject.toml | 2 +- uv.lock | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2dd7b55..6f911fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ dependencies = [ "markdown>=3.7", "psycopg2-binary>=2.9.10", "python-dotenv>=1.0.1", - "wtforms==2.2.1", + "wtforms==2.3.3", ] [project.scripts] diff --git a/uv.lock b/uv.lock index ce34754..fe707e8 100644 --- a/uv.lock +++ b/uv.lock @@ -395,7 +395,7 @@ requires-dist = [ { name = "markdown", specifier = ">=3.7" }, { name = "psycopg2-binary", specifier = ">=2.9.10" }, { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "wtforms", specifier = "==2.2.1" }, + { name = "wtforms", specifier = "==2.3.3" }, ] [package.metadata.requires-dev] @@ -821,11 +821,14 @@ wheels = [ [[package]] name = "wtforms" -version = "2.2.1" +version = "2.3.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/1d/7221354ebfc32b868740d02e44225c2ce00769b0d3dc370e463e2bc4b446/WTForms-2.2.1.tar.gz", hash = "sha256:0cdbac3e7f6878086c334aa25dc5a33869a3954e9d1e015130d65a69309b3b61", size = 156904, upload-time = "2018-06-07T22:16:35.601Z" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/3f/f25d26b1c66896e2876124a12cd8be8f606abf4e1890a20f3ca04e4a1555/WTForms-2.3.3.tar.gz", hash = "sha256:81195de0ac94fbc8368abbaf9197b88c4f3ffd6c2719b5bf5fc9da744f3d829c", size = 162945, upload-time = "2020-07-30T17:08:26.883Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/c8/dac5dce9908df1d9d48ec0e26e2a250839fa36ea2c602cc4f85ccfeb5c65/WTForms-2.2.1-py2.py3-none-any.whl", hash = "sha256:e3ee092c827582c50877cdbd49e9ce6d2c5c1f6561f849b3b068c1b8029626f1", size = 166353, upload-time = "2018-06-07T22:16:33.906Z" }, + { url = "https://files.pythonhosted.org/packages/e0/31/614fc7dc7d76005b0acb8c0c8920d962b83d7422b4ba912886dfb63f86ff/WTForms-2.3.3-py2.py3-none-any.whl", hash = "sha256:7b504fc724d0d1d4d5d5c114e778ec88c37ea53144683e084215eed5155ada4c", size = 169106, upload-time = "2020-07-30T17:08:25.026Z" }, ] [[package]] From 88badac43cb6732ef6dc5ced0373e14c572a496c Mon Sep 17 00:00:00 2001 From: loki Date: Sun, 22 Jun 2025 23:24:02 +1000 Subject: [PATCH 7/7] recategories --- blog/category/models.py | 4 +-- blog/config.py | 8 +++-- blog/post/views.py | 17 +++++----- blog/static/src/components/refs.css | 34 ++++++++++++++++++++ blog/static/src/styles.css | 1 + blog/templates/layout.html | 1 + blog/templates/post.html | 7 +++-- blog/templates/refs.html | 47 ++++++++++++++++++++++++++++ migrations/versions/49df8e610d33_.py | 17 ++++++---- 9 files changed, 117 insertions(+), 19 deletions(-) create mode 100644 blog/static/src/components/refs.css create mode 100644 blog/templates/refs.html diff --git a/blog/category/models.py b/blog/category/models.py index 809a48f..5c08ef9 100644 --- a/blog/category/models.py +++ b/blog/category/models.py @@ -18,7 +18,7 @@ class Category(db.Model): title: Mapped[str] = mapped_column(default="") alias: Mapped[str] = mapped_column(unique=True) posts: Mapped[list["Post"]] = relationship() - template: Mapped[str] = mapped_column(default='post.html', nullable=False) + template: Mapped[str] = mapped_column(nullable=True) def __str__(self): - return f"Category(id={self.id}, title={self.title})" + return f"Category(id={self.id}, title={self.title}, template={self.template})" diff --git a/blog/config.py b/blog/config.py index 27e7e58..1998a76 100644 --- a/blog/config.py +++ b/blog/config.py @@ -11,7 +11,9 @@ class Config(object): SECRET_KEY = environ.get("SECRET_KEY") or "hard to guess string" SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_ECHO = False - PAGE_CATEGORY = int(environ.get("PAGE_CATEGORY", 0)) + PAGE_CATEGORY: list[int] = [ + int(c) for c in environ.get("PAGE_CATEGORY", "0").split(",") + ] class DevelopmentConfig(Config): @@ -23,7 +25,9 @@ class DevelopmentConfig(Config): class TestingConfig(Config): TESTING = True SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:" - PAGE_CATEGORY = 1 + PAGE_CATEGORY: list[int] = [ + 1, + ] class ProductionConfig(Config): diff --git a/blog/post/views.py b/blog/post/views.py index 730027b..a18ee46 100644 --- a/blog/post/views.py +++ b/blog/post/views.py @@ -24,7 +24,7 @@ def pages_gen(f): @wraps(f) def decorated_function(*args, **kwargs): page_category = current_app.config["PAGE_CATEGORY"] - pages_query = sa.select(Post).where(Post.category_id == page_category) + pages_query = sa.select(Post).where(Post.category_id.in_(page_category)) pages = db.session.scalars(pages_query).all() return f(pages=pages, *args, **kwargs) @@ -47,16 +47,19 @@ def index(**kwargs): @cache.cached(timeout=50) @pages_gen def view(alias=None, **kwargs): - page_category = current_app.config["PAGE_CATEGORY"] + page_categories = current_app.config["PAGE_CATEGORY"] # (1,3,) post_query = sa.select(Post).where( - or_(Post.publishedon.isnot(None), Post.category_id == page_category), + or_(Post.publishedon.isnot(None), Post.category_id.in_(page_categories)), Post.alias == alias, ) post = db.first_or_404(post_query) - page_category_obj = db.first_or_404( - sa.select(Category).where(Category.id == Post.category_id) - ) - return render_template(page_category_obj.template, post=post, **kwargs) + + page_category_obj = db.session.scalars( + sa.select(Category).where(Category.id == post.category_id) + ).first() + if page_category_obj: + return render_template(page_category_obj.template, post=post, **kwargs) + return render_template("post.html", post=post, **kwargs) @post.route("/md/", methods=["POST", "GET"]) diff --git a/blog/static/src/components/refs.css b/blog/static/src/components/refs.css new file mode 100644 index 0000000..f62c8f5 --- /dev/null +++ b/blog/static/src/components/refs.css @@ -0,0 +1,34 @@ +.refs { + padding: 0.5rem 0; +} + +.refs__links { + +} + +.refs__links_desc { + +} + +.refs__link_itemlink { + transition: all 0.2s ease-in-out; + color: #333; + text-align: center; + text-decoration: none; + border-bottom: 1px solid #ccc; + font-size: 1.3em; +} + +.refs__link_itemlink:hover { + border-color: #000; + color: #000; +} + + + +} + +.refs__link_itemlink { + +} + diff --git a/blog/static/src/styles.css b/blog/static/src/styles.css index 227ac45..1baa91c 100644 --- a/blog/static/src/styles.css +++ b/blog/static/src/styles.css @@ -13,3 +13,4 @@ @import 'components/nav.css'; @import 'components/works.css'; @import 'components/work.css'; +@import 'components/refs.css'; diff --git a/blog/templates/layout.html b/blog/templates/layout.html index b1bb02c..2d2309d 100644 --- a/blog/templates/layout.html +++ b/blog/templates/layout.html @@ -20,6 +20,7 @@ + {% block styles %} {% endblock %} diff --git a/blog/templates/post.html b/blog/templates/post.html index 0ef8611..98a6399 100644 --- a/blog/templates/post.html +++ b/blog/templates/post.html @@ -9,7 +9,9 @@

{{post.pagetitle}}

{% if post.category_id != config['PAGE_CATEGORY'] %} {% endif %} @@ -30,4 +32,5 @@

{{post.pagetitle}}

{% block scripts %} {% endblock %} + hljs.initHighlightingOnLoad(); +{% endblock %} diff --git a/blog/templates/refs.html b/blog/templates/refs.html new file mode 100644 index 0000000..2934ddd --- /dev/null +++ b/blog/templates/refs.html @@ -0,0 +1,47 @@ +{% extends "layout.html" %} + +{% block styles %} + +{% endblock %} + +{% block content %} +
+ +
+{% endblock %} + +{% block scripts %} +{% endblock %} diff --git a/migrations/versions/49df8e610d33_.py b/migrations/versions/49df8e610d33_.py index e56efeb..671f150 100644 --- a/migrations/versions/49df8e610d33_.py +++ b/migrations/versions/49df8e610d33_.py @@ -4,28 +4,33 @@ Create Date: 2025-06-21 23:24:05.447521 """ + from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = '49df8e610d33' -down_revision = '81d804b1c18c' +revision = "49df8e610d33" +down_revision = "81d804b1c18c" branch_labels = None depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('categories', schema=None) as batch_op: - batch_op.add_column(sa.Column('template', sa.String(), server_default='post.html', nullable=True)) + with op.batch_alter_table("categories", schema=None) as batch_op: + batch_op.add_column( + sa.Column( + "template", sa.String(), server_default="post.html", nullable=True + ) + ) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('categories', schema=None) as batch_op: - batch_op.drop_column('template') + with op.batch_alter_table("categories", schema=None) as batch_op: + batch_op.drop_column("template") # ### end Alembic commands ###