From 8c442470946b3fe57e8cbd43ae1fb822f0f0f62e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Trval?= Date: Fri, 6 Oct 2023 15:28:26 +0200 Subject: [PATCH 1/3] fix: BaseResponse import - replace wekzeug old style import dunder version by importlib (#573) --- flask_restx/api.py | 9 +-------- flask_restx/resource.py | 7 +------ flask_restx/utils.py | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/flask_restx/api.py b/flask_restx/api.py index 5996dd59..89a8a8ce 100644 --- a/flask_restx/api.py +++ b/flask_restx/api.py @@ -32,20 +32,13 @@ InternalServerError, ) -from werkzeug import __version__ as werkzeug_version - -if werkzeug_version.split(".")[0] >= "2": - from werkzeug.wrappers import Response as BaseResponse -else: - from werkzeug.wrappers import BaseResponse - from . import apidoc from .mask import ParseError, MaskError from .namespace import Namespace 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, BaseResponse from .representations import output_json from ._http import HTTPStatus diff --git a/flask_restx/resource.py b/flask_restx/resource.py index dd23d0b5..c7dc5eaf 100644 --- a/flask_restx/resource.py +++ b/flask_restx/resource.py @@ -1,15 +1,10 @@ from flask import request from flask.views import MethodView -from werkzeug import __version__ as werkzeug_version -if werkzeug_version.split(".")[0] >= "2": - from werkzeug.wrappers import Response as BaseResponse -else: - from werkzeug.wrappers import BaseResponse from .model import ModelBase -from .utils import unpack +from .utils import unpack, BaseResponse class Resource(MethodView): diff --git a/flask_restx/utils.py b/flask_restx/utils.py index 809a29b3..400bc44f 100644 --- a/flask_restx/utils.py +++ b/flask_restx/utils.py @@ -17,9 +17,29 @@ "not_none", "not_none_sorted", "unpack", + "BaseResponse", ) +def import_werkzeug_response(): + """Resolve `werkzeug` `Response` class import because + `BaseResponse` was renamed in version 2.* to `Response`""" + import importlib.metadata + + werkzeug_major = int(importlib.metadata.version("werkzeug").split()[0]) + if werkzeug_major < 2: + from werkzeug.wrappers import BaseResponse + + return BaseResponse + + from werkzeug.wrappers import Response + + return Response + + +BaseResponse = import_werkzeug_response() + + def merge(first, second): """ Recursively merges two dictionaries. From 5b876147c467b1740470848e580ba2717d21485d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Trval?= Date: Fri, 6 Oct 2023 16:15:07 +0200 Subject: [PATCH 2/3] add: import_werkzeug_response test --- tests/test_utils.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/test_utils.py b/tests/test_utils.py index d98d68d0..3ab1e9f0 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -47,6 +47,11 @@ def test_recursions_with_empty(self): assert utils.merge(a, b) == b +class UnpackImportResponse(object): + def test_import_werkzeug_response(self): + assert utils.import_werkzeug_response() != None + + class CamelToDashTestCase(object): def test_no_transform(self): assert utils.camel_to_dash("test") == "test" From 84b893de22725afca10a9cf0d8238cc445997379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Trval?= Date: Fri, 6 Oct 2023 16:21:25 +0200 Subject: [PATCH 3/3] modify: changelog - note fix (#573) --- CHANGELOG.rst | 1 + flask_restx/utils.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 73eea75a..a1d93bdb 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -35,6 +35,7 @@ Bug Fixes :: * Fixing test as HTTP Header MIMEAccept expects quality-factor number in form of `X.X` (#547) [chipndell] + * Fixing werkzeug 3 deprecated version import. Import is replaced by new style version check with importlib (#573) [Ryu-CZ] .. _enhancements-1.2.0: diff --git a/flask_restx/utils.py b/flask_restx/utils.py index 400bc44f..f0c68e8f 100644 --- a/flask_restx/utils.py +++ b/flask_restx/utils.py @@ -26,7 +26,7 @@ def import_werkzeug_response(): `BaseResponse` was renamed in version 2.* to `Response`""" import importlib.metadata - werkzeug_major = int(importlib.metadata.version("werkzeug").split()[0]) + werkzeug_major = int(importlib.metadata.version("werkzeug").split(".")[0]) if werkzeug_major < 2: from werkzeug.wrappers import BaseResponse