MCPcopy Create free account
hub / github.com/encode/starlette / compile_path

Function compile_path

starlette/routing.py:111–166  ·  view source on GitHub ↗

Given a path string, like: "/{username:str}", or a host string, like: "{subdomain}.mydomain.org", return a three-tuple of (regex, format, {param_name:convertor}). regex: "/(?P [^/]+)" format: "/{username}" convertors: {"username": StringConvertor()}

(
    path: str,
)

Source from the content-addressed store, hash-verified

109
110
111def compile_path(
112 path: str,
113) -> tuple[Pattern[str], str, dict[str, Convertor[Any]]]:
114 """
115 Given a path string, like: "/{username:str}",
116 or a host string, like: "{subdomain}.mydomain.org", return a three-tuple
117 of (regex, format, {param_name:convertor}).
118
119 regex: "/(?P<username>[^/]+)"
120 format: "/{username}"
121 convertors: {"username": StringConvertor()}
122 """
123 is_host = not path.startswith("/")
124
125 path_regex = "^"
126 path_format = ""
127 duplicated_params: set[str] = set()
128
129 idx = 0
130 param_convertors = {}
131 for match in PARAM_REGEX.finditer(path):
132 param_name, convertor_type = match.groups("str")
133 convertor_type = convertor_type.lstrip(":")
134 assert convertor_type in CONVERTOR_TYPES, f"Unknown path convertor '{convertor_type}'"
135 convertor = CONVERTOR_TYPES[convertor_type]
136
137 path_regex += re.escape(path[idx : match.start()])
138 path_regex += f"(?P<{param_name}>{convertor.regex})"
139
140 path_format += path[idx : match.start()]
141 path_format += "{%s}" % param_name
142
143 if param_name in param_convertors:
144 duplicated_params.add(param_name)
145
146 param_convertors[param_name] = convertor
147
148 idx = match.end()
149
150 if duplicated_params:
151 names = ", ".join(sorted(duplicated_params))
152 ending = "s" if len(duplicated_params) > 1 else ""
153 raise ValueError(f"Duplicated param name{ending} {names} at path {path}")
154
155 if is_host:
156 # Align with `Host.matches()` behavior, which ignores port.
157 hostname = path[idx:]
158 if not hostname.endswith("]"):
159 hostname = hostname.rsplit(":", 1)[0]
160 path_regex += re.escape(hostname) + "$"
161 else:
162 path_regex += re.escape(path[idx:]) + "$"
163
164 path_format += path[idx:]
165
166 return re.compile(path_regex), path_format, param_convertors
167
168

Callers 4

__init__Method · 0.85
__init__Method · 0.85
__init__Method · 0.85
__init__Method · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected