Skip to content

Commit 474f733

Browse files
authored
Merge pull request #76 from fabienheureux/fix/channels-3-compatibility
2 parents 366d1aa + 0ad2b87 commit 474f733

File tree

9 files changed

+69
-13
lines changed

9 files changed

+69
-13
lines changed

.github/workflows/ci.yml

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main, master]
6+
tags:
7+
- v[0-9]+.[0-9]+.[0-9]+
8+
pull_request:
9+
branches: [main, master]
10+
11+
jobs:
12+
test:
13+
runs-on: ubuntu-latest
14+
strategy:
15+
max-parallel: 5
16+
matrix:
17+
include:
18+
- python-version: 2.7
19+
tox-version: "py27"
20+
- python-version: 3.6
21+
tox-version: "py36"
22+
- python-version: 3.7
23+
tox-version: "py37"
24+
- python-version: 3.8
25+
tox-version: "py38"
26+
- python-version: 3.9
27+
tox-version: "py39"
28+
29+
steps:
30+
- uses: actions/checkout@v2
31+
- name: Set up Python ${{ matrix.python-version }}
32+
uses: actions/setup-python@v2
33+
with:
34+
python-version: ${{ matrix.python-version }}
35+
36+
- name: Install Dependencies
37+
run: |
38+
pip install -U tox
39+
- name: Run Tests
40+
run: tox -e ${{ matrix.tox-version }}

Makefile

+4-1
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,12 @@ clean-test: ## remove test and coverage artifacts
5050
lint: ## check style with flake8
5151
flake8 graphql_ws tests
5252

53+
format:
54+
black ./graphql_ws ./tests
55+
5356
test: ## run tests quickly with the default Python
5457
py.test
55-
58+
5659

5760
test-all: ## run tests on every Python version with tox
5861
tox

graphql_ws/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def remove_operation(self, op_id):
4141

4242
def unsubscribe(self, op_id):
4343
async_iterator = self.remove_operation(op_id)
44-
if hasattr(async_iterator, 'dispose'):
44+
if hasattr(async_iterator, "dispose"):
4545
async_iterator.dispose()
4646
return async_iterator
4747

graphql_ws/django/consumers.py

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88

99
class GraphQLSubscriptionConsumer(AsyncJsonWebsocketConsumer):
10-
1110
async def connect(self):
1211
self.connection_context = None
1312
if WS_PROTOCOL in self.scope["subprotocols"]:

graphql_ws/django/routing.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from channels import __version__ as channels_version
12
from channels.routing import ProtocolTypeRouter, URLRouter
23
from channels.sessions import SessionMiddlewareStack
4+
from django.utils.version import get_version_tuple
35
from django.apps import apps
46
from django.urls import path
57
from .consumers import GraphQLSubscriptionConsumer
@@ -10,7 +12,15 @@
1012
AuthMiddlewareStack = None
1113

1214

13-
websocket_urlpatterns = [path("subscriptions", GraphQLSubscriptionConsumer)]
15+
channels_version_tuple = get_version_tuple(channels_version)
16+
17+
18+
if channels_version_tuple > (3, 0, 0):
19+
websocket_urlpatterns = [
20+
path("subscriptions", GraphQLSubscriptionConsumer.as_asgi())
21+
]
22+
else:
23+
websocket_urlpatterns = [path("subscriptions", GraphQLSubscriptionConsumer)]
1424

1525
application = ProtocolTypeRouter({"websocket": URLRouter(websocket_urlpatterns)})
1626

graphql_ws/django_channels.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import json
22

3-
from channels.generic.websockets import JsonWebsocketConsumer
3+
try:
4+
# Channels version > 1 renamed the websockets module to websocket.
5+
from channels.generic.websockets import JsonWebsocketConsumer
6+
except ImportError:
7+
from channels.generic.websocket import JsonWebsocketConsumer
48
from graphene_django.settings import graphene_settings
59

610
from .base import BaseConnectionContext

setup.cfg

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ maintainer =
4141
PyYAML>=5.3,<6
4242
dev =
4343
flake8>=3.7,<4
44+
black
4445
tox>=3,<4
4546
Sphinx>=1.8,<2
4647
test =
@@ -50,13 +51,12 @@ test =
5051
pytest-asyncio; python_version>="3.4"
5152
graphene>=2.0,<3
5253
gevent
53-
graphene>=2.0
5454
graphene_django
5555
mock; python_version<"3"
5656
django==1.11.*; python_version<"3"
5757
channels==1.*; python_version<"3"
58-
django==2.*; python_version>="3"
59-
channels==2.*; python_version>="3"
58+
django==3.*; python_version>="3"
59+
channels==3.*; python_version>="3"
6060
aiohttp; python_version>="3.5"
6161

6262
[bdist_wheel]

tests/test_base.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def test_observer_data():
9191
send_error=send_error,
9292
send_message=send_message,
9393
)
94-
observer.on_next('data')
94+
observer.on_next("data")
9595
assert send_result.called
9696
assert not send_error.called
9797

@@ -107,6 +107,6 @@ def test_observer_exception():
107107
send_error=send_error,
108108
send_message=send_message,
109109
)
110-
observer.on_next(TypeError('some bad message'))
110+
observer.on_next(TypeError("some bad message"))
111111
assert send_error.called
112112
assert not send_result.called

tests/test_base_async.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,18 @@ async def test_resolver_with_promise(server):
8383
connection_context=None, op_id=1, execution_result=result
8484
)
8585
assert server.send_message.called
86-
assert result.data == {'test': [1, 2]}
86+
assert result.data == {"test": [1, 2]}
8787

8888

8989
async def test_resolver_with_nested_promise(server):
9090
server.send_message = AsyncMock()
9191
result = mock.Mock()
9292
inner = promise.Promise(lambda resolve, reject: resolve(2))
93-
outer = promise.Promise(lambda resolve, reject: resolve({'in': inner}))
93+
outer = promise.Promise(lambda resolve, reject: resolve({"in": inner}))
9494
result.data = {"test": [1, outer]}
9595
result.errors = None
9696
await server.send_execution_result(
9797
connection_context=None, op_id=1, execution_result=result
9898
)
9999
assert server.send_message.called
100-
assert result.data == {'test': [1, {'in': 2}]}
100+
assert result.data == {"test": [1, {"in": 2}]}

0 commit comments

Comments
 (0)