Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock
Please consider unblocking of flask 0.12.1-1. This upstream bugfix release fixies this 4 upstream bugs: - Prevent `flask run` from showing a NoAppException when an ImportError occurs within the imported application module. - Fix encoding behavior of ``app.config.from_pyfile`` for Python 3. Fix ``#2118``. - Use the ``SERVER_NAME`` config if it is present as default values for ``app.run``. ``#2109``, ``#2152`` - Call `ctx.auto_pop` with the exception object instead of `None`, in the event that a `BaseException` such as `KeyboardInterrupt` is raised in a request handler. And fix unreproducibility build, which is simple fix in docs building. Debdiff attached. Thanks. unblock flask/0.12.1-1 -- System Information: Debian Release: 9.0 APT prefers unstable APT policy: (500, 'unstable'), (500, 'testing'), (500, 'stable'), (1, 'experimental') Architecture: amd64 (x86_64) Kernel: Linux 4.9.0-2-amd64 (SMP w/2 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system)
diff -Nru flask-0.12/CHANGES flask-0.12.1/CHANGES --- flask-0.12/CHANGES 2016-12-21 21:19:09.000000000 +0100 +++ flask-0.12.1/CHANGES 2017-03-31 18:43:21.000000000 +0200 @@ -3,6 +3,31 @@ Here you can see the full list of changes between each Flask release. +Version 0.13 +------------ + +Major release, unreleased + +- Make `app.run()` into a noop if a Flask application is run from the + development server on the command line. This avoids some behavior that + was confusing to debug for newcomers. +- Change default configuration `JSONIFY_PRETTYPRINT_REGULAR=False`. jsonify() + method returns compressed response by default, and pretty response in + debug mode. + +Version 0.12.1 +-------------- + +Bugfix release, released on March 31st 2017 + +- Prevent `flask run` from showing a NoAppException when an ImportError occurs + within the imported application module. +- Fix encoding behavior of ``app.config.from_pyfile`` for Python 3. Fix + ``#2118``. +- Call `ctx.auto_pop` with the exception object instead of `None`, in the + event that a `BaseException` such as `KeyboardInterrupt` is raised in a + request handler. + Version 0.12 ------------ diff -Nru flask-0.12/debian/changelog flask-0.12.1/debian/changelog --- flask-0.12/debian/changelog 2016-12-25 16:01:11.000000000 +0100 +++ flask-0.12.1/debian/changelog 2017-01-13 10:48:48.000000000 +0100 @@ -1,3 +1,10 @@ +flask (0.12.1-1) UNRELEASED; urgency=medium + + * New upstream bugfix release + * Use SOURCE_DATE_EPOCH for copyright year to make build reproducible + + -- Ondřej Nový <on...@debian.org> Fri, 13 Jan 2017 10:48:48 +0100 + flask (0.12-1) unstable; urgency=medium * New upstream release diff -Nru flask-0.12/debian/.git-dpm flask-0.12.1/debian/.git-dpm --- flask-0.12/debian/.git-dpm 2016-12-25 14:58:29.000000000 +0100 +++ flask-0.12.1/debian/.git-dpm 2017-01-13 10:48:48.000000000 +0100 @@ -1,11 +1,11 @@ # see git-dpm(1) from git-dpm package -5219a1a4a282c1277f9c6b1cd4324e8c2d7b95f7 -5219a1a4a282c1277f9c6b1cd4324e8c2d7b95f7 -5219a1a4a282c1277f9c6b1cd4324e8c2d7b95f7 -5219a1a4a282c1277f9c6b1cd4324e8c2d7b95f7 -flask_0.12.orig.tar.gz -73722d79e479d5f6b09bbb7b746c34a99b81b05c -531923 +02ae596d3b6eb5e3c4fe1d938dbd86cee32f5b52 +02ae596d3b6eb5e3c4fe1d938dbd86cee32f5b52 +e2758a2dfc6ebddb68ccdfd8d3fa4cdd1a5ff03e +e2758a2dfc6ebddb68ccdfd8d3fa4cdd1a5ff03e +flask_0.12.1.orig.tar.gz +b32d88f36f7a7d262eb6a336b4f0736cfa2a4252 +548511 debianTag="debian/%e%v" patchedTag="patched/%e%v" upstreamTag="upstream/%e%u" diff -Nru flask-0.12/debian/patches/0001-Use-SOURCE_DATE_EPOCH-for-copyright-year-to-make-bui.patch flask-0.12.1/debian/patches/0001-Use-SOURCE_DATE_EPOCH-for-copyright-year-to-make-bui.patch --- flask-0.12/debian/patches/0001-Use-SOURCE_DATE_EPOCH-for-copyright-year-to-make-bui.patch 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/debian/patches/0001-Use-SOURCE_DATE_EPOCH-for-copyright-year-to-make-bui.patch 2017-01-13 10:48:48.000000000 +0100 @@ -0,0 +1,37 @@ +From 02ae596d3b6eb5e3c4fe1d938dbd86cee32f5b52 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ond=C5=99ej=20Nov=C3=BD?= <on...@debian.org> +Date: Fri, 13 Jan 2017 10:46:21 +0100 +Subject: Use SOURCE_DATE_EPOCH for copyright year to make build reproducible + +--- + docs/conf.py | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/docs/conf.py b/docs/conf.py +index b37427a..81106a3 100644 +--- a/docs/conf.py ++++ b/docs/conf.py +@@ -11,10 +11,13 @@ + # All configuration values have a default; values that are commented out + # serve to show the default. + from __future__ import print_function +-from datetime import datetime + import os + import sys + import pkg_resources ++import time ++import datetime ++ ++BUILD_DATE = datetime.datetime.utcfromtimestamp(int(os.environ.get('SOURCE_DATE_EPOCH', time.time()))) + + # If extensions (or modules to document with autodoc) are in another directory, + # add these directories to sys.path here. If the directory is relative to the +@@ -49,7 +52,7 @@ master_doc = 'index' + + # General information about the project. + project = u'Flask' +-copyright = u'2010 - {0}, Armin Ronacher'.format(datetime.utcnow().year) ++copyright = u'2010 - {0}, Armin Ronacher'.format(BUILD_DATE.year) + + # The version info for the project you're documenting, acts as replacement for + # |version| and |release|, also used in various other places throughout the diff -Nru flask-0.12/debian/patches/series flask-0.12.1/debian/patches/series --- flask-0.12/debian/patches/series 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/debian/patches/series 2017-01-13 10:48:48.000000000 +0100 @@ -0,0 +1 @@ +0001-Use-SOURCE_DATE_EPOCH-for-copyright-year-to-make-bui.patch diff -Nru flask-0.12/examples/flaskr/flaskr.egg-info/dependency_links.txt flask-0.12.1/examples/flaskr/flaskr.egg-info/dependency_links.txt --- flask-0.12/examples/flaskr/flaskr.egg-info/dependency_links.txt 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/flaskr/flaskr.egg-info/dependency_links.txt 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1 @@ + diff -Nru flask-0.12/examples/flaskr/flaskr.egg-info/PKG-INFO flask-0.12.1/examples/flaskr/flaskr.egg-info/PKG-INFO --- flask-0.12/examples/flaskr/flaskr.egg-info/PKG-INFO 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/flaskr/flaskr.egg-info/PKG-INFO 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: flaskr +Version: 0.0.0 +Summary: UNKNOWN +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff -Nru flask-0.12/examples/flaskr/flaskr.egg-info/requires.txt flask-0.12.1/examples/flaskr/flaskr.egg-info/requires.txt --- flask-0.12/examples/flaskr/flaskr.egg-info/requires.txt 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/flaskr/flaskr.egg-info/requires.txt 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1 @@ +flask \ No newline at end of file diff -Nru flask-0.12/examples/flaskr/flaskr.egg-info/SOURCES.txt flask-0.12.1/examples/flaskr/flaskr.egg-info/SOURCES.txt --- flask-0.12/examples/flaskr/flaskr.egg-info/SOURCES.txt 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/flaskr/flaskr.egg-info/SOURCES.txt 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1,15 @@ +MANIFEST.in +README +setup.cfg +flaskr/__init__.py +flaskr/flaskr.py +flaskr/schema.sql +flaskr.egg-info/PKG-INFO +flaskr.egg-info/SOURCES.txt +flaskr.egg-info/dependency_links.txt +flaskr.egg-info/requires.txt +flaskr.egg-info/top_level.txt +flaskr/static/style.css +flaskr/templates/layout.html +flaskr/templates/login.html +flaskr/templates/show_entries.html \ No newline at end of file diff -Nru flask-0.12/examples/flaskr/flaskr.egg-info/top_level.txt flask-0.12.1/examples/flaskr/flaskr.egg-info/top_level.txt --- flask-0.12/examples/flaskr/flaskr.egg-info/top_level.txt 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/flaskr/flaskr.egg-info/top_level.txt 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1 @@ +flaskr Binary files /tmp/74RgGT8Xd9/flask-0.12/examples/flaskr/pytest_runner-2.11.1-py2.7.egg and /tmp/fjgyHT1Am1/flask-0.12.1/examples/flaskr/pytest_runner-2.11.1-py2.7.egg differ diff -Nru flask-0.12/examples/minitwit/minitwit.egg-info/dependency_links.txt flask-0.12.1/examples/minitwit/minitwit.egg-info/dependency_links.txt --- flask-0.12/examples/minitwit/minitwit.egg-info/dependency_links.txt 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/minitwit/minitwit.egg-info/dependency_links.txt 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1 @@ + diff -Nru flask-0.12/examples/minitwit/minitwit.egg-info/PKG-INFO flask-0.12.1/examples/minitwit/minitwit.egg-info/PKG-INFO --- flask-0.12/examples/minitwit/minitwit.egg-info/PKG-INFO 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/minitwit/minitwit.egg-info/PKG-INFO 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: minitwit +Version: 0.0.0 +Summary: UNKNOWN +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff -Nru flask-0.12/examples/minitwit/minitwit.egg-info/requires.txt flask-0.12.1/examples/minitwit/minitwit.egg-info/requires.txt --- flask-0.12/examples/minitwit/minitwit.egg-info/requires.txt 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/minitwit/minitwit.egg-info/requires.txt 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1 @@ +flask \ No newline at end of file diff -Nru flask-0.12/examples/minitwit/minitwit.egg-info/SOURCES.txt flask-0.12.1/examples/minitwit/minitwit.egg-info/SOURCES.txt --- flask-0.12/examples/minitwit/minitwit.egg-info/SOURCES.txt 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/minitwit/minitwit.egg-info/SOURCES.txt 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1,16 @@ +MANIFEST.in +README +setup.cfg +minitwit/__init__.py +minitwit/minitwit.py +minitwit/schema.sql +minitwit.egg-info/PKG-INFO +minitwit.egg-info/SOURCES.txt +minitwit.egg-info/dependency_links.txt +minitwit.egg-info/requires.txt +minitwit.egg-info/top_level.txt +minitwit/static/style.css +minitwit/templates/layout.html +minitwit/templates/login.html +minitwit/templates/register.html +minitwit/templates/timeline.html \ No newline at end of file diff -Nru flask-0.12/examples/minitwit/minitwit.egg-info/top_level.txt flask-0.12.1/examples/minitwit/minitwit.egg-info/top_level.txt --- flask-0.12/examples/minitwit/minitwit.egg-info/top_level.txt 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/examples/minitwit/minitwit.egg-info/top_level.txt 2017-03-31 18:42:53.000000000 +0200 @@ -0,0 +1 @@ +minitwit diff -Nru flask-0.12/flask/app.py flask-0.12.1/flask/app.py --- flask-0.12/flask/app.py 2016-12-11 18:24:34.000000000 +0100 +++ flask-0.12.1/flask/app.py 2017-03-31 18:40:55.000000000 +0200 @@ -1983,6 +1983,9 @@ except Exception as e: error = e response = self.handle_exception(e) + except: + error = sys.exc_info()[1] + raise return response(environ, start_response) finally: if self.should_ignore_error(error): diff -Nru flask-0.12/flask/cli.py flask-0.12.1/flask/cli.py --- flask-0.12/flask/cli.py 2016-12-11 18:24:34.000000000 +0100 +++ flask-0.12.1/flask/cli.py 2017-03-31 18:40:46.000000000 +0200 @@ -89,10 +89,16 @@ try: __import__(module) except ImportError: - raise NoAppException('The file/path provided (%s) does not appear to ' - 'exist. Please verify the path is correct. If ' - 'app is not on PYTHONPATH, ensure the extension ' - 'is .py' % module) + # Reraise the ImportError if it occurred within the imported module. + # Determine this by checking whether the trace has a depth > 1. + if sys.exc_info()[-1].tb_next: + raise + else: + raise NoAppException('The file/path provided (%s) does not appear' + ' to exist. Please verify the path is ' + 'correct. If app is not on PYTHONPATH, ' + 'ensure the extension is .py' % module) + mod = sys.modules[module] if app_obj is None: app = find_best_app(mod) diff -Nru flask-0.12/flask/config.py flask-0.12.1/flask/config.py --- flask-0.12/flask/config.py 2016-12-11 18:24:34.000000000 +0100 +++ flask-0.12.1/flask/config.py 2017-02-10 12:20:32.000000000 +0100 @@ -126,7 +126,7 @@ d = types.ModuleType('config') d.__file__ = filename try: - with open(filename) as config_file: + with open(filename, mode='rb') as config_file: exec(compile(config_file.read(), filename, 'exec'), d.__dict__) except IOError as e: if silent and e.errno in (errno.ENOENT, errno.EISDIR): diff -Nru flask-0.12/flask/__init__.py flask-0.12.1/flask/__init__.py --- flask-0.12/flask/__init__.py 2016-12-21 21:22:08.000000000 +0100 +++ flask-0.12.1/flask/__init__.py 2017-03-31 18:43:36.000000000 +0200 @@ -10,7 +10,7 @@ :license: BSD, see LICENSE for more details. """ -__version__ = '0.12' +__version__ = '0.12.1' # utilities we import from Werkzeug and Jinja2 that are unused # in the module but are exported as public interface. diff -Nru flask-0.12/Flask.egg-info/PKG-INFO flask-0.12.1/Flask.egg-info/PKG-INFO --- flask-0.12/Flask.egg-info/PKG-INFO 2016-12-21 21:22:09.000000000 +0100 +++ flask-0.12.1/Flask.egg-info/PKG-INFO 2017-03-31 18:43:36.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Flask -Version: 0.12 +Version: 0.12.1 Summary: A microframework based on Werkzeug, Jinja2 and good intentions Home-page: http://github.com/pallets/flask/ Author: Armin Ronacher diff -Nru flask-0.12/Flask.egg-info/requires.txt flask-0.12.1/Flask.egg-info/requires.txt --- flask-0.12/Flask.egg-info/requires.txt 2016-12-21 21:22:09.000000000 +0100 +++ flask-0.12.1/Flask.egg-info/requires.txt 2017-03-31 18:43:36.000000000 +0200 @@ -1,4 +1,4 @@ Werkzeug>=0.7 Jinja2>=2.4 itsdangerous>=0.21 -click>=2.0 +click>=2.0 \ No newline at end of file diff -Nru flask-0.12/Flask.egg-info/SOURCES.txt flask-0.12.1/Flask.egg-info/SOURCES.txt --- flask-0.12/Flask.egg-info/SOURCES.txt 2016-12-21 21:22:09.000000000 +0100 +++ flask-0.12.1/Flask.egg-info/SOURCES.txt 2017-03-31 18:43:36.000000000 +0200 @@ -122,11 +122,17 @@ examples/flaskr/.gitignore examples/flaskr/MANIFEST.in examples/flaskr/README +examples/flaskr/pytest_runner-2.11.1-py2.7.egg examples/flaskr/setup.cfg examples/flaskr/setup.py examples/flaskr/flaskr/__init__.py examples/flaskr/flaskr/flaskr.py examples/flaskr/flaskr/schema.sql +examples/flaskr/flaskr.egg-info/PKG-INFO +examples/flaskr/flaskr.egg-info/SOURCES.txt +examples/flaskr/flaskr.egg-info/dependency_links.txt +examples/flaskr/flaskr.egg-info/requires.txt +examples/flaskr/flaskr.egg-info/top_level.txt examples/flaskr/flaskr/static/style.css examples/flaskr/flaskr/templates/layout.html examples/flaskr/flaskr/templates/login.html @@ -143,6 +149,11 @@ examples/minitwit/minitwit/__init__.py examples/minitwit/minitwit/minitwit.py examples/minitwit/minitwit/schema.sql +examples/minitwit/minitwit.egg-info/PKG-INFO +examples/minitwit/minitwit.egg-info/SOURCES.txt +examples/minitwit/minitwit.egg-info/dependency_links.txt +examples/minitwit/minitwit.egg-info/requires.txt +examples/minitwit/minitwit.egg-info/top_level.txt examples/minitwit/minitwit/static/style.css examples/minitwit/minitwit/templates/layout.html examples/minitwit/minitwit/templates/login.html @@ -209,6 +220,7 @@ tests/test_apps/blueprintapp/apps/frontend/templates/frontend/index.html tests/test_apps/cliapp/__init__.py tests/test_apps/cliapp/app.py +tests/test_apps/cliapp/importerrorapp.py tests/test_apps/cliapp/multiapp.py tests/test_apps/subdomaintestmodule/__init__.py tests/test_apps/subdomaintestmodule/static/hello.txt \ No newline at end of file diff -Nru flask-0.12/PKG-INFO flask-0.12.1/PKG-INFO --- flask-0.12/PKG-INFO 2016-12-21 21:22:09.000000000 +0100 +++ flask-0.12.1/PKG-INFO 2017-03-31 18:43:37.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: Flask -Version: 0.12 +Version: 0.12.1 Summary: A microframework based on Werkzeug, Jinja2 and good intentions Home-page: http://github.com/pallets/flask/ Author: Armin Ronacher diff -Nru flask-0.12/tests/test_apps/cliapp/importerrorapp.py flask-0.12.1/tests/test_apps/cliapp/importerrorapp.py --- flask-0.12/tests/test_apps/cliapp/importerrorapp.py 1970-01-01 01:00:00.000000000 +0100 +++ flask-0.12.1/tests/test_apps/cliapp/importerrorapp.py 2017-02-10 12:20:32.000000000 +0100 @@ -0,0 +1,7 @@ +from __future__ import absolute_import, print_function + +from flask import Flask + +raise ImportError() + +testapp = Flask('testapp') diff -Nru flask-0.12/tests/test_basic.py flask-0.12.1/tests/test_basic.py --- flask-0.12/tests/test_basic.py 2016-12-11 18:24:34.000000000 +0100 +++ flask-0.12.1/tests/test_basic.py 2017-03-31 18:40:55.000000000 +0200 @@ -791,6 +791,23 @@ assert resp.data == b'internal server error' +def test_baseexception_error_handling(): + app = flask.Flask(__name__) + app.config['LOGGER_HANDLER_POLICY'] = 'never' + + @app.route('/') + def broken_func(): + raise KeyboardInterrupt() + + with app.test_client() as c: + with pytest.raises(KeyboardInterrupt): + c.get('/') + + ctx = flask._request_ctx_stack.top + assert ctx.preserved + assert type(ctx._preserved_exc) is KeyboardInterrupt + + def test_before_request_and_routing_errors(): app = flask.Flask(__name__) diff -Nru flask-0.12/tests/test_cli.py flask-0.12.1/tests/test_cli.py --- flask-0.12/tests/test_cli.py 2016-12-11 18:24:34.000000000 +0100 +++ flask-0.12.1/tests/test_cli.py 2017-03-31 18:40:46.000000000 +0200 @@ -83,6 +83,7 @@ pytest.raises(NoAppException, locate_app, "notanpp.py") pytest.raises(NoAppException, locate_app, "cliapp/app") pytest.raises(RuntimeError, locate_app, "cliapp.app:notanapp") + pytest.raises(ImportError, locate_app, "cliapp.importerrorapp") def test_find_default_import_path(test_apps, monkeypatch, tmpdir): diff -Nru flask-0.12/tests/test_config.py flask-0.12.1/tests/test_config.py --- flask-0.12/tests/test_config.py 2016-12-11 18:24:34.000000000 +0100 +++ flask-0.12.1/tests/test_config.py 2017-02-10 12:20:32.000000000 +0100 @@ -7,11 +7,14 @@ :license: BSD, see LICENSE for more details. """ -import pytest -import os from datetime import timedelta +import os +import textwrap + import flask +from flask._compat import PY2 +import pytest # config keys used for the TestConfig @@ -187,3 +190,18 @@ assert 2 == len(bar_options) assert 'bar stuff 1' == bar_options['BAR_STUFF_1'] assert 'bar stuff 2' == bar_options['BAR_STUFF_2'] + + +@pytest.mark.parametrize('encoding', ['utf-8', 'iso-8859-15', 'latin-1']) +def test_from_pyfile_weird_encoding(tmpdir, encoding): + f = tmpdir.join('my_config.py') + f.write_binary(textwrap.dedent(u''' + # -*- coding: {0} -*- + TEST_VALUE = "föö" + '''.format(encoding)).encode(encoding)) + app = flask.Flask(__name__) + app.config.from_pyfile(str(f)) + value = app.config['TEST_VALUE'] + if PY2: + value = value.decode(encoding) + assert value == u'föö'