|
15 | 15 | from six import string_types, itervalues, iteritems, iterkeys
|
16 | 16 |
|
17 | 17 | from flask import current_app
|
18 |
| -from werkzeug.routing import parse_rule |
19 | 18 |
|
20 | 19 | from . import fields
|
21 | 20 | from .model import Model, ModelBase, OrderedModel
|
|
36 | 35 | "default": "string",
|
37 | 36 | }
|
38 | 37 |
|
39 |
| - |
40 | 38 | #: Maps Python primitives types to Swagger ones
|
41 | 39 | PY_TYPES = {
|
42 | 40 | int: "integer",
|
@@ -74,6 +72,52 @@ def extract_path(path):
|
74 | 72 | return RE_URL.sub(r"{\1}", path)
|
75 | 73 |
|
76 | 74 |
|
| 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 | + |
77 | 121 | def extract_path_params(path):
|
78 | 122 | """
|
79 | 123 | Extract Flask-style parameters from an URL pattern as Swagger ones.
|
|
0 commit comments