aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-python/flask-restx/files/flask-restx-fix-flask-compat.patch')
-rw-r--r--dev-python/flask-restx/files/flask-restx-fix-flask-compat.patch147
1 files changed, 147 insertions, 0 deletions
diff --git a/dev-python/flask-restx/files/flask-restx-fix-flask-compat.patch b/dev-python/flask-restx/files/flask-restx-fix-flask-compat.patch
new file mode 100644
index 000000000..759bb5f63
--- /dev/null
+++ b/dev-python/flask-restx/files/flask-restx-fix-flask-compat.patch
@@ -0,0 +1,147 @@
+diff --git a/flask_restx/api.py b/flask_restx/api.py
+index 5996dd59..bd0413dd 100644
+--- a/flask_restx/api.py
++++ b/flask_restx/api.py
+@@ -14,10 +14,6 @@
+ from flask import url_for, request, current_app
+ from flask import make_response as original_flask_make_response
+
+-try:
+- from flask.helpers import _endpoint_from_view_func
+-except ImportError:
+- from flask.scaffold import _endpoint_from_view_func
+ from flask.signals import got_request_exception
+
+ from jsonschema import RefResolver
+@@ -45,10 +41,13 @@
+ from .postman import PostmanCollectionV1
+ from .resource import Resource
+ from .swagger import Swagger
+-from .utils import default_id, camel_to_dash, unpack
++from .utils import default_id, camel_to_dash, unpack, import_check_view_func
+ from .representations import output_json
+ from ._http import HTTPStatus
+
++endpoint_from_view_func = import_check_view_func()
++
++
+ RE_RULES = re.compile("(<.*>)")
+
+ # List headers that should never be handled by Flask-RESTX
+@@ -850,7 +849,7 @@ def _blueprint_setup_add_url_rule_patch(
+ rule = blueprint_setup.url_prefix + rule
+ options.setdefault("subdomain", blueprint_setup.subdomain)
+ if endpoint is None:
+- endpoint = _endpoint_from_view_func(view_func)
++ endpoint = endpoint_from_view_func(view_func)
+ defaults = blueprint_setup.url_defaults
+ if "defaults" in options:
+ defaults = dict(defaults, **options.pop("defaults"))
+diff --git a/flask_restx/utils.py b/flask_restx/utils.py
+index 809a29b3..35dec2ae 100644
+--- a/flask_restx/utils.py
++++ b/flask_restx/utils.py
+@@ -1,4 +1,6 @@
+ import re
++import warnings
++import typing
+
+ from collections import OrderedDict
+ from copy import deepcopy
+@@ -20,6 +22,10 @@
+ )
+
+
++class FlaskCompatibilityWarning(DeprecationWarning):
++ pass
++
++
+ def merge(first, second):
+ """
+ Recursively merges two dictionaries.
+@@ -118,3 +124,43 @@ def unpack(response, default_code=HTTPStatus.OK):
+ return data, code or default_code, headers
+ else:
+ raise ValueError("Too many response values")
++
++
++def to_view_name(view_func: typing.Callable) -> str:
++ """Helper that returns the default endpoint for a given
++ function. This always is the function name.
++
++ Note: copy of simple flask internal helper
++ """
++ assert view_func is not None, "expected view func if endpoint is not provided."
++ return view_func.__name__
++
++
++def import_check_view_func():
++ """
++ Resolve import flask _endpoint_from_view_func.
++
++ Show warning if function cannot be found and provide copy of last known implementation.
++
++ Note: This helper method exists because reoccurring problem with flask function, but
++ actual method body remaining the same in each flask version.
++ """
++ import importlib.metadata
++
++ flask_version = importlib.metadata.version("flask").split(".")
++ try:
++ if flask_version[0] == "1":
++ from flask.helpers import _endpoint_from_view_func
++ elif flask_version[0] == "2":
++ from flask.scaffold import _endpoint_from_view_func
++ elif flask_version[0] == "3":
++ from flask.sansio.scaffold import _endpoint_from_view_func
++ else:
++ warnings.simplefilter("once", FlaskCompatibilityWarning)
++ _endpoint_from_view_func = None
++ except ImportError:
++ warnings.simplefilter("once", FlaskCompatibilityWarning)
++ _endpoint_from_view_func = None
++ if _endpoint_from_view_func is None:
++ _endpoint_from_view_func = to_view_name
++ return _endpoint_from_view_func
+diff --git a/tests/test_utils.py b/tests/test_utils.py
+index d98d68d0..fe3a1adb 100644
+--- a/tests/test_utils.py
++++ b/tests/test_utils.py
+@@ -98,3 +98,14 @@ def test_value_headers_default_code(self):
+ def test_too_many_values(self):
+ with pytest.raises(ValueError):
+ utils.unpack((None, None, None, None))
++
++
++class ToViewNameTest(object):
++ def test_none(self):
++ with pytest.raises(AssertionError):
++ _ = utils.to_view_name(None)
++
++
++class ImportCheckViewFuncTest(object):
++ def test_callable(self):
++ assert callable(utils.import_check_view_func())
+
+From 13ac54e4ba513c01ec8e4a23b4e88b7b555cf2f1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Trval?= <trval@kajot.cz>
+Date: Fri, 6 Oct 2023 15:46:13 +0200
+Subject: [PATCH 2/2] modify: include new import_check_view_func in
+ utils.__all__ to keep nice static checks
+
+---
+ flask_restx/utils.py | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/flask_restx/utils.py b/flask_restx/utils.py
+index 35dec2ae..367527a5 100644
+--- a/flask_restx/utils.py
++++ b/flask_restx/utils.py
+@@ -19,6 +19,7 @@
+ "not_none",
+ "not_none_sorted",
+ "unpack",
++ "import_check_view_func",
+ )
+
+