Skip to content

Commit 12ce02b

Browse files
author
Nikolay Kim
committed
use app.add_subapp instead of router.add_subapp
1 parent dc13304 commit 12ce02b

7 files changed

+70
-63
lines changed

CHANGES.rst

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ CHANGES
66

77
- Fix polls demo run application #1487
88

9-
-
9+
- remove `web.Application` dependency from `web.UrlDispatcher` #1510
1010

11+
1112
1.2.0 (2016-12-17)
1213
------------------
1314

aiohttp/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = '1.2.0'
1+
__version__ = '1.2.1a'
22

33
# Deprecated, keep it here for a while for backward compatibility.
44
import multidict # noqa

aiohttp/web.py

+14-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from .web_reqrep import * # noqa
1919
from .web_server import Server
2020
from .web_urldispatcher import * # noqa
21-
from .web_urldispatcher import PrefixedSubAppResource, _wrap_add_subbapp
21+
from .web_urldispatcher import PrefixedSubAppResource
2222
from .web_ws import * # noqa
2323

2424
__all__ = (web_reqrep.__all__ +
@@ -40,6 +40,7 @@ def __init__(self, *, logger=web_logger, loop=None,
4040
router = web_urldispatcher.UrlDispatcher()
4141
assert isinstance(router, AbstractRouter), router
4242

43+
# backward compatibility until full deprecation
4344
router.add_subapp = _wrap_add_subbapp(self)
4445

4546
if debug is ...:
@@ -138,8 +139,8 @@ def add_subapp(self, prefix, subapp):
138139
raise ValueError("Prefix cannot be empty")
139140

140141
resource = PrefixedSubAppResource(prefix, subapp)
141-
self.reg_resource(resource)
142-
subapp._reg_subapp_signals(subapp)
142+
self.router.reg_resource(resource)
143+
self._reg_subapp_signals(subapp)
143144
subapp.freeze()
144145
return resource
145146

@@ -282,6 +283,16 @@ def __repr__(self):
282283
return "<Application 0x{:x}>".format(id(self))
283284

284285

286+
def _wrap_add_subbapp(app):
287+
# backward compatibility
288+
289+
def add_subapp(prefix, subapp):
290+
warnings.warn("Use app.add_subapp() instead", DeprecationWarning)
291+
return app.add_subapp(prefix, subapp)
292+
293+
return add_subapp
294+
295+
285296
def run_app(app, *, host='0.0.0.0', port=None,
286297
shutdown_timeout=60.0, ssl_context=None,
287298
print=print, backlog=128, access_log_format=None,

aiohttp/web_urldispatcher.py

-18
Original file line numberDiff line numberDiff line change
@@ -887,21 +887,3 @@ def freeze(self):
887887
super().freeze()
888888
for resource in self._resources:
889889
resource.freeze()
890-
891-
892-
def _wrap_add_subbapp(app):
893-
894-
def add_subapp(prefix, subapp):
895-
if subapp.frozen:
896-
raise RuntimeError("Cannot add frozen application")
897-
if prefix.endswith('/'):
898-
prefix = prefix[:-1]
899-
if prefix in ('', '/'):
900-
raise ValueError("Prefix cannot be empty")
901-
resource = PrefixedSubAppResource(prefix, subapp)
902-
app.router.reg_resource(resource)
903-
app._reg_subapp_signals(subapp)
904-
subapp.freeze()
905-
return resource
906-
907-
return add_subapp

docs/web.rst

+4-4
Original file line numberDiff line numberDiff line change
@@ -971,12 +971,12 @@ toolbar URLs are served by prefix like ``/admin``.
971971

972972
Thus we'll create a totally separate application named ``admin`` and
973973
connect it to main app with prefix by
974-
:meth:`~aiohttp.web.UrlDispatcher.add_subapp`::
974+
:meth:`~aiohttp.web.Application.add_subapp`::
975975

976976
admin = web.Application()
977977
# setup admin routes, signals and middlewares
978978

979-
app.router.add_subapp('/admin/', admin)
979+
app.add_subapp('/admin/', admin)
980980

981981
Middlewares and signals from ``app`` and ``admin`` are chained.
982982

@@ -1006,7 +1006,7 @@ But for getting URL sub-application's router should be used::
10061006
admin = web.Application()
10071007
admin.router.add_get('/resource', handler, name='name')
10081008

1009-
app.router.add_subapp('/admin/', admin)
1009+
app.add_subapp('/admin/', admin)
10101010

10111011
url = admin.router['name'].url_for()
10121012

@@ -1019,7 +1019,7 @@ use the following explicit technique::
10191019
admin = web.Application()
10201020
admin.router.add_get('/resource', handler, name='name')
10211021

1022-
app.router.add_subapp('/admin/', admin)
1022+
app.add_subapp('/admin/', admin)
10231023
app['admin'] = admin
10241024

10251025
async def handler(request): # main application's handler

tests/test_urldispatch.py

+30-17
Original file line numberDiff line numberDiff line change
@@ -907,46 +907,52 @@ def test_url_for_in_resource_route(router):
907907
assert URL('/get/John') == route.url_for(name='John')
908908

909909

910-
def test_subapp_get_info(router, loop):
910+
def test_subapp_get_info(app, loop):
911911
subapp = web.Application(loop=loop)
912-
resource = router.add_subapp('/pre', subapp)
912+
resource = subapp.add_subapp('/pre', subapp)
913913
assert resource.get_info() == {'prefix': '/pre', 'app': subapp}
914914

915915

916-
def test_subapp_url(router, loop):
916+
def test_subapp_backward_compatible(router, loop):
917917
subapp = web.Application(loop=loop)
918918
resource = router.add_subapp('/pre', subapp)
919+
assert resource.get_info() == {'prefix': '/pre', 'app': subapp}
920+
921+
922+
def test_subapp_url(app, loop):
923+
subapp = web.Application(loop=loop)
924+
resource = app.add_subapp('/pre', subapp)
919925
with pytest.raises(RuntimeError):
920926
resource.url()
921927

922928

923-
def test_subapp_url_for(router, loop):
929+
def test_subapp_url_for(app, loop):
924930
subapp = web.Application(loop=loop)
925-
resource = router.add_subapp('/pre', subapp)
931+
resource = app.add_subapp('/pre', subapp)
926932
with pytest.raises(RuntimeError):
927933
resource.url_for()
928934

929935

930-
def test_subapp_repr(router, loop):
936+
def test_subapp_repr(app, loop):
931937
subapp = web.Application(loop=loop)
932-
resource = router.add_subapp('/pre', subapp)
938+
resource = app.add_subapp('/pre', subapp)
933939
assert repr(resource).startswith(
934940
'<PrefixedSubAppResource /pre -> <Application')
935941

936942

937-
def test_subapp_len(router, loop):
943+
def test_subapp_len(app, loop):
938944
subapp = web.Application(loop=loop)
939945
subapp.router.add_get('/', make_handler())
940946
subapp.router.add_post('/', make_handler())
941-
resource = router.add_subapp('/pre', subapp)
947+
resource = app.add_subapp('/pre', subapp)
942948
assert len(resource) == 2
943949

944950

945-
def test_subapp_iter(router, loop):
951+
def test_subapp_iter(app, loop):
946952
subapp = web.Application(loop=loop)
947953
r1 = subapp.router.add_get('/', make_handler())
948954
r2 = subapp.router.add_post('/', make_handler())
949-
resource = router.add_subapp('/pre', subapp)
955+
resource = app.add_subapp('/pre', subapp)
950956
assert list(resource) == [r1, r2]
951957

952958

@@ -961,11 +967,18 @@ def test_frozen_router(router):
961967
router.add_get('/', make_handler())
962968

963969

964-
def test_frozen_router_subapp(loop, router):
970+
def test_frozen_router_subapp(app, loop):
965971
subapp = web.Application(loop=loop)
966972
subapp.freeze()
967973
with pytest.raises(RuntimeError):
968-
router.add_subapp('/', subapp)
974+
app.add_subapp('/', subapp)
975+
976+
977+
def test_frozen_app_on_subapp(app, loop):
978+
app.freeze()
979+
subapp = web.Application(loop=loop)
980+
with pytest.raises(RuntimeError):
981+
app.add_subapp('/', subapp)
969982

970983

971984
def test_set_options_route(router):
@@ -991,16 +1004,16 @@ def test_dynamic_url_with_name_started_from_undescore(router):
9911004
assert URL('/get/John') == route.url_for(_name='John')
9921005

9931006

994-
def test_cannot_add_subapp_with_empty_prefix(router, loop):
1007+
def test_cannot_add_subapp_with_empty_prefix(app, loop):
9951008
subapp = web.Application(loop=loop)
9961009
with pytest.raises(ValueError):
997-
router.add_subapp('', subapp)
1010+
app.add_subapp('', subapp)
9981011

9991012

1000-
def test_cannot_add_subapp_with_slash_prefix(router, loop):
1013+
def test_cannot_add_subapp_with_slash_prefix(app, loop):
10011014
subapp = web.Application(loop=loop)
10021015
with pytest.raises(ValueError):
1003-
router.add_subapp('/', subapp)
1016+
app.add_subapp('/', subapp)
10041017

10051018

10061019
@asyncio.coroutine

tests/test_web_functional.py

+19-19
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ def handler(request):
869869
app = web.Application(loop=loop)
870870
subapp = web.Application(loop=loop)
871871
subapp.router.add_get('/to', handler)
872-
app.router.add_subapp('/path', subapp)
872+
app.add_subapp('/path', subapp)
873873

874874
client = yield from test_client(app)
875875
resp = yield from client.get('/path/to')
@@ -893,7 +893,7 @@ def handler2(request):
893893
subapp = web.Application(loop=loop)
894894
subapp.router.add_get('/to', handler)
895895
subapp.router.add_get('/final', handler2, name='name')
896-
app.router.add_subapp('/path', subapp)
896+
app.add_subapp('/path', subapp)
897897

898898
client = yield from test_client(app)
899899
resp = yield from client.get('/path/to')
@@ -918,7 +918,7 @@ def handler2(request):
918918
subapp = web.Application(loop=loop)
919919
subapp.router.add_get('/to', handler)
920920
subapp.router.add_get('/{part}', handler2, name='name')
921-
app.router.add_subapp('/path', subapp)
921+
app.add_subapp('/path', subapp)
922922

923923
client = yield from test_client(app)
924924
resp = yield from client.get('/path/to')
@@ -942,7 +942,7 @@ def handler(request):
942942
subapp.router.add_get('/to', handler)
943943
here = pathlib.Path(__file__).parent
944944
subapp.router.add_static('/static', here, name='name')
945-
app.router.add_subapp('/path', subapp)
945+
app.add_subapp('/path', subapp)
946946

947947
client = yield from test_client(app)
948948
resp = yield from client.get('/path/to')
@@ -963,7 +963,7 @@ def handler(request):
963963
app = web.Application(loop=loop)
964964
subapp = web.Application(loop=loop)
965965
subapp.router.add_get('/to', handler)
966-
app.router.add_subapp('/path/', subapp)
966+
app.add_subapp('/path/', subapp)
967967

968968
client = yield from test_client(app)
969969
resp = yield from client.get('/path/to')
@@ -981,7 +981,7 @@ def handler(request):
981981
app = web.Application(loop=loop)
982982
subapp = web.Application(loop=loop)
983983
subapp.router.add_get('/to', handler)
984-
app.router.add_subapp('/path/', subapp)
984+
app.add_subapp('/path/', subapp)
985985

986986
client = yield from test_client(app)
987987
resp = yield from client.get('/path/other')
@@ -997,7 +997,7 @@ def handler(request):
997997
app = web.Application(loop=loop)
998998
subapp = web.Application(loop=loop)
999999
subapp.router.add_get('/to', handler)
1000-
app.router.add_subapp('/path/', subapp)
1000+
app.add_subapp('/path/', subapp)
10011001

10021002
client = yield from test_client(app)
10031003
resp = yield from client.get('/invalid/other')
@@ -1013,7 +1013,7 @@ def handler(request):
10131013
app = web.Application(loop=loop)
10141014
subapp = web.Application(loop=loop)
10151015
subapp.router.add_get('/to', handler)
1016-
app.router.add_subapp('/path/', subapp)
1016+
app.add_subapp('/path/', subapp)
10171017

10181018
client = yield from test_client(app)
10191019
resp = yield from client.post('/path/to')
@@ -1031,7 +1031,7 @@ def handler(request):
10311031
app = web.Application(loop=loop)
10321032
subapp = web.Application(loop=loop)
10331033
subapp.router.add_get('/to', handler)
1034-
app.router.add_subapp('/path/', subapp)
1034+
app.add_subapp('/path/', subapp)
10351035

10361036
client = yield from test_client(app)
10371037
resp = yield from client.get('/path/to')
@@ -1062,8 +1062,8 @@ def middleware(request):
10621062
subapp1 = web.Application(loop=loop, middlewares=[middleware_factory])
10631063
subapp2 = web.Application(loop=loop, middlewares=[middleware_factory])
10641064
subapp2.router.add_get('/to', handler)
1065-
subapp1.router.add_subapp('/b/', subapp2)
1066-
app.router.add_subapp('/a/', subapp1)
1065+
subapp1.add_subapp('/b/', subapp2)
1066+
app.add_subapp('/a/', subapp1)
10671067

10681068
client = yield from test_client(app)
10691069
resp = yield from client.get('/a/b/to')
@@ -1095,8 +1095,8 @@ def on_response(request, response):
10951095
subapp2 = web.Application(loop=loop)
10961096
subapp2.on_response_prepare.append(make_signal(subapp2))
10971097
subapp2.router.add_get('/to', handler)
1098-
subapp1.router.add_subapp('/b/', subapp2)
1099-
app.router.add_subapp('/a/', subapp1)
1098+
subapp1.add_subapp('/b/', subapp2)
1099+
app.add_subapp('/a/', subapp1)
11001100

11011101
client = yield from test_client(app)
11021102
resp = yield from client.get('/a/b/to')
@@ -1118,8 +1118,8 @@ def on_signal(app):
11181118
subapp1.on_startup.append(on_signal)
11191119
subapp2 = web.Application(loop=loop)
11201120
subapp2.on_startup.append(on_signal)
1121-
subapp1.router.add_subapp('/b/', subapp2)
1122-
app.router.add_subapp('/a/', subapp1)
1121+
subapp1.add_subapp('/b/', subapp2)
1122+
app.add_subapp('/a/', subapp1)
11231123

11241124
yield from test_server(app)
11251125

@@ -1139,8 +1139,8 @@ def on_signal(app):
11391139
subapp1.on_shutdown.append(on_signal)
11401140
subapp2 = web.Application(loop=loop)
11411141
subapp2.on_shutdown.append(on_signal)
1142-
subapp1.router.add_subapp('/b/', subapp2)
1143-
app.router.add_subapp('/a/', subapp1)
1142+
subapp1.add_subapp('/b/', subapp2)
1143+
app.add_subapp('/a/', subapp1)
11441144

11451145
server = yield from test_server(app)
11461146
yield from server.close()
@@ -1162,8 +1162,8 @@ def on_signal(app):
11621162
subapp1.on_cleanup.append(on_signal)
11631163
subapp2 = web.Application(loop=loop)
11641164
subapp2.on_cleanup.append(on_signal)
1165-
subapp1.router.add_subapp('/b/', subapp2)
1166-
app.router.add_subapp('/a/', subapp1)
1165+
subapp1.add_subapp('/b/', subapp2)
1166+
app.add_subapp('/a/', subapp1)
11671167

11681168
server = yield from test_server(app)
11691169
yield from server.close()

0 commit comments

Comments
 (0)