コード例 #1
0
 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
コード例 #2
0
 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')
コード例 #3
0
 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}"')
コード例 #4
0
 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)
コード例 #5
0
    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})
コード例 #6
0
 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}"')
コード例 #7
0
 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}"')
コード例 #8
0
    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
        })
コード例 #9
0
 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}"')
コード例 #10
0
 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}"')
コード例 #11
0
    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)
コード例 #12
0
 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)
コード例 #13
0
 def __call__(self, request, response, *args, **kwargs):
     db: Database = context.get('app.database')
     with db:
         return self.handler(request, response, *args, **kwargs)
コード例 #14
0
 def __getattr__(self, attr):
     return getattr(context.get('app.database'), attr)