forked from orbit-oss/flask
remove more compat code
This commit is contained in:
parent
662c245795
commit
57d628ca74
9 changed files with 37 additions and 89 deletions
|
|
@ -721,12 +721,8 @@ class CertParamType(click.ParamType):
|
||||||
|
|
||||||
obj = import_string(value, silent=True)
|
obj = import_string(value, silent=True)
|
||||||
|
|
||||||
if sys.version_info < (2, 7, 9):
|
if isinstance(obj, ssl.SSLContext):
|
||||||
if obj:
|
return obj
|
||||||
return obj
|
|
||||||
else:
|
|
||||||
if isinstance(obj, ssl.SSLContext):
|
|
||||||
return obj
|
|
||||||
|
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -221,8 +221,6 @@ class AppContext(object):
|
||||||
def push(self):
|
def push(self):
|
||||||
"""Binds the app context to the current context."""
|
"""Binds the app context to the current context."""
|
||||||
self._refcnt += 1
|
self._refcnt += 1
|
||||||
if hasattr(sys, "exc_clear"):
|
|
||||||
sys.exc_clear()
|
|
||||||
_app_ctx_stack.push(self)
|
_app_ctx_stack.push(self)
|
||||||
appcontext_pushed.send(self.app)
|
appcontext_pushed.send(self.app)
|
||||||
|
|
||||||
|
|
@ -371,9 +369,6 @@ class RequestContext(object):
|
||||||
else:
|
else:
|
||||||
self._implicit_app_ctx_stack.append(None)
|
self._implicit_app_ctx_stack.append(None)
|
||||||
|
|
||||||
if hasattr(sys, "exc_clear"):
|
|
||||||
sys.exc_clear()
|
|
||||||
|
|
||||||
_request_ctx_stack.push(self)
|
_request_ctx_stack.push(self)
|
||||||
|
|
||||||
# Open the session at the moment that the request context is available.
|
# Open the session at the moment that the request context is available.
|
||||||
|
|
@ -399,9 +394,9 @@ class RequestContext(object):
|
||||||
Added the `exc` argument.
|
Added the `exc` argument.
|
||||||
"""
|
"""
|
||||||
app_ctx = self._implicit_app_ctx_stack.pop()
|
app_ctx = self._implicit_app_ctx_stack.pop()
|
||||||
|
clear_request = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
clear_request = False
|
|
||||||
if not self._implicit_app_ctx_stack:
|
if not self._implicit_app_ctx_stack:
|
||||||
self.preserved = False
|
self.preserved = False
|
||||||
self._preserved_exc = None
|
self._preserved_exc = None
|
||||||
|
|
@ -409,13 +404,6 @@ class RequestContext(object):
|
||||||
exc = sys.exc_info()[1]
|
exc = sys.exc_info()[1]
|
||||||
self.app.do_teardown_request(exc)
|
self.app.do_teardown_request(exc)
|
||||||
|
|
||||||
# If this interpreter supports clearing the exception information
|
|
||||||
# we do that now. This will only go into effect on Python 2.x,
|
|
||||||
# on 3.x it disappears automatically at the end of the exception
|
|
||||||
# stack.
|
|
||||||
if hasattr(sys, "exc_clear"):
|
|
||||||
sys.exc_clear()
|
|
||||||
|
|
||||||
request_close = getattr(self.request, "close", None)
|
request_close = getattr(self.request, "close", None)
|
||||||
if request_close is not None:
|
if request_close is not None:
|
||||||
request_close()
|
request_close()
|
||||||
|
|
|
||||||
|
|
@ -634,11 +634,7 @@ def send_file(
|
||||||
mtime = os.path.getmtime(filename)
|
mtime = os.path.getmtime(filename)
|
||||||
fsize = os.path.getsize(filename)
|
fsize = os.path.getsize(filename)
|
||||||
elif isinstance(file, io.BytesIO):
|
elif isinstance(file, io.BytesIO):
|
||||||
try:
|
fsize = file.getbuffer().nbytes
|
||||||
fsize = file.getbuffer().nbytes
|
|
||||||
except AttributeError:
|
|
||||||
# Python 2 doesn't have getbuffer
|
|
||||||
fsize = len(file.getvalue())
|
|
||||||
elif isinstance(file, io.TextIOBase):
|
elif isinstance(file, io.TextIOBase):
|
||||||
raise ValueError("Files must be opened in binary mode or use BytesIO.")
|
raise ValueError("Files must be opened in binary mode or use BytesIO.")
|
||||||
|
|
||||||
|
|
@ -799,8 +795,6 @@ def get_root_path(import_name):
|
||||||
if loader is None or import_name == "__main__":
|
if loader is None or import_name == "__main__":
|
||||||
return os.getcwd()
|
return os.getcwd()
|
||||||
|
|
||||||
# For .egg, zipimporter does not have get_filename until Python 2.7.
|
|
||||||
# Some other loaders might exhibit the same behavior.
|
|
||||||
if hasattr(loader, "get_filename"):
|
if hasattr(loader, "get_filename"):
|
||||||
filepath = loader.get_filename(import_name)
|
filepath = loader.get_filename(import_name)
|
||||||
else:
|
else:
|
||||||
|
|
@ -857,30 +851,29 @@ def _matching_loader_thinks_module_is_package(loader, mod_name):
|
||||||
|
|
||||||
def _find_package_path(root_mod_name):
|
def _find_package_path(root_mod_name):
|
||||||
"""Find the path where the module's root exists in"""
|
"""Find the path where the module's root exists in"""
|
||||||
if sys.version_info >= (3, 4):
|
import importlib.util
|
||||||
import importlib.util
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
spec = importlib.util.find_spec(root_mod_name)
|
spec = importlib.util.find_spec(root_mod_name)
|
||||||
if spec is None:
|
if spec is None:
|
||||||
raise ValueError("not found")
|
raise ValueError("not found")
|
||||||
# ImportError: the machinery told us it does not exist
|
# ImportError: the machinery told us it does not exist
|
||||||
# ValueError:
|
# ValueError:
|
||||||
# - the module name was invalid
|
# - the module name was invalid
|
||||||
# - the module name is __main__
|
# - the module name is __main__
|
||||||
# - *we* raised `ValueError` due to `spec` being `None`
|
# - *we* raised `ValueError` due to `spec` being `None`
|
||||||
except (ImportError, ValueError):
|
except (ImportError, ValueError):
|
||||||
pass # handled below
|
pass # handled below
|
||||||
|
else:
|
||||||
|
# namespace package
|
||||||
|
if spec.origin in {"namespace", None}:
|
||||||
|
return os.path.dirname(next(iter(spec.submodule_search_locations)))
|
||||||
|
# a package (with __init__.py)
|
||||||
|
elif spec.submodule_search_locations:
|
||||||
|
return os.path.dirname(os.path.dirname(spec.origin))
|
||||||
|
# just a normal module
|
||||||
else:
|
else:
|
||||||
# namespace package
|
return os.path.dirname(spec.origin)
|
||||||
if spec.origin in {"namespace", None}:
|
|
||||||
return os.path.dirname(next(iter(spec.submodule_search_locations)))
|
|
||||||
# a package (with __init__.py)
|
|
||||||
elif spec.submodule_search_locations:
|
|
||||||
return os.path.dirname(os.path.dirname(spec.origin))
|
|
||||||
# just a normal module
|
|
||||||
else:
|
|
||||||
return os.path.dirname(spec.origin)
|
|
||||||
|
|
||||||
# we were unable to find the `package_path` using PEP 451 loaders
|
# we were unable to find the `package_path` using PEP 451 loaders
|
||||||
loader = pkgutil.get_loader(root_mod_name)
|
loader = pkgutil.get_loader(root_mod_name)
|
||||||
|
|
@ -888,7 +881,6 @@ def _find_package_path(root_mod_name):
|
||||||
# import name is not found, or interactive/main module
|
# import name is not found, or interactive/main module
|
||||||
return os.getcwd()
|
return os.getcwd()
|
||||||
else:
|
else:
|
||||||
# For .egg, zipimporter does not have get_filename until Python 2.7.
|
|
||||||
if hasattr(loader, "get_filename"):
|
if hasattr(loader, "get_filename"):
|
||||||
filename = loader.get_filename(root_mod_name)
|
filename = loader.get_filename(root_mod_name)
|
||||||
elif hasattr(loader, "archive"):
|
elif hasattr(loader, "archive"):
|
||||||
|
|
|
||||||
|
|
@ -91,12 +91,7 @@ def test_provide_automatic_options_kwarg(app, client):
|
||||||
assert rv.status_code == 405
|
assert rv.status_code == 405
|
||||||
assert sorted(rv.allow) == ["GET", "HEAD"]
|
assert sorted(rv.allow) == ["GET", "HEAD"]
|
||||||
|
|
||||||
# Older versions of Werkzeug.test.Client don't have an options method
|
rv = client.open("/", method="OPTIONS")
|
||||||
if hasattr(client, "options"):
|
|
||||||
rv = client.options("/")
|
|
||||||
else:
|
|
||||||
rv = client.open("/", method="OPTIONS")
|
|
||||||
|
|
||||||
assert rv.status_code == 405
|
assert rv.status_code == 405
|
||||||
|
|
||||||
rv = client.head("/")
|
rv = client.head("/")
|
||||||
|
|
@ -109,11 +104,7 @@ def test_provide_automatic_options_kwarg(app, client):
|
||||||
assert rv.status_code == 405
|
assert rv.status_code == 405
|
||||||
assert sorted(rv.allow) == ["GET", "HEAD", "POST"]
|
assert sorted(rv.allow) == ["GET", "HEAD", "POST"]
|
||||||
|
|
||||||
if hasattr(client, "options"):
|
rv = client.open("/more", method="OPTIONS")
|
||||||
rv = client.options("/more")
|
|
||||||
else:
|
|
||||||
rv = client.open("/more", method="OPTIONS")
|
|
||||||
|
|
||||||
assert rv.status_code == 405
|
assert rv.status_code == 405
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -589,16 +589,11 @@ def test_run_cert_import(monkeypatch):
|
||||||
with pytest.raises(click.BadParameter):
|
with pytest.raises(click.BadParameter):
|
||||||
run_command.make_context("run", ["--cert", "not_here"])
|
run_command.make_context("run", ["--cert", "not_here"])
|
||||||
|
|
||||||
# not an SSLContext
|
with pytest.raises(click.BadParameter):
|
||||||
if sys.version_info >= (2, 7, 9):
|
run_command.make_context("run", ["--cert", "flask"])
|
||||||
with pytest.raises(click.BadParameter):
|
|
||||||
run_command.make_context("run", ["--cert", "flask"])
|
|
||||||
|
|
||||||
# SSLContext
|
# SSLContext
|
||||||
if sys.version_info < (2, 7, 9):
|
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
|
||||||
ssl_context = object()
|
|
||||||
else:
|
|
||||||
ssl_context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
|
|
||||||
|
|
||||||
monkeypatch.setitem(sys.modules, "ssl_context", ssl_context)
|
monkeypatch.setitem(sys.modules, "ssl_context", ssl_context)
|
||||||
ctx = run_command.make_context("run", ["--cert", "ssl_context"])
|
ctx = run_command.make_context("run", ["--cert", "ssl_context"])
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,6 @@ class TestJSON(object):
|
||||||
)
|
)
|
||||||
def test_detect_encoding(self, value, encoding):
|
def test_detect_encoding(self, value, encoding):
|
||||||
data = json.dumps(value).encode(encoding)
|
data = json.dumps(value).encode(encoding)
|
||||||
assert json.detect_encoding(data) == encoding
|
|
||||||
assert json.loads(data) == value
|
assert json.loads(data) == value
|
||||||
|
|
||||||
@pytest.mark.parametrize("debug", (True, False))
|
@pytest.mark.parametrize("debug", (True, False))
|
||||||
|
|
@ -679,8 +678,6 @@ class TestSendfile(object):
|
||||||
"%C3%91and%C3%BA%EF%BC%8Fping%C3%BCino.txt",
|
"%C3%91and%C3%BA%EF%BC%8Fping%C3%BCino.txt",
|
||||||
),
|
),
|
||||||
(u"Vögel.txt", "Vogel.txt", "V%C3%B6gel.txt"),
|
(u"Vögel.txt", "Vogel.txt", "V%C3%B6gel.txt"),
|
||||||
# Native string not marked as Unicode on Python 2
|
|
||||||
("tést.txt", "test.txt", "t%C3%A9st.txt"),
|
|
||||||
# ":/" are not safe in filename* value
|
# ":/" are not safe in filename* value
|
||||||
(u"те:/ст", '":/"', "%D1%82%D0%B5%3A%2F%D1%81%D1%82"),
|
(u"те:/ст", '":/"', "%D1%82%D0%B5%3A%2F%D1%81%D1%82"),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
:license: BSD-3-Clause
|
:license: BSD-3-Clause
|
||||||
"""
|
"""
|
||||||
import gc
|
import gc
|
||||||
import sys
|
import platform
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
@ -44,6 +44,7 @@ class assert_no_leak(object):
|
||||||
gc.enable()
|
gc.enable()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(platform.python_implementation() == "PyPy", reason="CPython only")
|
||||||
def test_memory_consumption():
|
def test_memory_consumption():
|
||||||
app = flask.Flask(__name__)
|
app = flask.Flask(__name__)
|
||||||
|
|
||||||
|
|
@ -60,11 +61,9 @@ def test_memory_consumption():
|
||||||
# Trigger caches
|
# Trigger caches
|
||||||
fire()
|
fire()
|
||||||
|
|
||||||
# This test only works on CPython 2.7.
|
with assert_no_leak():
|
||||||
if sys.version_info >= (2, 7) and not hasattr(sys, "pypy_translation_info"):
|
for _x in range(10):
|
||||||
with assert_no_leak():
|
fire()
|
||||||
for _x in range(10):
|
|
||||||
fire()
|
|
||||||
|
|
||||||
|
|
||||||
def test_safe_join_toplevel_pardir():
|
def test_safe_join_toplevel_pardir():
|
||||||
|
|
|
||||||
|
|
@ -285,10 +285,6 @@ def test_session_dynamic_cookie_name():
|
||||||
def test_bad_environ_raises_bad_request():
|
def test_bad_environ_raises_bad_request():
|
||||||
app = flask.Flask(__name__)
|
app = flask.Flask(__name__)
|
||||||
|
|
||||||
# We cannot use app.test_client() for the Unicode-rich Host header,
|
|
||||||
# because werkzeug enforces latin1 on Python 2.
|
|
||||||
# However it works when actually passed to the server.
|
|
||||||
|
|
||||||
from flask.testing import EnvironBuilder
|
from flask.testing import EnvironBuilder
|
||||||
|
|
||||||
builder = EnvironBuilder(app)
|
builder = EnvironBuilder(app)
|
||||||
|
|
@ -309,10 +305,6 @@ def test_environ_for_valid_idna_completes():
|
||||||
def index():
|
def index():
|
||||||
return "Hello World!"
|
return "Hello World!"
|
||||||
|
|
||||||
# We cannot use app.test_client() for the Unicode-rich Host header,
|
|
||||||
# because werkzeug enforces latin1 on Python 2.
|
|
||||||
# However it works when actually passed to the server.
|
|
||||||
|
|
||||||
from flask.testing import EnvironBuilder
|
from flask.testing import EnvironBuilder
|
||||||
|
|
||||||
builder = EnvironBuilder(app)
|
builder = EnvironBuilder(app)
|
||||||
|
|
|
||||||
|
|
@ -169,12 +169,10 @@ def test_redirect_keep_session(app, client, app_ctx):
|
||||||
rv = client.get("/")
|
rv = client.get("/")
|
||||||
assert rv.data == b"index"
|
assert rv.data == b"index"
|
||||||
assert flask.session.get("data") == "foo"
|
assert flask.session.get("data") == "foo"
|
||||||
|
|
||||||
rv = client.post("/", data={}, follow_redirects=True)
|
rv = client.post("/", data={}, follow_redirects=True)
|
||||||
assert rv.data == b"foo"
|
assert rv.data == b"foo"
|
||||||
|
assert flask.session.get("data") == "foo"
|
||||||
# This support requires a new Werkzeug version
|
|
||||||
if not hasattr(client, "redirect_client"):
|
|
||||||
assert flask.session.get("data") == "foo"
|
|
||||||
|
|
||||||
rv = client.get("/getsession")
|
rv = client.get("/getsession")
|
||||||
assert rv.data == b"foo"
|
assert rv.data == b"foo"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue