diff --git a/CHANGES.rst b/CHANGES.rst index dd20eeab..12733bfd 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -10,16 +10,30 @@ Version 1.1 Unreleased -Version 1.0.2 +Version 1.0.3 ------------- Unreleased +Version 1.0.2 +------------- + +Released on May 2nd 2018 + +- Fix more backwards compatibility issues with merging slashes between + a blueprint prefix and route. (`#2748`_) +- Fix error with ``flask routes`` command when there are no routes. + (`#2751`_) + +.. _#2748: https://github.com/pallets/flask/pull/2748 +.. _#2751: https://github.com/pallets/flask/issues/2751 + + Version 1.0.1 ------------- -Released on April 29 2018 +Released on April 29th 2018 - Fix registering partials (with no ``__name__``) as view functions. (`#2730`_) diff --git a/flask/blueprints.py b/flask/blueprints.py index 3bdb3d9e..5ce5561e 100644 --- a/flask/blueprints.py +++ b/flask/blueprints.py @@ -10,6 +10,7 @@ :license: BSD, see LICENSE for more details. """ from functools import update_wrapper +from werkzeug.urls import url_join from .helpers import _PackageBoundObject, _endpoint_from_view_func @@ -49,8 +50,6 @@ class BlueprintSetupState(object): url_prefix = self.options.get('url_prefix') if url_prefix is None: url_prefix = self.blueprint.url_prefix - if url_prefix: - url_prefix = url_prefix.rstrip('/') #: The prefix that should be used for all URLs defined on the #: blueprint. self.url_prefix = url_prefix @@ -66,7 +65,11 @@ class BlueprintSetupState(object): blueprint's name. """ if self.url_prefix is not None: - rule = '/'.join((self.url_prefix, rule.lstrip('/'))) + if rule: + rule = '/'.join(( + self.url_prefix.rstrip('/'), rule.lstrip('/'))) + else: + rule = self.url_prefix options.setdefault('subdomain', self.subdomain) if endpoint is None: endpoint = _endpoint_from_view_func(view_func) diff --git a/flask/cli.py b/flask/cli.py index 635abb13..efc1733e 100644 --- a/flask/cli.py +++ b/flask/cli.py @@ -825,6 +825,10 @@ def routes_command(sort, all_methods): """Show all registered routes with endpoints and methods.""" rules = list(current_app.url_map.iter_rules()) + if not rules: + click.echo('No routes were registered.') + return + ignored_methods = set(() if all_methods else ('HEAD', 'OPTIONS')) if sort in ('endpoint', 'rule'): diff --git a/tests/test_blueprints.py b/tests/test_blueprints.py index 46364cab..465079cd 100644 --- a/tests/test_blueprints.py +++ b/tests/test_blueprints.py @@ -116,6 +116,12 @@ def test_blueprint_app_error_handling(app, client): @pytest.mark.parametrize(('prefix', 'rule', 'url'), ( + ('', '/', '/'), + ('/', '', '/'), + ('/', '/', '/'), + ('/foo', '', '/foo'), + ('/foo/', '', '/foo/'), + ('', '/bar', '/bar'), ('/foo/', '/bar', '/foo/bar'), ('/foo/', 'bar', '/foo/bar'), ('/foo', '/bar', '/foo/bar'),