diff --git a/CHANGES.rst b/CHANGES.rst index a383f3f4..930fd7e8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -20,6 +20,8 @@ Unreleased (`#3059`_) - :func:`send_file` supports :class:`~io.BytesIO` partial content. (`#2957`_) +- :func:`open_resource` accepts the "rt" file mode. This still does + the same thing as "r". (:issue:`3163`) .. _#2935: https://github.com/pallets/flask/issues/2935 .. _#2957: https://github.com/pallets/flask/issues/2957 diff --git a/docs/conf.py b/docs/conf.py index f494ea8d..e263d01a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,6 +18,7 @@ extensions = [ "sphinx.ext.intersphinx", "sphinxcontrib.log_cabinet", "pallets_sphinx_themes", + "sphinx_issues", ] intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), @@ -29,6 +30,7 @@ intersphinx_mapping = { "wtforms": ("https://wtforms.readthedocs.io/en/stable/", None), "blinker": ("https://pythonhosted.org/blinker/", None), } +issues_github_path = "pallets/flask" # HTML ----------------------------------------------------------------- diff --git a/docs/requirements.txt b/docs/requirements.txt index e667deaa..6443d592 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,4 @@ Sphinx~=1.8.0 Pallets-Sphinx-Themes~=1.1.0 sphinxcontrib-log-cabinet~=1.0.0 +sphinx-issues~=1.2.0 diff --git a/flask/helpers.py b/flask/helpers.py index 19cb4c99..c5e85a02 100644 --- a/flask/helpers.py +++ b/flask/helpers.py @@ -1053,10 +1053,12 @@ class _PackageBoundObject(object): :param resource: the name of the resource. To access resources within subfolders use forward slashes as separator. - :param mode: resource file opening mode, default is 'rb'. + :param mode: Open file in this mode. Only reading is supported, + valid values are "r" (or "rt") and "rb". """ - if mode not in ("r", "rb"): + if mode not in {"r", "rt", "rb"}: raise ValueError("Resources can only be opened for reading") + return open(os.path.join(self.root_path, resource), mode) diff --git a/tests/test_helpers.py b/tests/test_helpers.py index d65a5f5e..cddc7517 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -1014,6 +1014,7 @@ class TestSafeJoin(object): print(flask.safe_join(*args)) + class TestHelpers(object): @pytest.mark.parametrize( "debug, expected_flag, expected_default_flag", @@ -1060,3 +1061,17 @@ class TestHelpers(object): assert rv.status_code == 200 assert rv.data == b"Hello" assert rv.mimetype == "text/html" + + @pytest.mark.parametrize("mode", ("r", "rb", "rt")) + def test_open_resource(self, mode): + app = flask.Flask(__name__) + + with app.open_resource("static/index.html", mode) as f: + assert "

Hello World!

" in str(f.read()) + + @pytest.mark.parametrize("mode", ("w", "x", "a", "r+")) + def test_open_resource_exceptions(self, mode): + app = flask.Flask(__name__) + + with pytest.raises(ValueError): + app.open_resource("static/index.html", mode)