def test_add_route_override_name(mock_api_app_config, mock_api_spec, mock_plugin_config): # noqa: F811 _init_api(mock_api_app_config, mock_api_spec, plugin=mock_plugin_config, init_server=True, init_apps=True, init_swagger=True) route = app_route_name( mock_api_app_config.app, event_name='mock-app-api-get', override_route_name='mock-app-api/test/mock-app-api') handler = api.add_route('get', route, _test_handler_get) assert isinstance(handler.args[0], SwaggerRoute) assert handler.args[0].path == route handler = api.add_route('post', route, _test_handler_post) assert isinstance(handler.args[0], SwaggerRoute) assert handler.args[0].path == route assert api.spec['paths']['/api/mock-app-api/test/mock-app-api'].keys() == { 'get', 'post' } route = app_route_name(mock_api_app_config.app, event_name='mock-app-noapi') handler = api.add_route('get', route, _test_handler_get) assert handler is _test_handler_get
def _create_event_management_routes( app_engine: AppEngine, *, event_name: str, event_info: EventDescriptor) -> List[web.RouteDef]: """ Create routes to start and stop processing of STREAM events """ app = app_engine.app_config.app base_route = app_route_name(app_engine.app_config.app, event_name=event_name, prefix='mgmt', override_route_name=event_info.route) logger.info( __name__, f"{event_info.type.value.upper()} path={base_route}/[start|stop]") handler: Optional[partial[Coroutine[Any, Any, Response]]] = None if event_info.type == EventType.STREAM: handler = partial(_handle_stream_start_invocation, app_engine, event_name) elif event_info.type == EventType.SERVICE: handler = partial(_handle_service_start_invocation, app_engine, event_name) assert handler is not None, f"No handler for event={event_name} type={event_info.type}" return [ web.get( route_name('mgmt', app.name, app.version, event_name.replace('.', '/'), 'start'), handler), web.get( route_name('mgmt', app.name, app.version, event_name.replace('.', '/'), 'stop'), partial(_handle_event_stop_invocation, app_engine, event_name)) ]
def test_add_route_auto_name(mock_api_app_config, mock_api_spec, mock_plugin_config): # noqa: F811 _init_api(mock_api_app_config, mock_api_spec, plugin=mock_plugin_config, init_server=True, init_apps=True, init_swagger=True) route = app_route_name(mock_api_app_config.app, event_name='mock-app-api-get-list') handler = api.add_route('get', route, _test_handler_get) assert isinstance(handler.args[0], SwaggerRoute) route = app_route_name(mock_api_app_config.app, event_name='mock-app-noapi') handler = api.add_route('get', route, _test_handler_get) assert handler is _test_handler_get
def api_from_config(module, *, app_config: AppConfig, event_name: str, plugin: Optional[AppConfig]) -> dict: """ Uses api definition exactly as it comes from --api-file specified at runtime. Usage in app event implementation file:: __api__ = api_from_config Notice that no arguments need to be provided (just the function) as the function will be invoked during server initialization. """ assert spec is not None plugin_app = None if plugin is None else plugin.app override_route_name = app_config.events[event_name].route route = app_route_name(app_config.app, event_name=event_name, plugin=plugin_app, override_route_name=override_route_name) method = app_config.events[event_name].type.value.lower() event_spec = spec['paths'].get(route) if event_spec is None: raise APIError( f"Missing API Config for app={app_config.app.app_key()} event={event_name}" ) method_spec = event_spec.get(method) if method_spec is None: raise APIError( f"Missing method={method} for app={app_config.app.app_key()} event={event_name}" ) return event_spec[method]
def test_api_disabled(mock_api_app_config): # noqa: F811 api.clear() api.register_server_config(mock_api_app_config.server) assert api.spec is None apps = [mock_api_app_config] app = web.Application() api.register_apps(apps) api.enable_swagger(mock_api_app_config.server, app) assert api.spec is None route = app_route_name(mock_api_app_config.app, event_name='mock-app-api-get') handler = api.add_route('get', route, _test_handler_get) assert handler is _test_handler_get route = app_route_name(mock_api_app_config.app, event_name='mock-app-noapi') handler = api.add_route('get', route, _test_handler_get) assert handler is _test_handler_get
def _get_route(self, event_name: str): """ Builds the route to an event endpoint based on app + plugin configs. Overrides in case app_connection settins specifies so. """ app_descriptor = AppDescriptor(name=self.app_connection.name, version=self.app_connection.version) plugin_descriptor = None if self.app_connection.plugin_name: plugin_descriptor = AppDescriptor( name=self.app_connection.plugin_name, version=self.app_connection.plugin_version or self.app_connection.version) return app_route_name( app_descriptor, event_name=event_name, plugin=plugin_descriptor, override_route_name=self.settings.routes_override.get(event_name))
def _create_get_event_route(app_engine: AppEngine, *, plugin: Optional[AppEngine] = None, event_name: str, event_info: EventDescriptor) -> web.RouteDef: """ Creates route for handling GET requests """ route = app_route_name( app_engine.app_config.app, event_name=event_name, plugin=None if plugin is None else plugin.app_config.app, override_route_name=event_info.route) logger.info(__name__, f"GET path={route}") impl = plugin if plugin else app_engine handler = partial(_handle_get_invocation, app_engine, impl, event_name, _auth_types(impl, event_name)) setattr(handler, '__closure__', None) setattr(handler, '__code__', _handle_get_invocation.__code__) api_handler = api.add_route('get', route, handler) return web.get(route, api_handler)
def _create_multipart_event_route( app_engine: AppEngine, *, plugin: Optional[AppEngine] = None, event_name: str, override_route_name: Optional[str]) -> web.RouteDef: """ Creates route for handling MULTIPART event """ datatype = find_datatype_handler(app_config=app_engine.app_config, event_name=event_name) route = app_route_name( app_engine.app_config.app, event_name=event_name, plugin=None if plugin is None else plugin.app_config.app, override_route_name=override_route_name) logger.info(__name__, f"MULTIPART path={route} input={str(datatype)}") impl = plugin if plugin else app_engine handler = partial(_handle_multipart_invocation, app_engine, impl, event_name, datatype, _auth_types(impl, event_name)) setattr(handler, '__closure__', None) setattr(handler, '__code__', _handle_multipart_invocation.__code__) api_handler = api.add_route('post', route, handler) return web.post(route, api_handler)