Skip to content

Commit 82f7340

Browse files
committed
Fix #460 - missing parse_rule method
This method was removed from the public API in werkzeug 2.2.0. Copying it into this project because the method is self-contained.
1 parent 88497ce commit 82f7340

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

flask_restx/swagger.py

+45-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from six import string_types, itervalues, iteritems, iterkeys
1616

1717
from flask import current_app
18-
from werkzeug.routing import parse_rule
1918

2019
from . import fields
2120
from .model import Model, ModelBase, OrderedModel
@@ -36,7 +35,6 @@
3635
"default": "string",
3736
}
3837

39-
4038
#: Maps Python primitives types to Swagger ones
4139
PY_TYPES = {
4240
int: "integer",
@@ -55,6 +53,21 @@
5553
r"^:raises\s+(?P<name>[\w\d_]+)\s*:\s*(?P<description>.*)$", re.MULTILINE
5654
)
5755

56+
RE_PARSE_RULE = re.compile(
57+
r"""
58+
(?P<static>[^<]*) # static rule data
59+
<
60+
(?:
61+
(?P<converter>[a-zA-Z_][a-zA-Z0-9_]*) # converter name
62+
(?:\((?P<args>.*?)\))? # converter arguments
63+
\: # variable delimiter
64+
)?
65+
(?P<variable>[a-zA-Z_][a-zA-Z0-9_]*) # variable name
66+
>
67+
""",
68+
re.VERBOSE,
69+
)
70+
5871

5972
def ref(model):
6073
"""Return a reference to model in definitions"""
@@ -74,6 +87,36 @@ def extract_path(path):
7487
return RE_URL.sub(r"{\1}", path)
7588

7689

90+
def parse_rule(rule):
91+
"""
92+
This originally lived in werkzeug.routing.parse_rule until it was removed in werkzeug 2.2.0. Copying it here to
93+
avoid depending on the older version of werkzeug.
94+
"""
95+
pos = 0
96+
end = len(rule)
97+
do_match = RE_PARSE_RULE.match
98+
used_names = set()
99+
while pos < end:
100+
m = do_match(rule, pos)
101+
if m is None:
102+
break
103+
data = m.groupdict()
104+
if data["static"]:
105+
yield None, None, data["static"]
106+
variable = data["variable"]
107+
converter = data["converter"] or "default"
108+
if variable in used_names:
109+
raise ValueError(f"variable name {variable!r} used twice.")
110+
used_names.add(variable)
111+
yield converter, data["args"] or None, variable
112+
pos = m.end()
113+
if pos < end:
114+
remaining = rule[pos:]
115+
if ">" in remaining or "<" in remaining:
116+
raise ValueError(f"malformed url rule: {rule!r}")
117+
yield None, None, remaining
118+
119+
77120
def extract_path_params(path):
78121
"""
79122
Extract Flask-style parameters from an URL pattern as Swagger ones.

0 commit comments

Comments
 (0)