zrb 1.0.0b8__tar.gz → 1.0.0b9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {zrb-1.0.0b8 → zrb-1.0.0b9}/PKG-INFO +2 -1
- {zrb-1.0.0b8 → zrb-1.0.0b9}/pyproject.toml +2 -1
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/__main__.py +3 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_task.py +1 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +1 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service.py +5 -5
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +1 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +8 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +9 -2
- zrb-1.0.0b8/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py → zrb-1.0.0b9/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task_util.py +11 -49
- zrb-1.0.0b9/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +58 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +27 -11
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +32 -27
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +15 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +22 -5
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +21 -0
- zrb-1.0.0b9/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +202 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +3 -4
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +15 -14
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +4 -4
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +24 -5
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +14 -12
- zrb-1.0.0b9/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +246 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +28 -11
- zrb-1.0.0b9/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +344 -0
- zrb-1.0.0b9/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +35 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +27 -2
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +2 -1
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +1 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +13 -12
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +55 -12
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/cmd_task.py +2 -5
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/cmd/command.py +39 -48
- zrb-1.0.0b8/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +0 -160
- zrb-1.0.0b8/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +0 -212
- zrb-1.0.0b8/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +0 -137
- zrb-1.0.0b8/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +0 -7
- zrb-1.0.0b8/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/session.py +0 -48
- {zrb-1.0.0b8 → zrb-1.0.0b9}/README.md +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/attr/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/attr/type.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/base64.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/git.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/git_subtree.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/group.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/llm/llm_chat.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/llm/previous-session.js +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/llm/tool/api.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/llm/tool/cli.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/llm/tool/rag.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/llm/tool/web.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/md5.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.flake8 +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/.gitignore +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/README.md +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/add_column_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_db_repository.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_repository.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_repository_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/group.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/gateway/subroute/my_module.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/alembic.ini +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_api_client.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_client.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_client_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_direct_client.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/README +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/env.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/script.py.mako +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration/versions/.gitkeep +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/migration_metadata.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/service/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/venv_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/db_engine_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/schema.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/migrate.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/alembic.ini +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/README +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/env.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/script.py.mako +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/alembic.ini +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/README +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/env.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/script.py.mako +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration/versions/.gitkeep +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/migration_metadata.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.amber.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.blue.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.cyan.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.fuchsia.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.green.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.grey.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.indigo.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.jade.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.lime.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.orange.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pink.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pumpkin.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.purple.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.red.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.sand.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.slate.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.violet.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.yellow.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.zinc.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/template.env +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/add/fastapp/fastapp_util.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/create/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/create/project-template/README.md +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/create/project-template/zrb_init.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/project/create/project_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/python.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/random.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/asdf/asdf.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/asdf/asdf_helper.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/common_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/latex/ubuntu.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/tmux/tmux.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/tmux/tmux_config.sh +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/tmux/tmux_helper.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/ubuntu.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/zsh/zsh.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/zsh/zsh_config.sh +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/setup/zsh/zsh_helper.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/shell/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/shell/autocomplete/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/shell/autocomplete/bash.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/shell/autocomplete/subcmd.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/shell/autocomplete/zsh.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/builtin/todo.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/callback/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/callback/any_callback.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/callback/callback.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/cmd/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/cmd/cmd_result.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/cmd/cmd_val.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/config.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/content_transformer/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/content_transformer/any_content_transformer.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/content_transformer/content_transformer.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/context/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/context/any_context.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/context/any_shared_context.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/context/context.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/context/shared_context.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/dot_dict/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/dot_dict/dot_dict.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/env/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/env/any_env.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/env/env.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/env/env_file.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/env/env_map.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/group/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/group/any_group.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/group/group.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/any_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/base_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/bool_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/float_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/int_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/option_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/password_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/str_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/input/text_input.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/cli.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/common_util.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_app.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_config/config.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_config/config_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/docs_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/error_page/serve_default_404.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/error_page/show_error_page.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/error_page/view.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/home_page/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/home_page/home_page_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/home_page/view.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/login_api_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/login_page/login_page_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/login_page/view.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/logout_api_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/logout_page/logout_page_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/logout_page/view.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/node_page/group/show_group_page.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/node_page/group/view.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/node_page/node_page_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/node_page/task/partial/input.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/node_page/task/show_task_page.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/node_page/task/view.html +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/refresh_token_api_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/refresh-token.template.js +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/resources/common.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/resources/favicon-32x32.png +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/resources/login/event.js +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/resources/logout/event.js +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/resources/pico.min.css +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/resources/session/common-util.js +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/resources/session/current-session.js +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/resources/session/event.js +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/resources/session/past-session.js +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/static/static_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/task_input_api_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_route/task_session_api_route.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_schema/session.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_schema/token.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_schema/user.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_util/cookie.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_util/html.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_util/token.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/runner/web_util/user.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/session/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/session/any_session.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/session/session.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/session_state_log/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/session_state_log/session_state_log.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/session_state_logger/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/session_state_logger/any_session_state_logger.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/session_state_logger/file_session_state_logger.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/session_state_logger/session_state_logger_factory.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/any_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/base_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/base_trigger.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/http_check.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/llm_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/make_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/rsync_task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/scaffolder.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/scheduler.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/task.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task/tcp_check.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task_status/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/task_status/task_status.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/attr.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/cli/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/cli/style.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/cli/subcommand.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/cmd/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/cmd/remote.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/codemod/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/codemod/append_code_to_class.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/codemod/append_code_to_function.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/codemod/append_code_to_method.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/codemod/append_key_to_dict.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/codemod/append_param_to_function_call.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/codemod/prepend_code_to_module.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/codemod/prepend_parent_to_class.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/codemod/prepend_property_to_class.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/cron.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/file.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/git.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/git_subtree.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/group.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/llm/tool.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/load.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/run.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/string/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/string/conversion.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/string/format.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/string/name.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/util/todo.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/xcom/__init__.py +0 -0
- {zrb-1.0.0b8 → zrb-1.0.0b9}/src/zrb/xcom/xcom.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: zrb
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.0b9
|
4
4
|
Summary: Your Automation Powerhouse
|
5
5
|
Home-page: https://github.com/state-alchemists/zrb
|
6
6
|
License: AGPL-3.0-or-later
|
@@ -23,6 +23,7 @@ Requires-Dist: fastembed (>=0.5.1,<0.6.0)
|
|
23
23
|
Requires-Dist: isort (>=5.13.2,<5.14.0)
|
24
24
|
Requires-Dist: libcst (>=1.5.0,<2.0.0)
|
25
25
|
Requires-Dist: pdfplumber (>=0.11.4,<0.12.0) ; extra == "rag"
|
26
|
+
Requires-Dist: psutil (>=6.1.1,<7.0.0)
|
26
27
|
Requires-Dist: pydantic-ai (>=0.0.19,<0.0.20)
|
27
28
|
Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
|
28
29
|
Requires-Dist: python-jose[cryptography] (>=3.3.0,<4.0.0)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "zrb"
|
3
|
-
version = "1.0.
|
3
|
+
version = "1.0.0b9"
|
4
4
|
description = "Your Automation Powerhouse"
|
5
5
|
authors = ["Go Frendi Gunawan <gofrendiasgard@gmail.com>"]
|
6
6
|
license = "AGPL-3.0-or-later"
|
@@ -52,6 +52,7 @@ python-jose = {extras = ["cryptography"], version = "^3.3.0"}
|
|
52
52
|
ulid-py = "^1.1.0"
|
53
53
|
pydantic-ai = "^0.0.19"
|
54
54
|
fastembed = "^0.5.1"
|
55
|
+
psutil = "^6.1.1"
|
55
56
|
|
56
57
|
[tool.poetry.extras]
|
57
58
|
# poetry install -E rag
|
@@ -16,8 +16,11 @@ def serve_cli():
|
|
16
16
|
cli.run(sys.argv[1:])
|
17
17
|
except KeyboardInterrupt:
|
18
18
|
print(stylize_warning("\nStopped"), file=sys.stderr)
|
19
|
+
sys.exit(1)
|
19
20
|
except RuntimeError as e:
|
20
21
|
if f"{e}".lower() != "event loop is closed":
|
21
22
|
raise e
|
23
|
+
sys.exit(1)
|
22
24
|
except NodeNotFoundError as e:
|
23
25
|
print(stylize_error(f"{e}"), file=sys.stderr)
|
26
|
+
sys.exit(1)
|
@@ -57,6 +57,7 @@ scaffold_fastapp = Scaffolder(
|
|
57
57
|
"my_app_name": "{to_snake_case(ctx.input.app)}",
|
58
58
|
"MY_APP_NAME": "{to_snake_case(ctx.input.app).upper()}",
|
59
59
|
"my-secure-password": lambda _: get_random_name(),
|
60
|
+
"my-secret-key": lambda _: get_random_name(),
|
60
61
|
},
|
61
62
|
),
|
62
63
|
# Register fastapp's tasks to project's zrb_init (project_dir/zrb_init.py)
|
@@ -67,11 +67,11 @@ class MyEntityService(BaseService):
|
|
67
67
|
@BaseService.route(
|
68
68
|
"/api/v1/my-entities/bulk",
|
69
69
|
methods=["put"],
|
70
|
-
response_model=MyEntityResponse,
|
70
|
+
response_model=list[MyEntityResponse],
|
71
71
|
)
|
72
72
|
async def update_my_entity_bulk(
|
73
73
|
self, my_entity_ids: list[str], data: MyEntityUpdateWithAudit
|
74
|
-
) -> MyEntityResponse:
|
74
|
+
) -> list[MyEntityResponse]:
|
75
75
|
await self.my_entity_repository.update_bulk(my_entity_ids, data)
|
76
76
|
return await self.my_entity_repository.get_by_ids(my_entity_ids)
|
77
77
|
|
@@ -89,11 +89,11 @@ class MyEntityService(BaseService):
|
|
89
89
|
@BaseService.route(
|
90
90
|
"/api/v1/my-entities/bulk",
|
91
91
|
methods=["delete"],
|
92
|
-
response_model=MyEntityResponse,
|
92
|
+
response_model=list[MyEntityResponse],
|
93
93
|
)
|
94
94
|
async def delete_my_entity_bulk(
|
95
95
|
self, my_entity_ids: list[str], deleted_by: str
|
96
|
-
) -> MyEntityResponse:
|
96
|
+
) -> list[MyEntityResponse]:
|
97
97
|
my_entities = await self.my_entity_repository.get_by_ids(my_entity_ids)
|
98
98
|
await self.my_entity_repository.delete_bulk(my_entity_ids)
|
99
99
|
return my_entities
|
@@ -106,6 +106,6 @@ class MyEntityService(BaseService):
|
|
106
106
|
async def delete_my_entity(
|
107
107
|
self, my_entity_id: str, deleted_by: str
|
108
108
|
) -> MyEntityResponse:
|
109
|
-
my_entity = await self.my_entity_repository.get_by_id(
|
109
|
+
my_entity = await self.my_entity_repository.get_by_id(my_entity_id)
|
110
110
|
await self.my_entity_repository.delete(my_entity_id)
|
111
111
|
return my_entity
|
@@ -39,6 +39,7 @@ class MultipleMyEntityResponse(BaseModel):
|
|
39
39
|
|
40
40
|
|
41
41
|
class MyEntity(SQLModel, table=True):
|
42
|
+
__tablename__ = "my_entities"
|
42
43
|
id: str = Field(default_factory=lambda: ulid.new().str, primary_key=True)
|
43
44
|
created_at: datetime.datetime = Field(index=True)
|
44
45
|
created_by: str = Field(index=True)
|
@@ -3,6 +3,14 @@ from my_app_name._zrb.util import get_existing_module_names, get_existing_schema
|
|
3
3
|
from zrb import OptionInput, StrInput
|
4
4
|
from zrb.util.string.conversion import pluralize
|
5
5
|
|
6
|
+
run_env_input = OptionInput(
|
7
|
+
name="env",
|
8
|
+
description="Running environment",
|
9
|
+
prompt="Running Environment",
|
10
|
+
options=["dev", "prod"],
|
11
|
+
default_str="prod",
|
12
|
+
)
|
13
|
+
|
6
14
|
new_module_input = StrInput(
|
7
15
|
name="module", description="Module name", prompt="New module name"
|
8
16
|
)
|
@@ -9,8 +9,14 @@ from my_app_name._zrb.group import (
|
|
9
9
|
app_migrate_group,
|
10
10
|
app_run_group,
|
11
11
|
)
|
12
|
+
from my_app_name._zrb.input import run_env_input
|
12
13
|
from my_app_name._zrb.module.add_module_task import add_my_app_name_module
|
13
|
-
from my_app_name._zrb.
|
14
|
+
from my_app_name._zrb.task_util import (
|
15
|
+
create_migration,
|
16
|
+
migrate_module,
|
17
|
+
run_microservice,
|
18
|
+
run_my_app_name,
|
19
|
+
)
|
14
20
|
from my_app_name._zrb.venv_task import prepare_venv
|
15
21
|
|
16
22
|
from zrb import CmdTask, EnvFile, EnvMap, Task
|
@@ -52,6 +58,7 @@ run_monolith = app_run_group.add_task(
|
|
52
58
|
CmdTask(
|
53
59
|
name="run-monolith-my-app-name",
|
54
60
|
description="🗿 Run My App Name as a monolith",
|
61
|
+
input=run_env_input,
|
55
62
|
env=[
|
56
63
|
EnvFile(path=os.path.join(APP_DIR, "template.env")),
|
57
64
|
EnvMap(vars=MONOLITH_ENV_VARS),
|
@@ -59,7 +66,7 @@ run_monolith = app_run_group.add_task(
|
|
59
66
|
cwd=APP_DIR,
|
60
67
|
cmd=[
|
61
68
|
ACTIVATE_VENV_SCRIPT,
|
62
|
-
|
69
|
+
run_my_app_name,
|
63
70
|
],
|
64
71
|
render_cmd=False,
|
65
72
|
retries=2,
|
@@ -1,5 +1,4 @@
|
|
1
1
|
import os
|
2
|
-
import platform
|
3
2
|
|
4
3
|
from my_app_name._zrb.config import (
|
5
4
|
ACTIVATE_VENV_SCRIPT,
|
@@ -7,9 +6,17 @@ from my_app_name._zrb.config import (
|
|
7
6
|
MICROSERVICES_ENV_VARS,
|
8
7
|
MONOLITH_ENV_VARS,
|
9
8
|
)
|
9
|
+
from my_app_name._zrb.input import run_env_input
|
10
|
+
from my_app_name._zrb.util import (
|
11
|
+
cd_module_script,
|
12
|
+
run_my_app_name,
|
13
|
+
set_create_migration_db_url_env,
|
14
|
+
set_env,
|
15
|
+
set_module_env,
|
16
|
+
)
|
10
17
|
|
11
18
|
from zrb import Cmd, CmdTask, EnvFile, EnvMap, StrInput, Task
|
12
|
-
from zrb.util.string.conversion import
|
19
|
+
from zrb.util.string.conversion import to_snake_case
|
13
20
|
|
14
21
|
|
15
22
|
def create_migration(name: str, module: str) -> Task:
|
@@ -72,6 +79,7 @@ def run_microservice(name: str, port: int, module: str) -> Task:
|
|
72
79
|
return CmdTask(
|
73
80
|
name=f"run-my-app-name-{name}",
|
74
81
|
description=f"🧩 Run My App Name {name.capitalize()}",
|
82
|
+
input=run_env_input,
|
75
83
|
env=[
|
76
84
|
EnvFile(path=os.path.join(APP_DIR, "template.env")),
|
77
85
|
EnvMap(
|
@@ -85,54 +93,8 @@ def run_microservice(name: str, port: int, module: str) -> Task:
|
|
85
93
|
ACTIVATE_VENV_SCRIPT,
|
86
94
|
set_env("MY_APP_NAME_MODULES", module),
|
87
95
|
set_env("MY_APP_NAME_PORT", f"{port}"),
|
88
|
-
|
96
|
+
run_my_app_name,
|
89
97
|
],
|
90
98
|
render_cmd=False,
|
91
99
|
retries=2,
|
92
100
|
)
|
93
|
-
|
94
|
-
|
95
|
-
def get_existing_module_names() -> list[str]:
|
96
|
-
module_dir_path = os.path.join(APP_DIR, "module")
|
97
|
-
return [entry.name for entry in os.scandir(module_dir_path) if entry.is_dir()]
|
98
|
-
|
99
|
-
|
100
|
-
def get_existing_schema_names() -> list[str]:
|
101
|
-
module_dir_path = os.path.join(APP_DIR, "schema")
|
102
|
-
return [
|
103
|
-
os.path.splitext(entry.name)[0]
|
104
|
-
for entry in os.scandir(module_dir_path)
|
105
|
-
if entry.is_file() and entry.name.endswith(".py")
|
106
|
-
]
|
107
|
-
|
108
|
-
|
109
|
-
def set_create_migration_db_url_env(module_name: str) -> str:
|
110
|
-
return set_env(
|
111
|
-
"MY_APP_NAME_DB_URL",
|
112
|
-
f"sqlite:///{APP_DIR}/.migration.{to_snake_case(module_name)}.db",
|
113
|
-
)
|
114
|
-
|
115
|
-
|
116
|
-
def set_module_env(module_name: str) -> str:
|
117
|
-
return (set_env("MY_APP_NAME_MODULES", to_snake_case(module_name)),)
|
118
|
-
|
119
|
-
|
120
|
-
def cd_module_script(module_name: str) -> str:
|
121
|
-
module_dir_path = os.path.join(APP_DIR, "module", to_snake_case(module_name))
|
122
|
-
return f"cd {module_dir_path}"
|
123
|
-
|
124
|
-
|
125
|
-
def set_env(var_name: str, var_value: str) -> str:
|
126
|
-
"""
|
127
|
-
Generates a script to set an environment variable depending on the OS.
|
128
|
-
:param var_name: Name of the environment variable.
|
129
|
-
:param var_value: Value of the environment variable.
|
130
|
-
:return: A string containing the appropriate script.
|
131
|
-
"""
|
132
|
-
if platform.system() == "Windows":
|
133
|
-
# PowerShell script for Windows
|
134
|
-
script = f'[Environment]::SetEnvironmentVariable({double_quote(var_name)}, {double_quote(var_value)}, "User")' # noqa
|
135
|
-
else:
|
136
|
-
# Bash script for Unix-like systems
|
137
|
-
script = f"export {var_name}={double_quote(var_value)}"
|
138
|
-
return script
|
@@ -0,0 +1,58 @@
|
|
1
|
+
import os
|
2
|
+
import platform
|
3
|
+
|
4
|
+
from my_app_name._zrb.config import APP_DIR
|
5
|
+
|
6
|
+
from zrb import AnyContext
|
7
|
+
from zrb.util.string.conversion import double_quote, to_snake_case
|
8
|
+
|
9
|
+
|
10
|
+
def run_my_app_name(ctx: AnyContext) -> str:
|
11
|
+
subcommand = "dev" if ctx.input.env == "dev" else "run"
|
12
|
+
return f'fastapi {subcommand} main.py --port "${{MY_APP_NAME_PORT}}"'
|
13
|
+
|
14
|
+
|
15
|
+
def get_existing_module_names() -> list[str]:
|
16
|
+
module_dir_path = os.path.join(APP_DIR, "module")
|
17
|
+
return [entry.name for entry in os.scandir(module_dir_path) if entry.is_dir()]
|
18
|
+
|
19
|
+
|
20
|
+
def get_existing_schema_names() -> list[str]:
|
21
|
+
module_dir_path = os.path.join(APP_DIR, "schema")
|
22
|
+
return [
|
23
|
+
os.path.splitext(entry.name)[0]
|
24
|
+
for entry in os.scandir(module_dir_path)
|
25
|
+
if entry.is_file() and entry.name.endswith(".py")
|
26
|
+
]
|
27
|
+
|
28
|
+
|
29
|
+
def set_create_migration_db_url_env(module_name: str) -> str:
|
30
|
+
return set_env(
|
31
|
+
"MY_APP_NAME_DB_URL",
|
32
|
+
f"sqlite:///{APP_DIR}/.migration.{to_snake_case(module_name)}.db",
|
33
|
+
)
|
34
|
+
|
35
|
+
|
36
|
+
def set_module_env(module_name: str) -> str:
|
37
|
+
return (set_env("MY_APP_NAME_MODULES", to_snake_case(module_name)),)
|
38
|
+
|
39
|
+
|
40
|
+
def cd_module_script(module_name: str) -> str:
|
41
|
+
module_dir_path = os.path.join(APP_DIR, "module", to_snake_case(module_name))
|
42
|
+
return f"cd {module_dir_path}"
|
43
|
+
|
44
|
+
|
45
|
+
def set_env(var_name: str, var_value: str) -> str:
|
46
|
+
"""
|
47
|
+
Generates a script to set an environment variable depending on the OS.
|
48
|
+
:param var_name: Name of the environment variable.
|
49
|
+
:param var_value: Value of the environment variable.
|
50
|
+
:return: A string containing the appropriate script.
|
51
|
+
"""
|
52
|
+
if platform.system() == "Windows":
|
53
|
+
# PowerShell script for Windows
|
54
|
+
script = f'[Environment]::SetEnvironmentVariable({double_quote(var_name)}, {double_quote(var_value)}, "User")' # noqa
|
55
|
+
else:
|
56
|
+
# Bash script for Unix-like systems
|
57
|
+
script = f"export {var_name}={double_quote(var_value)}"
|
58
|
+
return script
|
@@ -122,9 +122,19 @@ class BaseDBRepository(Generic[DBModel, ResponseModel, CreateModel, UpdateModel]
|
|
122
122
|
return self._ensure_one(rows)
|
123
123
|
|
124
124
|
async def get_by_ids(self, id_list: list[str]) -> list[ResponseModel]:
|
125
|
-
|
125
|
+
rows = await self._select_to_response(
|
126
126
|
lambda q: q.where(self.db_model.id.in_(id_list))
|
127
127
|
)
|
128
|
+
# raise error if any id not in id_list
|
129
|
+
existing_id_list = [row.id for row in rows]
|
130
|
+
inexist_id_list = [id for id in id_list if id not in existing_id_list]
|
131
|
+
if len(inexist_id_list) > 0:
|
132
|
+
raise NotFoundError(
|
133
|
+
f"{self.entity_name} not found, inexist ids: {', '.join(inexist_id_list)}"
|
134
|
+
)
|
135
|
+
# sort rows
|
136
|
+
row_dict = {row.id: row for row in rows}
|
137
|
+
return [row_dict[id] for id in id_list]
|
128
138
|
|
129
139
|
async def count(self, filter: str | None = None) -> int:
|
130
140
|
count_statement = select(func.count(1)).select_from(self.db_model)
|
@@ -184,21 +194,22 @@ class BaseDBRepository(Generic[DBModel, ResponseModel, CreateModel, UpdateModel]
|
|
184
194
|
|
185
195
|
async def create_bulk(self, data_list: list[CreateModel]) -> list[DBModel]:
|
186
196
|
now = datetime.datetime.now(datetime.timezone.utc)
|
187
|
-
|
197
|
+
data_dict_list = [
|
188
198
|
self._model_to_data_dict(data, created_at=now, id=ulid.new().str)
|
189
199
|
for data in data_list
|
190
200
|
]
|
201
|
+
id_list = [data_dict["id"] for data_dict in data_dict_list]
|
191
202
|
async with self._session_scope() as session:
|
192
203
|
await self._execute_statement(
|
193
|
-
session, insert(self.db_model).values(
|
204
|
+
session, insert(self.db_model).values(data_dict_list)
|
194
205
|
)
|
195
|
-
id_list = [d["id"] for d in data_dicts]
|
196
206
|
statement = select(self.db_model).where(self.db_model.id.in_(id_list))
|
197
207
|
result = await self._execute_statement(session, statement)
|
198
|
-
|
199
|
-
self.db_model(**entity.model_dump())
|
208
|
+
row_dict = {
|
209
|
+
entity.id: self.db_model(**entity.model_dump())
|
200
210
|
for entity in result.scalars().all()
|
201
|
-
|
211
|
+
}
|
212
|
+
return [row_dict[id] for id in id_list]
|
202
213
|
|
203
214
|
async def delete(self, id: str) -> DBModel:
|
204
215
|
async with self._session_scope() as session:
|
@@ -220,11 +231,15 @@ class BaseDBRepository(Generic[DBModel, ResponseModel, CreateModel, UpdateModel]
|
|
220
231
|
await self._execute_statement(
|
221
232
|
session, delete(self.db_model).where(self.db_model.id.in_(id_list))
|
222
233
|
)
|
223
|
-
|
234
|
+
row_dict = {
|
235
|
+
entity.id: self.db_model(**entity.model_dump()) for entity in entities
|
236
|
+
}
|
237
|
+
return [row_dict[id] for id in id_list]
|
224
238
|
|
225
239
|
async def update(self, id: str, data: UpdateModel) -> DBModel:
|
226
240
|
now = datetime.datetime.now(datetime.timezone.utc)
|
227
241
|
update_data = self._model_to_data_dict(data, updated_at=now)
|
242
|
+
update_data = {k: v for k, v in update_data.items() if v is not None}
|
228
243
|
async with self._session_scope() as session:
|
229
244
|
statement = (
|
230
245
|
update(self.db_model)
|
@@ -256,7 +271,8 @@ class BaseDBRepository(Generic[DBModel, ResponseModel, CreateModel, UpdateModel]
|
|
256
271
|
result = await self._execute_statement(
|
257
272
|
session, select(self.db_model).where(self.db_model.id.in_(id_list))
|
258
273
|
)
|
259
|
-
|
260
|
-
self.db_model(**entity.model_dump())
|
274
|
+
row_dict = {
|
275
|
+
entity.id: self.db_model(**entity.model_dump())
|
261
276
|
for entity in result.scalars().all()
|
262
|
-
|
277
|
+
}
|
278
|
+
return [row_dict[id] for id in id_list]
|
@@ -56,7 +56,6 @@ class BaseService:
|
|
56
56
|
response_model: Any = None,
|
57
57
|
status_code: int | None = None,
|
58
58
|
tags: list[str | Enum] | None = None,
|
59
|
-
dependencies: Sequence[params.Depends] | None = None,
|
60
59
|
summary: str | None = None,
|
61
60
|
description: str = None,
|
62
61
|
deprecated: bool | None = None,
|
@@ -160,56 +159,62 @@ def _create_direct_client_method(logger: Logger, func: Callable, service: BaseSe
|
|
160
159
|
return client_method
|
161
160
|
|
162
161
|
|
163
|
-
def _create_api_client_method(logger: Logger,
|
162
|
+
def _create_api_client_method(logger: Logger, route_param: RouteParam, base_url: str):
|
164
163
|
async def client_method(*args, **kwargs):
|
165
|
-
url = base_url +
|
164
|
+
url = base_url + route_param.path
|
166
165
|
method = (
|
167
|
-
|
168
|
-
if isinstance(
|
169
|
-
else
|
166
|
+
route_param.methods[0].lower()
|
167
|
+
if isinstance(route_param.methods, list)
|
168
|
+
else route_param.methods.lower()
|
170
169
|
)
|
171
170
|
# Get the signature of the original function
|
172
|
-
sig = inspect.signature(
|
171
|
+
sig = inspect.signature(route_param.func)
|
173
172
|
# Bind the arguments to the signature
|
174
173
|
bound_args = sig.bind(*args, **kwargs)
|
175
174
|
bound_args.apply_defaults()
|
176
175
|
# Analyze parameters
|
177
|
-
|
178
|
-
|
179
|
-
p
|
180
|
-
for p in
|
181
|
-
if
|
176
|
+
function_params = list(sig.parameters.values())
|
177
|
+
body_param_names = [
|
178
|
+
p.name
|
179
|
+
for p in function_params
|
180
|
+
if (
|
181
|
+
p.name != "self"
|
182
|
+
and f"{{{p.name}}}" not in route_param.path
|
183
|
+
and p.kind == inspect.Parameter.POSITIONAL_OR_KEYWORD
|
184
|
+
and (
|
185
|
+
method not in ["get", "delete"]
|
186
|
+
or (method == "delete" and p.annotation not in [str, float, bool])
|
187
|
+
)
|
188
|
+
)
|
182
189
|
]
|
183
190
|
# Prepare the request
|
184
191
|
path_params = {}
|
185
192
|
query_params = {}
|
186
|
-
|
193
|
+
body_params = {}
|
187
194
|
for name, value in bound_args.arguments.items():
|
188
195
|
if name == "self":
|
189
196
|
continue
|
190
|
-
if f"{{{name}}}" in
|
197
|
+
if f"{{{name}}}" in route_param.path:
|
191
198
|
path_params[name] = value
|
192
|
-
elif
|
193
|
-
body = _parse_api_param(value)
|
194
|
-
elif method in ["get", "delete"]:
|
199
|
+
elif name not in body_param_names:
|
195
200
|
query_params[name] = _parse_api_param(value)
|
196
|
-
elif len(
|
201
|
+
elif len(body_param_names) == 1 and name == body_param_names[0]:
|
197
202
|
# If there's only one body parameter, use its value directly
|
198
|
-
|
203
|
+
body_params = _parse_api_param(value)
|
199
204
|
else:
|
200
|
-
|
205
|
+
body_params[name] = _parse_api_param(value)
|
201
206
|
# Format the URL with path parameters
|
202
207
|
url = url.format(**path_params)
|
203
208
|
logger.info(
|
204
|
-
f"Sending request to {url} with method {method}, json={
|
209
|
+
f"Sending request to {url} with method {method}, json={body_params}, params={query_params}" # noqa
|
205
210
|
)
|
206
211
|
async with httpx.AsyncClient() as client:
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
212
|
+
response = await client.request(
|
213
|
+
method=method,
|
214
|
+
url=url,
|
215
|
+
params=query_params,
|
216
|
+
json=None if method == "get" else body_params,
|
217
|
+
)
|
213
218
|
logger.info(
|
214
219
|
f"Received response: status={response.status_code}, content={response.content}"
|
215
220
|
)
|
@@ -8,11 +8,26 @@ class NotFoundError(HTTPException):
|
|
8
8
|
super().__init__(404, {"message": message}, headers)
|
9
9
|
|
10
10
|
|
11
|
+
class ForbiddenError(HTTPException):
|
12
|
+
def __init__(self, message: str, headers: Dict[str, str] | None = None) -> None:
|
13
|
+
super().__init__(403, {"message": message}, headers)
|
14
|
+
|
15
|
+
|
16
|
+
class UnauthorizedError(HTTPException):
|
17
|
+
def __init__(self, message: str, headers: Dict[str, str] | None = None) -> None:
|
18
|
+
super().__init__(401, {"message": message}, headers)
|
19
|
+
|
20
|
+
|
11
21
|
class InvalidValueError(HTTPException):
|
12
22
|
def __init__(self, message: str, headers: Dict[str, str] | None = None) -> None:
|
13
23
|
super().__init__(422, {"message": message}, headers)
|
14
24
|
|
15
25
|
|
26
|
+
class InternalServerError(HTTPException):
|
27
|
+
def __init__(self, message: str, headers: Dict[str, str] | None = None) -> None:
|
28
|
+
super().__init__(500, {"message": message}, headers)
|
29
|
+
|
30
|
+
|
16
31
|
class ClientAPIError(HTTPException):
|
17
32
|
def __init__(
|
18
33
|
self, status_code: int, message: str, headers: Dict[str, str] | None = None
|
@@ -1,5 +1,8 @@
|
|
1
1
|
import os
|
2
2
|
|
3
|
+
TRUE_STRS = ["true", "1", "yes", "y", "active", "on"]
|
4
|
+
FALSE_STRS = ["false", "0", "no", "n", "inactive", "off"]
|
5
|
+
|
3
6
|
APP_PATH = os.path.dirname(__file__)
|
4
7
|
APP_VERSION = "0.1.0"
|
5
8
|
|
@@ -51,16 +54,30 @@ APP_AUTH_SUPER_USER_PASSWORD = os.getenv(
|
|
51
54
|
"MY_APP_NAME_AUTH_SUPER_USER_PASSWORD", "my-secure-password"
|
52
55
|
)
|
53
56
|
APP_AUTH_GUEST_USER = os.getenv("MY_APP_NAME_AUTH_GUEST_USER", "user")
|
54
|
-
APP_AUTH_GUEST_USER_PERMISSIONS =
|
57
|
+
APP_AUTH_GUEST_USER_PERMISSIONS = [
|
55
58
|
permission_name.strip()
|
56
59
|
for permission_name in os.getenv(
|
57
60
|
"MY_APP_NAME_AUTH_GUEST_USER_PERMISSIONS", ""
|
58
61
|
).split(",")
|
59
62
|
if permission_name.strip() != ""
|
63
|
+
]
|
64
|
+
APP_AUTH_MAX_PARALLEL_SESSION = int(
|
65
|
+
os.getenv("MY_APP_NAME_AUTH_MAX_PARALLEL_SESSION", "1")
|
60
66
|
)
|
61
|
-
|
62
|
-
|
63
|
-
|
67
|
+
APP_AUTH_ACCESS_TOKEN_EXPIRE_MINUTES = int(
|
68
|
+
os.getenv("MY_APP_NAME_AUTH_ACCESS_TOKEN_EXPIRE_MINUTES", "30")
|
69
|
+
)
|
70
|
+
APP_AUTH_REFRESH_TOKEN_EXPIRE_MINUTES = int(
|
71
|
+
os.getenv("MY_APP_NAME_AUTH_REFRESH_TOKEN_EXPIRE_MINUTES", "1440")
|
72
|
+
)
|
73
|
+
APP_AUTH_ACCESS_TOKEN_COOKIE_NAME = os.getenv(
|
74
|
+
"MY_APP_NAME_AUTH_ACCESS_TOKEN_COOKIE_NAME", "access_token"
|
75
|
+
)
|
76
|
+
APP_AUTH_REFRESH_TOKEN_COOKIE_NAME = os.getenv(
|
77
|
+
"MY_APP_NAME_AUTH_REFRESH_TOKEN_COOKIE_NAME", "refresh_token"
|
78
|
+
)
|
79
|
+
APP_AUTH_SECRET_KEY = os.getenv("MY_APP_NAME_AUTH_SECRET_KEY", "my-secret-key")
|
80
|
+
APP_AUTH_PRIORITIZE_NEW_SESSION = (
|
81
|
+
os.getenv("MY_APP_NAME_AUTH_PRIORITIZE_NEW_SESSION", "1").lower() in TRUE_STRS
|
64
82
|
)
|
65
|
-
|
66
83
|
APP_AUTH_BASE_URL = os.getenv("MY_APP_NAME_AUTH_BASE_URL", "http://localhost:3001")
|
@@ -13,15 +13,36 @@ from my_app_name.schema.role import (
|
|
13
13
|
RoleUpdateWithPermissionsAndAudit,
|
14
14
|
)
|
15
15
|
from my_app_name.schema.user import (
|
16
|
+
AuthUserResponse,
|
16
17
|
MultipleUserResponse,
|
17
18
|
UserCreateWithRolesAndAudit,
|
19
|
+
UserCredentials,
|
18
20
|
UserResponse,
|
21
|
+
UserSessionResponse,
|
19
22
|
UserUpdateWithRolesAndAudit,
|
20
23
|
)
|
21
24
|
|
22
25
|
|
23
26
|
class AuthClient(ABC):
|
24
27
|
|
28
|
+
@abstractmethod
|
29
|
+
async def get_current_user(self, access_token: str) -> AuthUserResponse:
|
30
|
+
"""Get current user based on access token"""
|
31
|
+
|
32
|
+
@abstractmethod
|
33
|
+
async def create_user_session(
|
34
|
+
self, credential: UserCredentials
|
35
|
+
) -> UserSessionResponse:
|
36
|
+
"""Create new user session"""
|
37
|
+
|
38
|
+
@abstractmethod
|
39
|
+
async def update_user_session(self, refresh_token: str) -> UserSessionResponse:
|
40
|
+
"""Update user session"""
|
41
|
+
|
42
|
+
@abstractmethod
|
43
|
+
async def delete_user_session(self, refresh_token: str) -> UserSessionResponse:
|
44
|
+
"""Delete user session"""
|
45
|
+
|
25
46
|
# Permission related methods
|
26
47
|
|
27
48
|
@abstractmethod
|