1515from six import string_types , itervalues , iteritems , iterkeys
1616
1717from flask import current_app
18- from werkzeug .routing import parse_rule
1918
2019from . import fields
2120from .model import Model , ModelBase , OrderedModel
3635 "default" : "string" ,
3736}
3837
39-
4038#: Maps Python primitives types to Swagger ones
4139PY_TYPES = {
4240 int : "integer" ,
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
5972def 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+
77120def extract_path_params (path ):
78121 """
79122 Extract Flask-style parameters from an URL pattern as Swagger ones.
0 commit comments