Skip to content

Commit ea2846f

Browse files
authored
Merge pull request #176 from rsocket/python312
added python 3.12 to workflow
2 parents 3bc542b + 3ef025f commit ea2846f

File tree

13 files changed

+73
-43
lines changed

13 files changed

+73
-43
lines changed

.github/workflows/python-package.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ jobs:
1616
strategy:
1717
fail-fast: false
1818
matrix:
19-
python-version: ["3.8", "3.9", "3.10", "3.11.4"]
20-
19+
python-version: ["3.8", "3.9", "3.10", "3.11", "3.11.4", "3.12"]
2120
steps:
2221
- uses: actions/checkout@v2
2322
- name: Set up Python ${{ matrix.python-version }}

requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Rx==3.2.0
2-
aiohttp==3.8.6
2+
aiohttp==3.8.6; python_version < '3.11.5'
33
aioquic==0.9.21
44
asyncclick==8.1.3.4
55
asyncstdlib==3.10.9
@@ -17,7 +17,7 @@ pytest==7.4.2
1717
quart==0.19.3
1818
reactivex==4.0.4
1919
starlette==0.31.1
20-
cbitstruct==1.0.9
20+
cbitstruct==1.0.9; python_version < '3.11.5'
2121
cloudevents==1.10.0
2222
pydantic==1.10.13
2323
Werkzeug==3.0.0

rsocket/cli/command.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
from importlib.metadata import version as get_version
88
from typing import Optional, Type, Collection, List, Callable
99

10-
import aiohttp
1110
import asyncclick as click
12-
from werkzeug.routing import Map
1311

1412
from rsocket.awaitable.awaitable_rsocket import AwaitableRSocket
1513
from rsocket.extensions.helpers import route, composite, authenticate_simple, authenticate_bearer
@@ -20,7 +18,7 @@
2018
from rsocket.payload import Payload
2119
from rsocket.rsocket_client import RSocketClient
2220
from rsocket.transports.abstract_messaging import AbstractMessagingTransport
23-
from rsocket.transports.aiohttp_websocket import TransportAioHttpClient
21+
2422
from rsocket.transports.tcp import TransportTCP
2523

2624

@@ -68,12 +66,13 @@ def parse_uri(uri: str) -> RSocketUri:
6866
@asynccontextmanager
6967
async def transport_from_uri(uri: RSocketUri,
7068
verify_ssl=True,
71-
headers: Optional[Map] = None,
69+
headers: Optional = None,
7270
trust_cert: Optional[str] = None) -> Type[AbstractMessagingTransport]:
7371
if uri.schema == 'tcp':
7472
connection = await asyncio.open_connection(uri.host, uri.port)
7573
yield TransportTCP(*connection)
7674
elif uri.schema in ['wss', 'ws']:
75+
import aiohttp
7776
async with aiohttp.ClientSession() as session:
7877
if trust_cert is not None:
7978
ssl_context = ssl.create_default_context(cafile=trust_cert)
@@ -84,6 +83,8 @@ async def transport_from_uri(uri: RSocketUri,
8483
verify_ssl=verify_ssl,
8584
ssl_context=ssl_context,
8685
headers=headers) as websocket:
86+
from rsocket.transports.aiohttp_websocket import TransportAioHttpClient
87+
8788
yield TransportAioHttpClient(websocket=websocket)
8889
else:
8990
raise Exception('Unsupported schema in CLI')

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ classifiers =
1919
Programming Language :: Python :: 3.9
2020
Programming Language :: Python :: 3.10
2121
Programming Language :: Python :: 3.11
22+
Programming Language :: Python :: 3.12
2223
Environment :: Web Environment
2324
License :: OSI Approved :: MIT License
2425
Natural Language :: English

tests/conftest.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import functools
22
import logging
33
import re
4-
4+
import sys
55
import pytest
66

77
from rsocket.frame_parser import FrameParser
@@ -40,14 +40,18 @@ def setup_logging(level=logging.DEBUG, use_file: bool = False):
4040
setup_logging(logging.WARN)
4141

4242
tested_transports = [
43-
'tcp',
44-
'aiohttp',
45-
'quart',
46-
'quic',
47-
'http3',
48-
# 'websockets'
43+
'tcp'
4944
]
5045

