def preload_state(state: Dict[str, Any], routes: routing.RoutesConfig) -> None: components = get_preloaded_components(routes) for component in components: builder = getattr(component, 'build') pipeline = pipelines.build_pipeline(function=builder, initial_types=[App]) pipelines.run_pipeline(pipeline, state)
def __init__(self, routes: List[Route]): required_type = wsgi.WSGIResponse initial_types = [wsgi.WSGIEnviron, URLPathArgs] rules = [] views = {} for (path, method, view) in routes: view_signature = inspect.signature(view) uritemplate = URITemplate(path) # Ensure view arguments include all URL arguments for arg in uritemplate.variable_names: assert arg in view_signature.parameters, ( 'URL argument "%s" in path "%s" must be included as a ' 'keyword argument in the view function "%s"' % (arg, path, view.__name__)) # Create a werkzeug path string werkzeug_path = path[:] for arg in uritemplate.variable_names: param = view_signature.parameters[arg] if param.annotation == inspect.Signature.empty: annotated_type = str else: annotated_type = param.annotation converter = self.converters[annotated_type] werkzeug_path = werkzeug_path.replace( '{%s}' % arg, '<%s:%s>' % (converter, arg)) # Create a werkzeug routing rule name = view.__name__ rule = Rule(werkzeug_path, methods=[method], endpoint=name) rules.append(rule) # Determine any inferred type annotations for the view extra_annotations = {} for param in view_signature.parameters.values(): if param.annotation == inspect.Signature.empty: annotated_type = str else: annotated_type = param.annotation if param.name in uritemplate.variable_names: class TypedURLPathArg(URLPathArg): schema = annotated_type extra_annotations[param.name] = TypedURLPathArg elif (annotated_type in primitive_types) or issubclass( annotated_type, schema_types): class TypedQueryParam(http.QueryParam): schema = annotated_type extra_annotations[param.name] = TypedQueryParam if 'return' not in view.__annotations__: extra_annotations['return'] = http.ResponseData # Determine the pipeline for the view. pipeline = pipelines.build_pipeline(view, initial_types, required_type, extra_annotations) views[name] = Endpoint(view, pipeline) # Add pipelines for 404 and 405 cases. pipeline = pipelines.build_pipeline(view_404, initial_types, required_type, {}) self.not_found = (None, pipeline, {}) pipeline = pipelines.build_pipeline(view_405, initial_types, required_type, {}) self.method_not_allowed = (None, pipeline, {}) self.routes = routes self.adapter = Map(rules).bind('example.com') self.views = views
def __init__(self, routes: RoutesConfig, initial_types: List[type] = None) -> None: required_type = wsgi.WSGIResponse initial_types = initial_types or [] initial_types += [wsgi.WSGIEnviron, URLPathArgs, Exception] rules = [] views = {} for (path, method, view) in walk(routes): view_signature = inspect.signature(view) uritemplate = URITemplate(path) # Ensure view arguments include all URL arguments for arg in uritemplate.variable_names: assert arg in view_signature.parameters, ( 'URL argument "%s" in path "%s" must be included as a ' 'keyword argument in the view function "%s"' % (arg, path, view.__name__)) # Create a werkzeug path string werkzeug_path = path[:] for arg in uritemplate.variable_names: param = view_signature.parameters[arg] if param.annotation is inspect.Signature.empty: converter = 'string' elif issubclass(param.annotation, (schema.String, str)): if getattr(param.annotation, 'format', None) == 'path': converter = 'path' else: converter = 'string' elif issubclass(param.annotation, (schema.Number, float)): converter = 'float' elif issubclass(param.annotation, (schema.Integer, int)): converter = 'int' else: msg = 'Invalid type for path parameter, %s.' % param.annotation raise exceptions.ConfigurationError(msg) werkzeug_path = werkzeug_path.replace( '{%s}' % arg, '<%s:%s>' % (converter, arg)) # Create a werkzeug routing rule name = view.__name__ rule = Rule(werkzeug_path, methods=[method], endpoint=name) rules.append(rule) # Determine any inferred type annotations for the view extra_annotations = {} # type: Dict[str, type] for param in view_signature.parameters.values(): if param.annotation is inspect.Signature.empty: annotated_type = str else: annotated_type = param.annotation if param.name in uritemplate.variable_names: class TypedURLPathArg(URLPathArg): schema = annotated_type extra_annotations[param.name] = TypedURLPathArg elif (annotated_type in primitive_types) or issubclass( annotated_type, schema_types): if method in ('POST', 'PUT', 'PATCH'): if issubclass(annotated_type, schema.Object): class TypedDataParam(http.RequestData): schema = annotated_type extra_annotations[param.name] = TypedDataParam else: class TypedFieldParam(http.RequestField): schema = annotated_type extra_annotations[param.name] = TypedFieldParam else: class TypedQueryParam(http.QueryParam): schema = annotated_type extra_annotations[param.name] = TypedQueryParam return_annotation = view_signature.return_annotation if return_annotation is inspect.Signature.empty: extra_annotations['return'] = http.ResponseData elif issubclass( return_annotation, (schema_types, primitive_types, typing_types)): # type: ignore extra_annotations['return'] = http.ResponseData # Determine the pipeline for the view. pipeline = pipelines.build_pipeline(view, initial_types, required_type, extra_annotations) views[name] = Endpoint(view, pipeline) self.exception_pipeline = pipelines.build_pipeline( exception_handler, initial_types, required_type, {}) self.routes = routes self.adapter = Map(rules).bind('example.com') self.views = views