From dca3f1ce0dff58686a6c288fe7e8a11267406baa Mon Sep 17 00:00:00 2001 From: "EYFL (Eskild Schroll-Fleischer)" Date: Thu, 1 May 2025 14:14:20 +0200 Subject: [PATCH 1/5] Make broadcaster dependencies optional An option is available for each backend as well as an "all" option which gets you everything. --- requirements.txt | 1 - setup.py | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9e6d6b6..7a5a2f8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ fastapi-websocket-rpc>=0.1.25,<1 packaging>=20.4 -permit-broadcaster[redis,postgres,kafka]>=0.2.5,<3 pydantic>=1.9.1 websockets>=10.3 diff --git a/setup.py b/setup.py index 2b8e59a..b996403 100644 --- a/setup.py +++ b/setup.py @@ -30,4 +30,10 @@ def get_requirements(env=""): ], python_requires=">=3.9", install_requires=get_requirements(), + extras_require = { + "redis": ["permit-broadcaster[redis]>=0.2.5,<3"], + "postgres": ["permit-broadcaster[postgres]>=0.2.5,<3"], + "kafka": ["permit-broadcaster[kafka]>=0.2.5,<3"], + "all": ["permit-broadcaster[redis,postgres,kafka]>=0.2.5,<3"], + } ) From 5d4b4dfc6e5d943589c0ea9a59f0324fbf02e1f6 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Tue, 6 May 2025 07:30:05 +0200 Subject: [PATCH 2/5] . --- requirements-dev.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index cc7c7e7..b4d1f17 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -5,4 +5,5 @@ twine wheel loguru uvicorn -pytest-timeout \ No newline at end of file +pytest-timeout +permit-broadcaster[redis,postgres,kafka]>=0.2.5,<3 \ No newline at end of file From f6598102fcd80789fe1ab4c21f908ba935d92b9f Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Tue, 6 May 2025 08:05:30 +0200 Subject: [PATCH 3/5] .. --- README.md | 3 ++- requirements.txt | 1 + tests/broadcaster_test.py | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a723c2c..96439a1 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,8 @@ FastAPI + WebSockets + PubSub == ⚡💪 ❤️ async def websocket_rpc_endpoint(websocket: WebSocket): await endpoint.main_loop(websocket) ``` - see [examples/pubsub_broadcaster_server_example.py](examples/pubsub_broadcaster_server_example.py) for full usage example + see [examples/pubsub_broadcaster_server_example.py](examples/pubsub_broadcaster_server_example.py) for full usage example + Note: Requires install with dependencies e.g. `pip install fastapi_websocket_pubsub[redis]`, `pip install fastapi_websocket_pubsub[postgres]`, `pip install fastapi_websocket_pubsub[kafka]` or `pip install fastapi_websocket_pubsub[all]` to get support for all three backends diff --git a/requirements.txt b/requirements.txt index 7a5a2f8..0b1eeff 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ fastapi-websocket-rpc>=0.1.25,<1 packaging>=20.4 pydantic>=1.9.1 websockets>=10.3 +permit-broadcaster>=0.2.5,<3 \ No newline at end of file diff --git a/tests/broadcaster_test.py b/tests/broadcaster_test.py index 58a2708..5ef606f 100644 --- a/tests/broadcaster_test.py +++ b/tests/broadcaster_test.py @@ -22,6 +22,12 @@ ) from fastapi_websocket_pubsub import PubSubEndpoint, PubSubClient +# Check if postgres backend is available +asyncpg_backend_available = True +try: + import asyncpg +except ModuleNotFoundError: + asyncpg_backend_available = False logger = get_logger("Test") logger.remove() @@ -129,6 +135,7 @@ def server(postgres): @pytest.mark.asyncio +@pytest.mark.skipif(not asyncpg_backend_available, reason="asyncpg dependency is not installed.") async def test_all_clients_get_a_topic_via_broadcast(server, repeats=1, interval=0): """ if: @@ -179,6 +186,7 @@ async def wait_for_sem(): @pytest.mark.postgres_idle_timeout(3000) @pytest.mark.asyncio +@pytest.mark.skipif(not asyncpg_backend_available, reason="asyncpg dependency is not installed.") async def test_idle_pg_broadcaster_disconnect(server): """ if: From 8afcae2c4c2624308f32da14f11ae010c1bb5122 Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Tue, 6 May 2025 13:05:18 +0200 Subject: [PATCH 4/5] Fix supply of additional headers to comply with websockets API --- tests/server_notifier_callback_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/server_notifier_callback_test.py b/tests/server_notifier_callback_test.py index 24f4633..0d48549 100644 --- a/tests/server_notifier_callback_test.py +++ b/tests/server_notifier_callback_test.py @@ -80,7 +80,7 @@ async def server_subscribe_to_topic(server, is_topic_permitted): # Create a client and subscribe to topics async with PubSubClient( - extra_headers={"headers": {"claims": {"permitted_topics": permitted_topics}}} + additional_headers={"headers": {"claims": {"permitted_topics": permitted_topics}}} ) as client: async def on_event(data, topic): @@ -116,7 +116,7 @@ async def test_server_subscribe_to_permitted_topic(server): async def server_publish_to_topic(server, is_topic_permitted): # Create a client and subscribe to topics async with PubSubClient( - extra_headers={"headers": {"claims": {"permitted_topics": ["t1", "t2"]}}} + additional_headers={"headers": {"claims": {"permitted_topics": ["t1", "t2"]}}} ) as client: # start listentining client.start_client(uri) From 7f88e57cf18c6de849b69f04bff7434d07c1e57c Mon Sep 17 00:00:00 2001 From: Eskild Schroll-Fleischer Date: Tue, 6 May 2025 14:52:06 +0200 Subject: [PATCH 5/5] Bump minimum required version of websockets --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 0b1eeff..4686357 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ fastapi-websocket-rpc>=0.1.25,<1 packaging>=20.4 pydantic>=1.9.1 -websockets>=10.3 +websockets>=14.0 permit-broadcaster>=0.2.5,<3 \ No newline at end of file