def entities(self) -> Dict[str, Type[Model]]: if self._entities is None: self._entities = { resource_name: context.get(resource) for resource_name, resource in context.get( 'groups.models').items() } return self._entities
def create_tables(self): print('starting connection') database = context.get('app.database') print('creating tables') self._dispatch_event('tables', 'before_create', database) database.create_tables([context.get(model) for model in context.get('groups.models').values()]) self._dispatch_event('tables', 'after_create', database) print('tables successfully created')
def rel_model(self): try: return self._rel_model if self._rel_model == 'self' else context.get( self._rel_model) except RecursionError as e: raise Exception( f'entity declaration are recursive "{self._rel_model}"')
def router(self) -> Registrable: routes = [] for module in context.get('app.modules') or []: router = getattr(import_module(module), 'router', None) if router is not None: routes.append(router) return Router(registrable_list=routes)
def _dispatch_event(self, event_name: str, obj: Union[T, Model]): if not context.has('app.listener'): return listener = context.get('app.listener') listener.dispatch(f'{self.resource_name}.{event_name}', {"target": obj})
def manager(self, klz: Type[T]) -> Manager[T]: for r_name, r_class in self.entities.items(): if r_class == klz: manager_class = Manager if context.has(f'app.manager.{r_name}.class'): manager_class = context.get(f'app.manager.{r_name}.class') return manager_class(r_name, r_class) raise ValueError(f'Not registered entity class "{klz}"')
def manager(self, resource_name: str) -> Manager: for r_name, r_class in self.entities.items(): if r_name == resource_name: manager_class = Manager if context.has(f'app.manager.{r_name}.class'): manager_class = context.get(f'app.manager.{r_name}.class') return manager_class(r_name, r_class) raise ValueError(f'Invalid resource name "{resource_name}"')
def _dispatch_event(self, resource: str, event_name: str, database): if not context.has('app.listener'): return listener = context.get('app.listener') listener.dispatch(f'{resource}.{event_name}', { "target": database })
def repository(self, klz: Type[T]) -> Repository[T]: for r_name, r_class in self.entities.items(): if r_class == klz: repository_class = Repository if context.has(f'app.repository.{r_name}.class'): repository_class = context.get( f'app.repository.{r_name}.class') return repository_class(r_name, r_class) raise ValueError(f'Not registered entity class "{klz}"')
def repository(self, resource_name: str) -> Repository: for r_name, r_class in self.entities.items(): if r_name == resource_name: repository_class = Repository if context.has(f'app.repository.{r_name}.class'): repository_class = context.get( f'app.repository.{r_name}.class') return repository_class(r_name, r_class) raise ValueError(f'Invalid resource name "{resource_name}"')
def register(self, app: Bottle): request_middleware: List[Type[Callable]] = [ context.get(item) for item in context.get('groups.request_middleware').values() ] paths = self.path if isinstance(self.path, list) else [self.path] for path in paths: @app.route(path=path, method=self.methods) def wrapper(*args, **kwargs): controller_class = self.controller.resolve(context) controller = controller_class( **Parameter.resolve_value(self.parameters, context)) handler = getattr(controller, self.handler) for middleware_class in reversed(self.middleware): handler = middleware_class(handler) for middleware_class in reversed(request_middleware): handler = middleware_class(handler) return handler(request, response, *args, **kwargs)
def __call__(self, request: Request, response: Response, *args, **kwargs): request_containers = [] request_context = Context.new_from( context=context.get('context'), runtime={ "request": request, "response": response }, container=StackContainer(request_containers)) with request_context: if request_context.has('app.container.request'): request_containers.append( request_context.get('app.container.request')) return super().__call__(request, response, *args, **kwargs)
def __call__(self, request, response, *args, **kwargs): db: Database = context.get('app.database') with db: return self.handler(request, response, *args, **kwargs)
def __getattr__(self, attr): return getattr(context.get('app.database'), attr)