Merge pull request #243 from dutradda/add_remove_route_method
created methods to remove a route from api/router
This commit is contained in:
		| @@ -23,6 +23,10 @@ class RouteExists(Exception): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class RouteDoesNotExist(Exception): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| class Router: | ||||
|     """ | ||||
|     Router supports basic routing with parameters and method checks | ||||
| @@ -109,6 +113,23 @@ class Router: | ||||
|         else: | ||||
|             self.routes_static[uri] = route | ||||
|  | ||||
|     def remove(self, uri, clean_cache=True): | ||||
|         try: | ||||
|             route = self.routes_all.pop(uri) | ||||
|         except KeyError: | ||||
|             raise RouteDoesNotExist("Route was not registered: {}".format(uri)) | ||||
|  | ||||
|         if route in self.routes_always_check: | ||||
|             self.routes_always_check.remove(route) | ||||
|         elif url_hash(uri) in self.routes_dynamic \ | ||||
|                 and route in self.routes_dynamic[url_hash(uri)]: | ||||
|             self.routes_dynamic[url_hash(uri)].remove(route) | ||||
|         else: | ||||
|             self.routes_static.pop(uri) | ||||
|  | ||||
|         if clean_cache: | ||||
|             self._get.cache_clear() | ||||
|  | ||||
|     def get(self, request): | ||||
|         """ | ||||
|         Gets a request handler based on the URL of the request, or raises an | ||||
|   | ||||
| @@ -80,6 +80,9 @@ class Sanic: | ||||
|         self.route(uri=uri, methods=methods)(handler) | ||||
|         return handler | ||||
|  | ||||
|     def remove_route(self, uri, clean_cache=True): | ||||
|         self.router.remove(uri, clean_cache) | ||||
|  | ||||
|     # Decorator | ||||
|     def exception(self, *exceptions): | ||||
|         """ | ||||
|   | ||||
| @@ -2,7 +2,7 @@ import pytest | ||||
|  | ||||
| from sanic import Sanic | ||||
| from sanic.response import text | ||||
| from sanic.router import RouteExists | ||||
| from sanic.router import RouteExists, RouteDoesNotExist | ||||
| from sanic.utils import sanic_endpoint_test | ||||
|  | ||||
|  | ||||
| @@ -356,3 +356,110 @@ def test_add_route_method_not_allowed(): | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, method='post', uri='/test') | ||||
|     assert response.status == 405 | ||||
|  | ||||
|  | ||||
| def test_remove_static_route(): | ||||
|     app = Sanic('test_remove_static_route') | ||||
|  | ||||
|     async def handler1(request): | ||||
|         return text('OK1') | ||||
|  | ||||
|     async def handler2(request): | ||||
|         return text('OK2') | ||||
|  | ||||
|     app.add_route(handler1, '/test') | ||||
|     app.add_route(handler2, '/test2') | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/test') | ||||
|     assert response.status == 200 | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/test2') | ||||
|     assert response.status == 200 | ||||
|  | ||||
|     app.remove_route('/test') | ||||
|     app.remove_route('/test2') | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/test') | ||||
|     assert response.status == 404 | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/test2') | ||||
|     assert response.status == 404 | ||||
|  | ||||
|  | ||||
| def test_remove_dynamic_route(): | ||||
|     app = Sanic('test_remove_dynamic_route') | ||||
|  | ||||
|     async def handler(request, name): | ||||
|         return text('OK') | ||||
|  | ||||
|     app.add_route(handler, '/folder/<name>') | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/folder/test123') | ||||
|     assert response.status == 200 | ||||
|  | ||||
|     app.remove_route('/folder/<name>') | ||||
|     request, response = sanic_endpoint_test(app, uri='/folder/test123') | ||||
|     assert response.status == 404 | ||||
|  | ||||
|  | ||||
| def test_remove_inexistent_route(): | ||||
|     app = Sanic('test_remove_inexistent_route') | ||||
|  | ||||
|     with pytest.raises(RouteDoesNotExist): | ||||
|         app.remove_route('/test') | ||||
|  | ||||
|  | ||||
| def test_remove_unhashable_route(): | ||||
|     app = Sanic('test_remove_unhashable_route') | ||||
|  | ||||
|     async def handler(request, unhashable): | ||||
|         return text('OK') | ||||
|  | ||||
|     app.add_route(handler, '/folder/<unhashable:[A-Za-z0-9/]+>/end/') | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/folder/test/asdf/end/') | ||||
|     assert response.status == 200 | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/folder/test///////end/') | ||||
|     assert response.status == 200 | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/folder/test/end/') | ||||
|     assert response.status == 200 | ||||
|  | ||||
|     app.remove_route('/folder/<unhashable:[A-Za-z0-9/]+>/end/') | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/folder/test/asdf/end/') | ||||
|     assert response.status == 404 | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/folder/test///////end/') | ||||
|     assert response.status == 404 | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/folder/test/end/') | ||||
|     assert response.status == 404 | ||||
|  | ||||
|  | ||||
| def test_remove_route_without_clean_cache(): | ||||
|     app = Sanic('test_remove_static_route') | ||||
|  | ||||
|     async def handler(request): | ||||
|         return text('OK') | ||||
|  | ||||
|     app.add_route(handler, '/test') | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/test') | ||||
|     assert response.status == 200 | ||||
|  | ||||
|     app.remove_route('/test', clean_cache=True) | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/test') | ||||
|     assert response.status == 404 | ||||
|  | ||||
|     app.add_route(handler, '/test') | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/test') | ||||
|     assert response.status == 200 | ||||
|  | ||||
|     app.remove_route('/test', clean_cache=False) | ||||
|  | ||||
|     request, response = sanic_endpoint_test(app, uri='/test') | ||||
|     assert response.status == 200 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Eli Uriegas
					Eli Uriegas