Skip to content

Commit 8a536cf

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 8a536cf

File tree

1 file changed

+46
-2
lines changed

1 file changed

+46
-2
lines changed

flask_restx/swagger.py

+46-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",
@@ -74,6 +72,52 @@ def extract_path(path):
7472
return RE_URL.sub(r"{\1}", path)
7573

7674

75+
RE_PARSE_RULE = re.compile(
76+
r"""
77+
(?P<static>[^<]*) # static rule data
78+
<
79+
(?:
80+
(?P<converter>[a-zA-Z_][a-zA-Z0-9_]*) # converter name
81+
(?:\((?P<args>.*?)\))? # converter arguments
82+
\: # variable delimiter
83+
)?
84+
(?P<variable>[a-zA-Z_][a-zA-Z0-9_]*) # variable name
85+
>
86+
""",
87+
re.VERBOSE,
88+
)
89+
90+
91+
def parse_rule(rule):
92+
"""
93+
This originally lived in werkzeug.routing.parse_rule until it was removed in werkzeug 2.2.0. Copying it here to
94+
avoid depending on the older version of werkzeug.
95+
"""
96+
pos = 0
97+
end = len(rule)
98+
do_match = RE_PARSE_RULE.match
99+
used_names = set()
100+
while pos < end:
101+
m = do_match(rule, pos)
102+
if m is None:
103+
break
104+
data = m.groupdict()
105+
if data["static"]:
106+
yield None, None, data["static"]
107+
variable = data["variable"]
108+
converter = data["converter"] or "default"
109+
if variable in used_names:
110+
raise ValueError(f"variable name {variable!r} used twice.")
111+
used_names.add(variable)
112+
yield converter, data["args"] or None, variable
113+
pos = m.end()
114+
if pos < end:
115+
remaining = rule[pos:]
116+
if ">" in remaining or "<" in remaining:
117+
raise ValueError(f"malformed url rule: {rule!r}")
118+
yield None, None, remaining
119+
120+
77121
def extract_path_params(path):
78122
"""
79123
Extract Flask-style parameters from an URL pattern as Swagger ones.

0 commit comments

Comments
 (0)