6
6
import random
7
7
import string
8
8
from pathlib import Path
9
- from typing import NoReturn
9
+ from typing import NoReturn , Optional
10
10
from unittest import mock
11
11
12
12
from multidict import CIMultiDict , CIMultiDictProxy
@@ -53,9 +53,16 @@ async def handler(request: web.Request) -> NoReturn:
53
53
router = app .router
54
54
request = _mock_request (method = "GET" , path = "/" )
55
55
56
- async def run_url_dispatcher_benchmark () -> None :
56
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
57
+ ret = None
57
58
for _ in range (resolve_count ):
58
- await router .resolve (request )
59
+ ret = await router .resolve (request )
60
+
61
+ return ret
62
+
63
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
64
+ assert ret is not None
65
+ assert ret .get_info ()["path" ] == "/" , ret .get_info ()
59
66
60
67
@benchmark
61
68
def _run () -> None :
@@ -70,14 +77,22 @@ def test_resolve_static_root_route(
70
77
resolve_count = 100
71
78
72
79
app = web .Application ()
73
- app .router .add_static ("/" , pathlib .Path (aiohttp .__file__ ).parent )
80
+ here = pathlib .Path (aiohttp .__file__ ).parent
81
+ app .router .add_static ("/" , here )
74
82
app .freeze ()
75
83
router = app .router
76
84
request = _mock_request (method = "GET" , path = "/" )
77
85
78
- async def run_url_dispatcher_benchmark () -> None :
86
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
87
+ ret = None
79
88
for _ in range (resolve_count ):
80
- await router .resolve (request )
89
+ ret = await router .resolve (request )
90
+
91
+ return ret
92
+
93
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
94
+ assert ret is not None
95
+ assert ret .get_info ()["directory" ] == here , ret .get_info ()
81
96
82
97
@benchmark
83
98
def _run () -> None :
@@ -101,9 +116,16 @@ async def handler(request: web.Request) -> NoReturn:
101
116
router = app .router
102
117
request = _mock_request (method = "GET" , path = "/api/server/dispatch/1/update" )
103
118
104
- async def run_url_dispatcher_benchmark () -> None :
119
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
120
+ ret = None
105
121
for _ in range (resolve_count ):
106
- await router .resolve (request )
122
+ ret = await router .resolve (request )
123
+
124
+ return ret
125
+
126
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
127
+ assert ret is not None
128
+ assert ret .get_info ()["path" ] == "/api/server/dispatch/1/update" , ret .get_info ()
107
129
108
130
@benchmark
109
131
def _run () -> None :
@@ -130,9 +152,15 @@ async def handler(request: web.Request) -> NoReturn:
130
152
for count in range (250 )
131
153
]
132
154
133
- async def run_url_dispatcher_benchmark () -> None :
155
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
156
+ ret = None
134
157
for request in requests :
135
- await router .resolve (request )
158
+ ret = await router .resolve (request )
159
+ return ret
160
+
161
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
162
+ assert ret is not None
163
+ assert ret .get_info ()["path" ] == "/api/server/dispatch/249/update" , ret .get_info ()
136
164
137
165
@benchmark
138
166
def _run () -> None :
@@ -162,11 +190,18 @@ async def handler(request: web.Request) -> NoReturn:
162
190
app .freeze ()
163
191
router = app .router
164
192
165
- requests = [_mock_request (method = "GET" , path = url ) for url in urls ]
193
+ requests = [( _mock_request (method = "GET" , path = url ), url ) for url in urls ]
166
194
167
- async def run_url_dispatcher_benchmark () -> None :
168
- for request in requests :
169
- await router .resolve (request )
195
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
196
+ ret = None
197
+ for request , path in requests :
198
+ ret = await router .resolve (request )
199
+
200
+ return ret
201
+
202
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
203
+ assert ret is not None
204
+ assert ret .get_info ()["path" ] == url , ret .get_info ()
170
205
171
206
@benchmark
172
207
def _run () -> None :
@@ -194,9 +229,18 @@ async def handler(request: web.Request) -> NoReturn:
194
229
for customer in range (250 )
195
230
]
196
231
197
- async def run_url_dispatcher_benchmark () -> None :
232
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
233
+ ret = None
198
234
for request in requests :
199
- await router .resolve (request )
235
+ ret = await router .resolve (request )
236
+
237
+ return ret
238
+
239
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
240
+ assert ret is not None
241
+ assert (
242
+ ret .get_info ()["formatter" ] == "/api/server/dispatch/{customer}/update"
243
+ ), ret .get_info ()
200
244
201
245
@benchmark
202
246
def _run () -> None :
@@ -226,9 +270,18 @@ async def handler(request: web.Request) -> NoReturn:
226
270
for customer in range (250 )
227
271
]
228
272
229
- async def run_url_dispatcher_benchmark () -> None :
273
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
274
+ ret = None
230
275
for request in requests :
231
- await router .resolve (request )
276
+ ret = await router .resolve (request )
277
+
278
+ return ret
279
+
280
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
281
+ assert ret is not None
282
+ assert (
283
+ ret .get_info ()["formatter" ] == "/api/server/dispatch/{customer}/update"
284
+ ), ret .get_info ()
232
285
233
286
@benchmark
234
287
def _run () -> None :
@@ -256,9 +309,16 @@ async def handler(request: web.Request) -> NoReturn:
256
309
for customer in range (250 )
257
310
]
258
311
259
- async def run_url_dispatcher_benchmark () -> None :
312
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
313
+ ret = None
260
314
for request in requests :
261
- await router .resolve (request )
315
+ ret = await router .resolve (request )
316
+
317
+ return ret
318
+
319
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
320
+ assert ret is not None
321
+ assert ret .get_info ()["formatter" ] == "/api/{customer}/update" , ret .get_info ()
262
322
263
323
@benchmark
264
324
def _run () -> None :
@@ -306,9 +366,18 @@ async def handler(request: web.Request) -> NoReturn:
306
366
)
307
367
)
308
368
309
- async def run_url_dispatcher_benchmark () -> None :
369
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
370
+ ret = None
310
371
for request in requests :
311
- await router .resolve (request )
372
+ ret = await router .resolve (request )
373
+ return ret
374
+
375
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
376
+ assert ret is not None
377
+ assert (
378
+ ret .get_info ()["formatter" ]
379
+ == "/repos/{owner}/{repo}/pulls/{pull_number}/reviews"
380
+ ), ret .get_info ()
312
381
313
382
@benchmark
314
383
def _run () -> None :
@@ -346,8 +415,14 @@ async def handler(request: web.Request) -> NoReturn:
346
415
app = web .Application ()
347
416
for url in urls :
348
417
parts = url .split ("/" )
349
- subapp = subapps .get (parts [1 ], app )
350
- subapp .router .add_get (url , handler )
418
+ subapp = subapps .get (parts [1 ])
419
+ if subapp is not None :
420
+ sub_url = "/" .join (["" ] + parts [2 :])
421
+ if not sub_url :
422
+ sub_url = "/"
423
+ subapp .router .add_get (sub_url , handler )
424
+ else :
425
+ app .router .add_get (url , handler )
351
426
for key , subapp in subapps .items ():
352
427
app .add_subapp ("/" + key , subapp )
353
428
app .freeze ()
@@ -370,9 +445,18 @@ async def handler(request: web.Request) -> NoReturn:
370
445
)
371
446
)
372
447
373
- async def run_url_dispatcher_benchmark () -> None :
448
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
449
+ ret = None
374
450
for request in requests :
375
- await router .resolve (request )
451
+ ret = await router .resolve (request )
452
+ return ret
453
+
454
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
455
+ assert ret is not None
456
+ assert (
457
+ ret .get_info ()["formatter" ]
458
+ == "/repos/{owner}/{repo}/pulls/{pull_number}/reviews"
459
+ ), ret .get_info ()
376
460
377
461
@benchmark
378
462
def _run () -> None :
@@ -404,9 +488,17 @@ async def handler(request: web.Request) -> NoReturn:
404
488
for customer in range (250 )
405
489
]
406
490
407
- async def run_url_dispatcher_benchmark () -> None :
491
+ async def run_url_dispatcher_benchmark () -> Optional [web .UrlMappingMatchInfo ]:
492
+ ret = None
408
493
for request in requests :
409
- await router .resolve (request )
494
+ ret = await router .resolve (request )
495
+ return ret
496
+
497
+ ret = loop .run_until_complete (run_url_dispatcher_benchmark ())
498
+ assert ret is not None
499
+ assert (
500
+ ret .get_info ()["path" ] == "/api/path/to/plugin/249/deep/enough/sub/path"
501
+ ), ret .get_info ()
410
502
411
503
@benchmark
412
504
def _run () -> None :
0 commit comments