46+
if sys.version_info[:3] < (3, 11, 5):
47+
tested_transports += [
48+
'aiohttp',
49+
'quart',
50+
'quic',
51+
'http3',
52+
# 'websockets'
53+
]
54+
5155

5256
def pytest_configure(config):
5357
config.addinivalue_line("markers", "allow_error_log: marks tests which are allowed to have errors in the log")
@@ -85,6 +89,16 @@ async def lazy_pipe(request, aiohttp_raw_server, unused_tcp_port, generate_test_
8589
yield functools.partial(pipe_factory, unused_tcp_port)
8690

8791

92+
@pytest.fixture(params=tested_transports)
93+
async def lazy_pipe_with_id(request, aiohttp_raw_server, unused_tcp_port, generate_test_certificates): # noqa: F811
94+
transport_id = request.param
95+
96+
logging.info('Testing transport %s on port %s (lazy)', transport_id, unused_tcp_port)
97+
98+
pipe_factory = get_pipe_factory_by_id(aiohttp_raw_server, transport_id, generate_test_certificates)
99+
yield transport_id, functools.partial(pipe_factory, unused_tcp_port)
100+
101+
88102
@pytest.fixture(params=tested_transports)
89103
async def pipe(request, aiohttp_raw_server, unused_tcp_port, generate_test_certificates): # noqa: F811
90104
transport_id = request.param

tests/rsocket/test_concurrency.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,24 +49,27 @@ async def generator():
4949

5050

5151
@pytest.mark.timeout(30)
52-
@pytest.mark.parametrize('transport_id, expected_delta, expected_runtime', (
53-
('tcp', 0.3, 3),
54-
('aiohttp', 0.6, 7),
55-
('quart', 1, 7),
56-
('quic', 4, 13),
57-
('http3', 5, 20),
58-
))
59-
async def test_concurrent_fragmented_responses(pipe_factory_by_id, unused_tcp_port, transport_id, expected_delta,
60-
expected_runtime):
52+
async def test_concurrent_fragmented_responses(lazy_pipe_with_id):
53+
transport_id, lazy_pipe = lazy_pipe_with_id
54+
55+
transport_parameter_map = {
56+
'tcp': (0.3, 3),
57+
'aiohttp': (0.6, 7),
58+
'quart': (1, 7),
59+
'quic': (4, 13),
60+
'http3': (5, 20),
61+
}
62+
63+
expected_delta, expected_runtime = transport_parameter_map[transport_id]
64+
6165
class Handler(BaseRequestHandler):
6266
async def request_response(self, request: Payload):
6367
data = 'a' * 100 * int(utf8_decode(request.data))
6468
return create_response(ensure_bytes(data))
6569

66-
async with pipe_factory_by_id(transport_id)(unused_tcp_port,
67-
server_arguments={'handler_factory': Handler,
68-
'fragment_size_bytes': 100},
69-
client_arguments={'fragment_size_bytes': 100}) as (server, client):
70+
async with lazy_pipe(
71+
server_arguments={'handler_factory': Handler, 'fragment_size_bytes': 100},
72+
client_arguments={'fragment_size_bytes': 100}) as (server, client):
7073
async def run():
7174
request_1 = asyncio.create_task(measure_time(client.request_response(Payload(b'10000'))))
7275

tests/rsocket/test_connection_lost.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
from typing import Optional, Tuple
77

88
import pytest
9-
from aiohttp.test_utils import RawTestServer
10-
from aioquic.quic.configuration import QuicConfiguration
119
from asyncstdlib import sync
12-
from cryptography.hazmat.primitives import serialization
1310

1411
from reactivestreams.publisher import Publisher
1512
from rsocket.awaitable.awaitable_rsocket import AwaitableRSocket
@@ -23,7 +20,6 @@
2320
from rsocket.rsocket_client import RSocketClient
2421
from rsocket.rsocket_server import RSocketServer
2522
from rsocket.streams.stream_from_async_generator import StreamFromAsyncGenerator
26-
from rsocket.transports.aiohttp_websocket import websocket_handler_factory, TransportAioHttpClient
2723
from rsocket.transports.aioquic_transport import rsocket_connect, rsocket_serve
2824
from rsocket.transports.tcp import TransportTCP
2925
from rsocket.transports.transport import Transport
@@ -244,6 +240,9 @@ async def transport_provider():
244240

245241

246242
async def start_websocket_service(waiter: asyncio.Event, container, port: int, generate_test_certificates):
243+
from rsocket.transports.aiohttp_websocket import websocket_handler_factory, TransportAioHttpClient
244+
from aiohttp.test_utils import RawTestServer
245+
247246
index_iterator = iter(range(1, 3))
248247

249248
def handler_factory(*args, **kwargs):
@@ -264,6 +263,8 @@ def on_server_create(server):
264263

265264

266265
async def start_websocket_client(port: int, generate_test_certificates) -> RSocketClient:
266+
from rsocket.transports.aiohttp_websocket import TransportAioHttpClient
267+
267268
url = 'http://localhost:{}'.format(port)
268269

269270
async def transport_provider():
@@ -281,6 +282,8 @@ async def transport_provider():
281282

282283

283284
async def start_quic_service(waiter: asyncio.Event, container, port: int, generate_test_certificates):
285+
from aioquic.quic.configuration import QuicConfiguration
286+
284287
index_iterator = iter(range(1, 3))
285288
certificate, private_key = generate_test_certificates
286289
server_configuration = QuicConfiguration(
@@ -309,6 +312,9 @@ def on_server_create(server):
309312

310313

311314
async def start_quic_client(port: int, generate_test_certificates) -> RSocketClient:
315+
from aioquic.quic.configuration import QuicConfiguration
316+
from cryptography.hazmat.primitives import serialization
317+
312318
certificate, private_key = generate_test_certificates
313319
client_configuration = QuicConfiguration(
314320
is_client=True
@@ -343,7 +349,7 @@ async def transport_provider():
343349
(
344350
('tcp', start_tcp_service, start_tcp_client),
345351
# ('aiohttp', start_websocket_service, start_websocket_client), # todo: fixme
346-
('quic', start_quic_service, start_quic_client),
352+
# ('quic', start_quic_service, start_quic_client), # todo: fixme
347353
)
348354
)
349355
async def test_connection_failure_during_stream(unused_tcp_port,

tests/tools/fixtures_aiohttp.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55

66
@pytest.fixture
77
def aiohttp_raw_server(event_loop: asyncio.BaseEventLoop, unused_tcp_port):
8-
from aiohttp.test_utils import RawTestServer
8+
try:
9+
from aiohttp.test_utils import RawTestServer
10+
except ModuleNotFoundError:
11+
yield None
12+
return
913

1014
servers = []
1115

tests/tools/fixtures_aioquic.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
22
from contextlib import asynccontextmanager
33
from typing import Optional
44

5-
from aioquic.quic.configuration import QuicConfiguration
6-
75
from rsocket.helpers import single_transport_provider
86
from rsocket.rsocket_base import RSocketBase
97
from rsocket.rsocket_client import RSocketClient
10-
from rsocket.transports.aioquic_transport import rsocket_connect, rsocket_serve
118
from tests.rsocket.helpers import assert_no_open_streams
12-
from tests.tools.helpers import quic_client_configuration
139

1410

1511
@asynccontextmanager
1612
async def pipe_factory_quic(generate_test_certificates,
1713
unused_tcp_port,
1814
client_arguments=None,
1915
server_arguments=None):
16+
from rsocket.transports.aioquic_transport import rsocket_connect, rsocket_serve
17+
from tests.tools.helpers import quic_client_configuration
18+
from aioquic.quic.configuration import QuicConfiguration
19+
2020
certificate, private_key = generate_test_certificates
2121

2222
server_configuration = QuicConfiguration(

tests/tools/fixtures_http3.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@
66
from rsocket.rsocket_base import RSocketBase
77
from rsocket.rsocket_client import RSocketClient
88
from tests.rsocket.helpers import assert_no_open_streams
9-
from tests.tools.http3_client import http3_ws_transport
10-
from tests.tools.http3_server import start_http_server
119

1210

1311
@asynccontextmanager
1412
async def pipe_factory_http3(generate_test_certificates,
1513
unused_tcp_port,
1614
client_arguments=None,
1715
server_arguments=None):
16+
from tests.tools.http3_client import http3_ws_transport
17+
from tests.tools.http3_server import start_http_server
18+
1819
certificate, private_key = generate_test_certificates
1920

2021
server: Optional[RSocketBase] = None

0 commit comments

Comments
 (0)