diff --git a/CHANGES b/CHANGES index f0cb9723..18ccf0b9 100644 --- a/CHANGES +++ b/CHANGES @@ -82,6 +82,16 @@ Major release, unreleased - Fix incorrect JSON encoding of aware, non-UTC datetimes. (`#2374`_) - Template auto reloading will honor the ``run`` command's ``debug`` flag even if ``app.jinja_env`` was already accessed. (`#2373`_) +- The following old deprecated code was removed. (`#2385`_) + + - ``Flask.init_jinja_globals`` - extend ``Flask.create_jinja_environment`` + instead. + - ``Flask.error_handlers`` - tracked by ``Flask.error_handler_spec``, + use ``@app.errorhandler`` to register handlers. + - ``Flask.request_globals_class`` - use ``Flask.app_ctx_globals_class`` + instead. + - ``Flask.static_path`` - use ``Flask.static_url_path`` instead. + - ``Request.module`` - use ``Request.blueprint`` instead. .. _#1489: https://github.com/pallets/flask/pull/1489 .. _#1621: https://github.com/pallets/flask/pull/1621 @@ -107,6 +117,7 @@ Major release, unreleased .. _#2362: https://github.com/pallets/flask/pull/2362 .. _#2374: https://github.com/pallets/flask/pull/2374 .. _#2373: https://github.com/pallets/flask/pull/2373 +.. _#2385: https://github.com/pallets/flask/issues/2385 Version 0.12.2 -------------- diff --git a/flask/app.py b/flask/app.py index a5d7cfaf..19d23f0d 100644 --- a/flask/app.py +++ b/flask/app.py @@ -349,29 +349,38 @@ class Flask(_PackageBoundObject): #: resources contained in the package. root_path = None - def __init__(self, import_name, static_path=None, static_url_path=None, - static_folder='static', static_host=None, - host_matching=False, template_folder='templates', - instance_path=None, instance_relative_config=False, - root_path=None): - _PackageBoundObject.__init__(self, import_name, - template_folder=template_folder, - root_path=root_path) - if static_path is not None: - from warnings import warn - warn(DeprecationWarning('static_path is now called ' - 'static_url_path'), stacklevel=2) - static_url_path = static_path + def __init__( + self, + import_name, + static_url_path=None, + static_folder='static', + static_host=None, + host_matching=False, + template_folder='templates', + instance_path=None, + instance_relative_config=False, + root_path=None + ): + _PackageBoundObject.__init__( + self, + import_name, + template_folder=template_folder, + root_path=root_path + ) if static_url_path is not None: self.static_url_path = static_url_path + if static_folder is not None: self.static_folder = static_folder + if instance_path is None: instance_path = self.auto_find_instance_path() elif not os.path.isabs(instance_path): - raise ValueError('If an instance path is provided it must be ' - 'absolute. A relative path was given instead.') + raise ValueError( + 'If an instance path is provided it must be absolute.' + ' A relative path was given instead.' + ) #: Holds the path to the instance folder. #: @@ -393,10 +402,6 @@ class Flask(_PackageBoundObject): #: To register a view function, use the :meth:`route` decorator. self.view_functions = {} - # support for the now deprecated `error_handlers` attribute. The - # :attr:`error_handler_spec` shall be used now. - self._error_handlers = {} - #: A dictionary of all registered error handlers. The key is ``None`` #: for error handlers active on the application, otherwise the key is #: the name of the blueprint. Each key points to another dictionary @@ -407,7 +412,7 @@ class Flask(_PackageBoundObject): #: #: To register an error handler, use the :meth:`errorhandler` #: decorator. - self.error_handler_spec = {None: self._error_handlers} + self.error_handler_spec = {} #: A list of functions that are called when :meth:`url_for` raises a #: :exc:`~werkzeug.routing.BuildError`. Each function registered here @@ -551,9 +556,12 @@ class Flask(_PackageBoundObject): # development). Also, Google App Engine stores static files somewhere if self.has_static_folder: assert bool(static_host) == host_matching, 'Invalid static_host/host_matching combination' - self.add_url_rule(self.static_url_path + '/', - endpoint='static', host=static_host, - view_func=self.send_static_file) + self.add_url_rule( + self.static_url_path + '/', + endpoint='static', + host=static_host, + view_func=self.send_static_file + ) #: The click command line context for this application. Commands #: registered here show up in the :command:`flask` command once the @@ -563,17 +571,6 @@ class Flask(_PackageBoundObject): #: This is an instance of a :class:`click.Group` object. self.cli = cli.AppGroup(self.name) - def _get_error_handlers(self): - from warnings import warn - warn(DeprecationWarning('error_handlers is deprecated, use the ' - 'new error_handler_spec attribute instead.'), stacklevel=1) - return self._error_handlers - def _set_error_handlers(self, value): - self._error_handlers = value - self.error_handler_spec[None] = value - error_handlers = property(_get_error_handlers, _set_error_handlers) - del _get_error_handlers, _set_error_handlers - @locked_cached_property def name(self): """The name of the application. This is usually the import name diff --git a/flask/helpers.py b/flask/helpers.py index 94c5ce77..5adb0e2a 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -268,40 +268,40 @@ def url_for(endpoint, **values): """ appctx = _app_ctx_stack.top reqctx = _request_ctx_stack.top + if appctx is None: - raise RuntimeError('Attempted to generate a URL without the ' - 'application context being pushed. This has to be ' - 'executed when application context is available.') + raise RuntimeError( + 'Attempted to generate a URL without the application context being' + ' pushed. This has to be executed when application context is' + ' available.' + ) # If request specific information is available we have some extra # features that support "relative" URLs. if reqctx is not None: url_adapter = reqctx.url_adapter blueprint_name = request.blueprint - if not reqctx.request._is_old_module: - if endpoint[:1] == '.': - if blueprint_name is not None: - endpoint = blueprint_name + endpoint - else: - endpoint = endpoint[1:] - else: - # TODO: get rid of this deprecated functionality in 1.0 - if '.' not in endpoint: - if blueprint_name is not None: - endpoint = blueprint_name + '.' + endpoint - elif endpoint.startswith('.'): + + if endpoint[:1] == '.': + if blueprint_name is not None: + endpoint = blueprint_name + endpoint + else: endpoint = endpoint[1:] + external = values.pop('_external', False) # Otherwise go with the url adapter from the appctx and make # the URLs external by default. else: url_adapter = appctx.url_adapter + if url_adapter is None: - raise RuntimeError('Application was not able to create a URL ' - 'adapter for request independent URL generation. ' - 'You might be able to fix this by setting ' - 'the SERVER_NAME config variable.') + raise RuntimeError( + 'Application was not able to create a URL adapter for request' + ' independent URL generation. You might be able to fix this by' + ' setting the SERVER_NAME config variable.' + ) + external = values.pop('_external', True) anchor = values.pop('_anchor', None) diff --git a/flask/wrappers.py b/flask/wrappers.py index 918b0a93..4dde5f3c 100644 --- a/flask/wrappers.py +++ b/flask/wrappers.py @@ -141,10 +141,6 @@ class Request(RequestBase, JSONMixin): #: something similar. routing_exception = None - # Switched by the request context until 1.0 to opt in deprecated - # module functionality. - _is_old_module = False - @property def max_content_length(self): """Read-only view of the ``MAX_CONTENT_LENGTH`` config key.""" @@ -161,19 +157,6 @@ class Request(RequestBase, JSONMixin): if self.url_rule is not None: return self.url_rule.endpoint - @property - def module(self): - """The name of the current module if the request was dispatched - to an actual module. This is deprecated functionality, use blueprints - instead. - """ - from warnings import warn - warn(DeprecationWarning('modules were deprecated in favor of ' - 'blueprints. Use request.blueprint ' - 'instead.'), stacklevel=2) - if self._is_old_module: - return self.blueprint - @property def blueprint(self): """The name of the current blueprint""" diff --git a/tests/test_basic.py b/tests/test_basic.py index d24678c2..be097eb9 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1353,19 +1353,6 @@ def test_static_files(app, client): rv.close() -def test_static_path_deprecated(recwarn): - app = flask.Flask(__name__, static_path='/foo') - recwarn.pop(DeprecationWarning) - - app.testing = True - rv = app.test_client().get('/foo/index.html') - assert rv.status_code == 200 - rv.close() - - with app.test_request_context(): - assert flask.url_for('static', filename='index.html') == '/foo/index.html' - - def test_static_url_path(): app = flask.Flask(__name__, static_url_path='/foo') app.testing = True diff --git a/tests/test_deprecations.py b/tests/test_deprecations.py index 6ab63dd4..5dfff127 100644 --- a/tests/test_deprecations.py +++ b/tests/test_deprecations.py @@ -9,8 +9,6 @@ :license: BSD, see LICENSE for more details. """ -import pytest - import flask @@ -26,14 +24,3 @@ class TestRequestDeprecation(object): client.post('/', data='{"spam": 42}', content_type='application/json') recwarn.pop(DeprecationWarning) - - def test_request_module(self, recwarn, app, client): - """Request.module is deprecated""" - - @app.route('/') - def index(): - assert flask.request.module is None - return 'OK' - - client.get('/') - recwarn.pop(DeprecationWarning)