databao 0.3.4.dev1__tar.gz → 0.3.6__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.
- databao-0.3.6/Makefile +66 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/PKG-INFO +22 -3
- {databao-0.3.4.dev1 → databao-0.3.6}/README.md +19 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/README.md +19 -45
- databao-0.3.6/examples/demo-snowflake-project/cleanup.sql +28 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/pyproject.toml +3 -2
- databao-0.3.6/examples/demo-snowflake-project/setup.sql +145 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/src/databao_snowflake_demo/app.py +0 -3
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/uv.lock +1049 -1038
- {databao-0.3.4.dev1 → databao-0.3.6}/pyproject.toml +6 -2
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/mcp/tools/databao_ask/agent_factory.py +2 -1
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/app.py +5 -4
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/components/sidebar.py +2 -2
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/models/settings.py +4 -2
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/pages/agent_settings.py +5 -6
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/pages/general_settings.py +2 -1
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/executor_utils.py +4 -2
- {databao-0.3.4.dev1 → databao-0.3.6}/uv.lock +3637 -3610
- databao-0.3.4.dev1/Makefile +0 -38
- databao-0.3.4.dev1/examples/demo-snowflake-project/cleanup.sql +0 -57
- databao-0.3.4.dev1/examples/demo-snowflake-project/setup.sql +0 -242
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/agents/reviewer.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/settings.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/autosteer/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/check-coverage/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/check-coverage/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/check-pr-comments/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/check-pr-comments/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/create-branch/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/create-branch/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/create-pr/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/create-pr/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/eval-skills/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/local-code-review/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/local-code-review/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/make-yt-issue/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/make-yt-issue/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/review-architecture/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/review-architecture/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/setup-environment/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/setup-environment/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/update-pr/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/update-pr/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/write-tests/SKILL.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.claude/skills/write-tests/evals/evals.json +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.github/actions/setup-project/action.yml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.github/copilot-instructions.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.github/workflows/e2e-tests.yml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.github/workflows/publish-dev.yml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.github/workflows/publish.yml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.github/workflows/python-package.yml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.gitignore +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.pre-commit-config.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/.python-version +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/CLAUDE.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/CONTRIBUTING.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/DEVELOPMENT.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/LICENSE +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/docs/architecture.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/docs/python-coding-guidelines.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/docs/testing-strategy.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/.gitignore +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/pytest.ini +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/databases/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/databases/bigquery_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/databases/duckdb_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/databases/mysql_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/databases/postgres_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/databases/snowflake_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/databases/sqlite_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/project_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/utils/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/utils/path_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/utils/pexpect_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/src/utils/yaml_compare.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/conftest.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/domains/test_bigquery.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/domains/test_duckdb.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/domains/test_mysql.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/domains/test_postgres.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/domains/test_snowflake.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/domains/test_sqlite.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/resources/bigquery_introspections.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/resources/duckdb_introspections.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/resources/mysql_introspections.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/resources/postgres_introspections.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/resources/postgres_partitioned_tables_introspections.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/resources/snowflake_introspections.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/e2e-tests/tests/resources/sqlite_introspections.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/databao/domains/root/dce.ini +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/databao/domains/root/examples/src/databases/example_postgres.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/databao/domains/root/examples/src/files/documentation.md +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/databao/domains/root/examples/src/files/notes.txt +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/databao/domains/root/src/snowflake.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/examples/demo-snowflake-project/src/databao_snowflake_demo/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/scripts/generate_licenses.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/scripts/smoke-test-skills.sh +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/scripts/validate_agent_guidance.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/__main__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/app.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/ask.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/build.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/datasource/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/datasource/add.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/datasource/check.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/index.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/init.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/mcp.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/commands/status.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ask/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ask/agent_factory.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ask/display.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ask/service.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/build.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/datasource/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/datasource/add.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/datasource/check.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/datasource/validation.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/index.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/init/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/init/errors.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/init/service.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/mcp/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/mcp/server.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/mcp/tools/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/mcp/tools/databao_ask/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/mcp/tools/databao_ask/tool.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/mcp/tools/database_context/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/mcp/tools/database_context/tools.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/status.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/assets/bao.png +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/cli.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/components/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/components/chat.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/components/datasource_form.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/components/datasource_manager.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/components/icons.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/components/results.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/components/status.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/models/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/models/chat_session.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/pages/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/pages/chat.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/pages/context_settings.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/pages/welcome.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/project_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/services/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/services/build_service.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/services/chat_persistence.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/services/chat_title.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/services/dce_operations.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/services/llm_models.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/services/query_executor.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/services/settings_persistence.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/services/storage.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/streaming.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/features/ui/suggestions.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/py.typed +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/cli_utils.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/context_engine_cli.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/errors.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/log/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/log/cli_progress.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/log/console.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/log/llm_errors.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/log/logging.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/project/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/shared/project/layout.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/workflows/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/workflows/ask.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/workflows/datasource/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/workflows/datasource/add.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/src/databao_cli/workflows/datasource/check.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/check_datasource/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/check_datasource/test_check_datasource.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/check_datasource/test_project/databao/.gitignore +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/check_datasource/test_project/databao/domains/root/dce.ini +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/check_datasource/test_project/databao/domains/root/src/myduck.yaml +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/conftest.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/plugins/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/plugins/get_loaded_plugins.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/plugins/test_plugins.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_add_datasource.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_app.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_ask.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_build.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_build_fingerprint.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_cli_progress.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_datasource_form_validation.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_datasource_validation.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_index.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_init.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_mcp.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_query_executor.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_query_executor_race_conditions.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_source_count.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/test_status.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/utils/__init__.py +0 -0
- {databao-0.3.4.dev1 → databao-0.3.6}/tests/utils/project.py +0 -0
databao-0.3.6/Makefile
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
LATEST_STABLE := $(or $(shell git tag --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$$' | head -1),v0.0.0)
|
|
2
|
+
CURRENT_MAJOR := $(shell echo $(LATEST_STABLE) | sed 's/^v//' | cut -d. -f1)
|
|
3
|
+
CURRENT_MINOR := $(shell echo $(LATEST_STABLE) | sed 's/^v//' | cut -d. -f2)
|
|
4
|
+
CURRENT_BUILD := $(shell echo $(LATEST_STABLE) | sed 's/^v//' | cut -d. -f3)
|
|
5
|
+
|
|
6
|
+
setup:
|
|
7
|
+
@echo "Checking prerequisites..."
|
|
8
|
+
@python3 --version
|
|
9
|
+
@uv --version
|
|
10
|
+
@echo "Installing dependencies..."
|
|
11
|
+
uv sync --dev
|
|
12
|
+
@echo "Installing pre-commit hooks..."
|
|
13
|
+
uv run pre-commit install
|
|
14
|
+
@echo "Verifying environment..."
|
|
15
|
+
uv run databao --help > /dev/null
|
|
16
|
+
uv run ruff check src/databao_cli > /dev/null
|
|
17
|
+
uv run mypy src/databao_cli > /dev/null
|
|
18
|
+
uv run pytest tests/ --co -q > /dev/null
|
|
19
|
+
@echo "Environment ready."
|
|
20
|
+
|
|
21
|
+
check:
|
|
22
|
+
uv run pre-commit run --all-files
|
|
23
|
+
|
|
24
|
+
test:
|
|
25
|
+
bash -c 'set -a; [ -f .env ] && source .env; set +a; uv run pytest tests/ -v'
|
|
26
|
+
|
|
27
|
+
test-cov:
|
|
28
|
+
bash -c 'set -a; [ -f .env ] && source .env; set +a; uv run pytest tests/ -v --cov --cov-report=term-missing --cov-report=html'
|
|
29
|
+
|
|
30
|
+
test-cov-check:
|
|
31
|
+
bash -c 'set -a; [ -f .env ] && source .env; set +a; uv run pytest tests/ -v --cov --cov-report=term-missing --cov-fail-under=80'
|
|
32
|
+
|
|
33
|
+
e2e-test:
|
|
34
|
+
uv run --group e2e-tests pytest e2e-tests
|
|
35
|
+
|
|
36
|
+
nickname:
|
|
37
|
+
@git config user.email | cut -d@ -f1
|
|
38
|
+
|
|
39
|
+
lint-skills:
|
|
40
|
+
uv run python scripts/validate_agent_guidance.py
|
|
41
|
+
|
|
42
|
+
smoke-skills:
|
|
43
|
+
scripts/smoke-test-skills.sh
|
|
44
|
+
|
|
45
|
+
release:
|
|
46
|
+
@if [ -z "$(VERSION)" ]; then \
|
|
47
|
+
echo "Usage: make release VERSION=0.3.0"; \
|
|
48
|
+
exit 1; \
|
|
49
|
+
fi
|
|
50
|
+
@echo "Creating release v$(VERSION)..."
|
|
51
|
+
git tag -a "v$(VERSION)" -m "v$(VERSION)"
|
|
52
|
+
git push origin "v$(VERSION)"
|
|
53
|
+
@echo "Tag v$(VERSION) pushed. CI will publish to PyPI."
|
|
54
|
+
|
|
55
|
+
patch-release: VERSION = $(CURRENT_MAJOR).$(CURRENT_MINOR).$(shell echo $$(($(CURRENT_BUILD) + 1)))
|
|
56
|
+
patch-release: release
|
|
57
|
+
|
|
58
|
+
minor-release: VERSION = $(CURRENT_MAJOR).$(shell echo $$(($(CURRENT_MINOR) + 1))).0
|
|
59
|
+
minor-release: release
|
|
60
|
+
|
|
61
|
+
major-release: VERSION = $(shell echo $$(($(CURRENT_MAJOR) + 1))).0.0
|
|
62
|
+
major-release: release
|
|
63
|
+
|
|
64
|
+
dev-release:
|
|
65
|
+
gh workflow run publish-dev.yml
|
|
66
|
+
@echo "Dev release workflow triggered."
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: databao
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
License-File: LICENSE
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Requires-Dist: adbc-driver-manager>=1.10.0
|
|
7
7
|
Requires-Dist: adbc-driver-snowflake>=1.10.0
|
|
8
8
|
Requires-Dist: click<9.0.0,>=8.2.1
|
|
9
|
-
Requires-Dist: databao-agent
|
|
10
|
-
Requires-Dist: databao-context-engine[snowflake]
|
|
9
|
+
Requires-Dist: databao-agent~=0.2.2
|
|
10
|
+
Requires-Dist: databao-context-engine[snowflake]~=0.7.2
|
|
11
11
|
Requires-Dist: fastmcp>=2.0.0
|
|
12
12
|
Requires-Dist: nh3>=0.2.15
|
|
13
13
|
Requires-Dist: prettytable>=3.10.0
|
|
@@ -117,6 +117,25 @@ pip install databao
|
|
|
117
117
|
For more details about commands, supported data sources, and configuration options,
|
|
118
118
|
visit the [docs](https://docs.databao.app).
|
|
119
119
|
|
|
120
|
+
## Releasing
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# Tag and push a specific version (CI publishes to PyPI)
|
|
124
|
+
make release VERSION=0.3.0
|
|
125
|
+
|
|
126
|
+
# Bump the patch version automatically (e.g. 0.3.0 -> 0.3.1)
|
|
127
|
+
make patch-release
|
|
128
|
+
|
|
129
|
+
# Bump the minor version automatically (e.g. 0.3.1 -> 0.4.0)
|
|
130
|
+
make minor-release
|
|
131
|
+
|
|
132
|
+
# Bump the major version automatically (e.g. 0.4.0 -> 1.0.0)
|
|
133
|
+
make major-release
|
|
134
|
+
|
|
135
|
+
# Trigger a dev release via GitHub Actions
|
|
136
|
+
make dev-release
|
|
137
|
+
```
|
|
138
|
+
|
|
120
139
|
## Contributing
|
|
121
140
|
|
|
122
141
|
We love contributions! Here’s how you can help:
|
|
@@ -88,6 +88,25 @@ pip install databao
|
|
|
88
88
|
For more details about commands, supported data sources, and configuration options,
|
|
89
89
|
visit the [docs](https://docs.databao.app).
|
|
90
90
|
|
|
91
|
+
## Releasing
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Tag and push a specific version (CI publishes to PyPI)
|
|
95
|
+
make release VERSION=0.3.0
|
|
96
|
+
|
|
97
|
+
# Bump the patch version automatically (e.g. 0.3.0 -> 0.3.1)
|
|
98
|
+
make patch-release
|
|
99
|
+
|
|
100
|
+
# Bump the minor version automatically (e.g. 0.3.1 -> 0.4.0)
|
|
101
|
+
make minor-release
|
|
102
|
+
|
|
103
|
+
# Bump the major version automatically (e.g. 0.4.0 -> 1.0.0)
|
|
104
|
+
make major-release
|
|
105
|
+
|
|
106
|
+
# Trigger a dev release via GitHub Actions
|
|
107
|
+
make dev-release
|
|
108
|
+
```
|
|
109
|
+
|
|
91
110
|
## Contributing
|
|
92
111
|
|
|
93
112
|
We love contributions! Here’s how you can help:
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
# Databao Demo — Streamlit in Snowflake
|
|
2
2
|
|
|
3
|
-
This project deploys the [Databao](https://github.com/JetBrains/databao-cli) Streamlit UI as a native **Streamlit-in-Snowflake (SiS)** application. It connects to a Snowflake database as its datasource, loads secrets at runtime via a Snowflake UDF, and runs the chat-based data exploration interface directly inside your Snowflake account.
|
|
3
|
+
This project deploys the [Databao](https://github.com/JetBrains/databao-cli) Streamlit UI as a native **Streamlit-in-Snowflake (SiS)** application. It connects to a Snowflake database as its datasource using OAuth (the Streamlit app's own session), loads secrets at runtime via a Snowflake UDF, and runs the chat-based data exploration interface directly inside your Snowflake account.
|
|
4
4
|
|
|
5
5
|
## Prerequisites
|
|
6
6
|
|
|
7
|
-
- A Snowflake account with
|
|
7
|
+
- A Snowflake account with privileges to create databases, warehouses, integrations, and Streamlit apps
|
|
8
8
|
- An OpenAI API key and/or an Anthropic API key
|
|
9
|
-
- A Snowflake database with data you want the Databao agent to explore
|
|
9
|
+
- A Snowflake warehouse and database with data you want the Databao agent to explore
|
|
10
10
|
|
|
11
11
|
## How It Works
|
|
12
12
|
|
|
13
13
|
1. **`setup.sql`** provisions everything needed inside Snowflake:
|
|
14
|
-
- A dedicated database
|
|
14
|
+
- A dedicated database and warehouse (named with a configurable suffix)
|
|
15
15
|
- Network rules and external access integrations for outbound HTTPS
|
|
16
|
-
- A service user with a permissive network policy
|
|
17
16
|
- A Git repository object pointing at `databao-cli` on GitHub
|
|
18
|
-
- Snowflake secrets for the OpenAI/Anthropic API keys and datasource
|
|
17
|
+
- Snowflake secrets for the OpenAI/Anthropic API keys and datasource coordinates (warehouse, database)
|
|
19
18
|
- A Python UDF (`get_secret`) that reads those secrets at runtime
|
|
20
|
-
- The Streamlit app itself, running on
|
|
19
|
+
- The Streamlit app itself, running on `SYSTEM_COMPUTE_POOL_CPU` (or an optional dedicated compute pool)
|
|
21
20
|
|
|
22
21
|
2. **`cleanup.sql`** removes all objects created by `setup.sql` for a given suffix.
|
|
23
22
|
|
|
@@ -27,7 +26,7 @@ This project deploys the [Databao](https://github.com/JetBrains/databao-cli) Str
|
|
|
27
26
|
- Locates and configures the ADBC Snowflake driver shared library so DuckDB's Snowflake extension can find it
|
|
28
27
|
- Launches the standard Databao UI in **read-only domain** mode
|
|
29
28
|
|
|
30
|
-
4. **`databao/domains/root/`** contains the Databao domain definition
|
|
29
|
+
4. **`databao/domains/root/`** contains the Databao domain definition -- a Snowflake datasource configured via environment variables and sample context files that ship with the demo.
|
|
31
30
|
|
|
32
31
|
## Setup
|
|
33
32
|
|
|
@@ -38,49 +37,24 @@ Open `setup.sql` and fill in the placeholder values at the top:
|
|
|
38
37
|
| Variable | Description |
|
|
39
38
|
|---|---|
|
|
40
39
|
| `suffix` | Name suffix appended to all Snowflake objects. Set to e.g. `V2` to create a fully independent copy (objects will be named `STREAMLIT_DATABAO_DB_V2`, etc.). Changing the suffix lets you run multiple independent instances side by side. |
|
|
41
|
-
| `
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `sf_ds_database` | Database to explore (see [below](#datasource-credentials-sf_ds_)) |
|
|
46
|
-
| `sf_ds_user` | Service user for the datasource (see [below](#datasource-credentials-sf_ds_)) |
|
|
47
|
-
| `sf_ds_password` | Password for that service user |
|
|
40
|
+
| `openai_api_key` | OpenAI API key |
|
|
41
|
+
| `anthropic_api_key` | Anthropic API key |
|
|
42
|
+
| `snowflake_ds_warehouse` | Warehouse the Databao agent will use to run queries against the datasource |
|
|
43
|
+
| `snowflake_ds_database` | Database containing the data the agent will explore |
|
|
48
44
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
These credentials are used by the Databao agent to connect to a Snowflake database via the Snowflake API. The agent reads data from this database to answer your questions.
|
|
52
|
-
|
|
53
|
-
- **`sf_ds_account`** — your Snowflake account identifier (e.g. `abc12345.us-east-1`). You can find it in Snowsight under your account menu.
|
|
54
|
-
|
|
55
|
-
- **`sf_ds_warehouse`** — the warehouse the agent will use to run queries. If you don't have one, create it in **Snowsight → Admin → Warehouses → + Warehouse** (an `XSMALL` warehouse is sufficient).
|
|
56
|
-
|
|
57
|
-
- **`sf_ds_database`** — the database containing the data the agent will explore.
|
|
58
|
-
|
|
59
|
-
- **`sf_ds_user`** and **`sf_ds_password`** — a service user that the agent authenticates as. To create one:
|
|
60
|
-
1. Go to **Snowsight → Admin → Users & Roles → + User**
|
|
61
|
-
2. Enter a name (e.g. `STREAMLIT_SERVICE_USER`)
|
|
62
|
-
3. Set a password
|
|
63
|
-
4. Click **Create User**
|
|
64
|
-
5. Grant the user access to the target database and warehouse:
|
|
65
|
-
|
|
66
|
-
```sql
|
|
67
|
-
GRANT USAGE ON WAREHOUSE <your_warehouse> TO USER <your_service_user>;
|
|
68
|
-
GRANT USAGE ON DATABASE <your_database> TO USER <your_service_user>;
|
|
69
|
-
GRANT USAGE ON ALL SCHEMAS IN DATABASE <your_database> TO USER <your_service_user>;
|
|
70
|
-
GRANT SELECT ON ALL TABLES IN DATABASE <your_database> TO USER <your_service_user>;
|
|
71
|
-
```
|
|
45
|
+
The datasource connection uses the Streamlit app's own OAuth session -- no separate service user or password is needed. The user running the Streamlit app must have access to the target warehouse and database.
|
|
72
46
|
|
|
73
47
|
### 2. Run the Setup Script
|
|
74
48
|
|
|
75
|
-
Execute the entire `setup.sql` in a Snowflake worksheet (or via SnowSQL)
|
|
49
|
+
Execute the entire `setup.sql` in a Snowflake worksheet (or via SnowSQL). The script is idempotent -- it uses `CREATE OR REPLACE` throughout, so re-running it is safe.
|
|
76
50
|
|
|
77
51
|
### 3. Open the App
|
|
78
52
|
|
|
79
|
-
Once the script finishes, navigate to **Streamlit** in Snowsight and open the app (named `STREAMLIT_DATABAO_APP_<suffix>`, e.g. `STREAMLIT_DATABAO_APP_DEMO`). The compute pool may take a minute or two to resume on first launch.
|
|
53
|
+
Once the script finishes, navigate to **Streamlit** in Snowsight and open the app (named `STREAMLIT_DATABAO_APP_<suffix>`, e.g. `STREAMLIT_DATABAO_APP_DEMO`). The system compute pool may take a minute or two to resume on first launch.
|
|
80
54
|
|
|
81
55
|
## Cleanup
|
|
82
56
|
|
|
83
|
-
To remove all Snowflake objects created by `setup.sql`, open `cleanup.sql`, set the same `suffix` you used during setup, and run the script
|
|
57
|
+
To remove all Snowflake objects created by `setup.sql`, open `cleanup.sql`, set the same `suffix` you used during setup, and run the script. This drops the database (cascading to all database-scoped objects), integrations, and warehouse.
|
|
84
58
|
|
|
85
59
|
## Local Development
|
|
86
60
|
|
|
@@ -91,11 +65,11 @@ uv sync
|
|
|
91
65
|
# Set the required environment variables
|
|
92
66
|
export OPENAI_API_KEY="..."
|
|
93
67
|
export ANTHROPIC_API_KEY="..."
|
|
94
|
-
export
|
|
68
|
+
export SNOWFLAKE_ACCOUNT="..." # e.g. abc12345
|
|
69
|
+
export SNOWFLAKE_HOST="..." # e.g. abc12345.snowflakecomputing.com
|
|
70
|
+
export SNOWFLAKE_DS_TOKEN="..." # OAuth token for datasource access
|
|
95
71
|
export SNOWFLAKE_DS_WAREHOUSE="..."
|
|
96
72
|
export SNOWFLAKE_DS_DATABASE="..."
|
|
97
|
-
export SNOWFLAKE_DS_USER="..."
|
|
98
|
-
export SNOWFLAKE_DS_PASSWORD="..."
|
|
99
73
|
|
|
100
74
|
# Run the Streamlit app
|
|
101
75
|
uv run streamlit run src/databao_snowflake_demo/app.py -- \
|
|
@@ -118,5 +92,5 @@ To test a dev/pre-release version, update the version specifier in `pyproject.to
|
|
|
118
92
|
## Notes
|
|
119
93
|
|
|
120
94
|
- The app runs in **read-only domain** mode — datasource configuration and domain builds are disabled in the UI. All domain setup is done ahead of time via the files in `databao/domains/root/`.
|
|
121
|
-
- The
|
|
95
|
+
- The app uses `SYSTEM_COMPUTE_POOL_CPU` by default. To use a dedicated compute pool, uncomment the relevant section in `setup.sql`.
|
|
122
96
|
- Network egress is allowed on ports 80 and 443 to enable OpenAI/Anthropic API calls and Snowflake datasource connections.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-- ============================================================
|
|
2
|
+
-- CLEANUP: Drop all objects created by setup.sql for a given suffix.
|
|
3
|
+
-- Set the same suffix you used in setup.sql, then run this script.
|
|
4
|
+
-- ============================================================
|
|
5
|
+
|
|
6
|
+
SET suffix = 'DEMO';
|
|
7
|
+
|
|
8
|
+
-- Derived object names (must match setup.sql)
|
|
9
|
+
SET database_name = 'STREAMLIT_DATABAO_DB_' || $suffix;
|
|
10
|
+
SET app_warehouse = 'STREAMLIT_DATABAO_WAREHOUSE_' || $suffix;
|
|
11
|
+
SET git_integration = 'STREAMLIT_DATABAO_GIT_INTEGRATION_' || $suffix;
|
|
12
|
+
SET app_eai = 'STREAMLIT_DATABAO_EAI_' || $suffix;
|
|
13
|
+
SET secrets_access = 'STREAMLIT_DATABAO_SECRETS_ACCESS_' || $suffix;
|
|
14
|
+
|
|
15
|
+
-- Database (cascades: Streamlit app, UDF, secrets, git repo, network rule)
|
|
16
|
+
DROP DATABASE IF EXISTS IDENTIFIER($database_name);
|
|
17
|
+
|
|
18
|
+
-- External access integrations
|
|
19
|
+
DROP INTEGRATION IF EXISTS IDENTIFIER($secrets_access);
|
|
20
|
+
DROP INTEGRATION IF EXISTS IDENTIFIER($app_eai);
|
|
21
|
+
|
|
22
|
+
-- API integration (git)
|
|
23
|
+
DROP INTEGRATION IF EXISTS IDENTIFIER($git_integration);
|
|
24
|
+
|
|
25
|
+
-- Warehouse
|
|
26
|
+
DROP WAREHOUSE IF EXISTS IDENTIFIER($app_warehouse);
|
|
27
|
+
|
|
28
|
+
SELECT 'Streamlit app STREAMLIT_DATABAO_APP_' || $suffix || ' cleaned up successfully.' AS STATUS;
|
|
@@ -5,8 +5,9 @@ description = "Databao demo project for Snowflake"
|
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11,<3.12"
|
|
7
7
|
dependencies = [
|
|
8
|
-
"databao
|
|
9
|
-
"databao-
|
|
8
|
+
"databao~=0.3.5",
|
|
9
|
+
"databao-agent~=0.2.1",
|
|
10
|
+
"databao-context-engine[snowflake]~=0.7.2",
|
|
10
11
|
"streamlit[snowflake]>=1.53.0",
|
|
11
12
|
"adbc-driver-snowflake>=1.10.0",
|
|
12
13
|
"adbc-driver-manager>=1.10.0",
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
-- ============================================================
|
|
2
|
+
-- CONFIGURATION: Set these values before running the script
|
|
3
|
+
-- ============================================================
|
|
4
|
+
|
|
5
|
+
-- Name suffix: change this to create a fully independent set of all
|
|
6
|
+
-- Snowflake objects (database, warehouse, compute pool, integrations, etc.).
|
|
7
|
+
-- Leave empty for the default installation.
|
|
8
|
+
-- Example: SET suffix = 'V2';
|
|
9
|
+
SET suffix = 'DEMO';
|
|
10
|
+
|
|
11
|
+
-- Secrets
|
|
12
|
+
SET openai_api_key = '<YOUR_OPENAI_API_KEY>';
|
|
13
|
+
SET anthropic_api_key = '<YOUR_ANTHROPIC_API_KEY>';
|
|
14
|
+
SET snowflake_ds_warehouse = '<SNOWFLAKE_DATASOURCE_WAREHOUSE>';
|
|
15
|
+
SET snowflake_ds_database = '<SNOWFLAKE_DATASOURCE_DATABASE>';
|
|
16
|
+
|
|
17
|
+
-- Git repository
|
|
18
|
+
SET git_repo_origin = 'https://github.com/JetBrains/databao-cli.git';
|
|
19
|
+
SET git_repo_name = '"databao-cli"';
|
|
20
|
+
SET git_branch = '"main"';
|
|
21
|
+
|
|
22
|
+
-- Streamlit app
|
|
23
|
+
SET streamlit_main_file = 'examples/demo-snowflake-project/src/databao_snowflake_demo/app.py';
|
|
24
|
+
|
|
25
|
+
-- Derived object names (controlled by $suffix — do not modify)
|
|
26
|
+
SET database_name = 'STREAMLIT_DATABAO_DB_' || $suffix;
|
|
27
|
+
SET egress_rule = 'STREAMLIT_DATABAO_EGRESS_RULE_' || $suffix;
|
|
28
|
+
SET git_integration = 'STREAMLIT_DATABAO_GIT_INTEGRATION_' || $suffix;
|
|
29
|
+
SET app_name = 'STREAMLIT_DATABAO_APP_' || $suffix;
|
|
30
|
+
SET app_warehouse = 'STREAMLIT_DATABAO_WAREHOUSE_' || $suffix;
|
|
31
|
+
SET app_eai = 'STREAMLIT_DATABAO_EAI_' || $suffix;
|
|
32
|
+
SET secrets_access = 'STREAMLIT_DATABAO_SECRETS_ACCESS_' || $suffix;
|
|
33
|
+
|
|
34
|
+
SET app_compute_pool = 'SYSTEM_COMPUTE_POOL_CPU';
|
|
35
|
+
|
|
36
|
+
-- OPTIONAL: Uncomment to create a dedicated compute pool for the app
|
|
37
|
+
-- SET app_compute_pool = 'STREAMLIT_DATABAO_COMPUTE_POOL_' || $suffix;
|
|
38
|
+
--
|
|
39
|
+
-- DROP COMPUTE POOL IF EXISTS IDENTIFIER($app_compute_pool);
|
|
40
|
+
-- CREATE COMPUTE POOL IDENTIFIER($app_compute_pool)
|
|
41
|
+
-- MIN_NODES = 1
|
|
42
|
+
-- MAX_NODES = 1
|
|
43
|
+
-- INSTANCE_FAMILY = CPU_X64_M
|
|
44
|
+
-- AUTO_RESUME = TRUE
|
|
45
|
+
-- AUTO_SUSPEND_SECS = 300;
|
|
46
|
+
|
|
47
|
+
CREATE OR REPLACE DATABASE IDENTIFIER($database_name);
|
|
48
|
+
|
|
49
|
+
USE DATABASE IDENTIFIER($database_name);
|
|
50
|
+
USE SCHEMA PUBLIC;
|
|
51
|
+
|
|
52
|
+
CREATE OR REPLACE WAREHOUSE IDENTIFIER($app_warehouse)
|
|
53
|
+
WAREHOUSE_SIZE = 'XSMALL'
|
|
54
|
+
AUTO_SUSPEND = 60
|
|
55
|
+
AUTO_RESUME = TRUE;
|
|
56
|
+
|
|
57
|
+
USE WAREHOUSE IDENTIFIER($app_warehouse);
|
|
58
|
+
|
|
59
|
+
CREATE OR REPLACE SECRET openai_api_key
|
|
60
|
+
TYPE = GENERIC_STRING
|
|
61
|
+
SECRET_STRING = $openai_api_key;
|
|
62
|
+
|
|
63
|
+
CREATE OR REPLACE SECRET anthropic_api_key
|
|
64
|
+
TYPE = GENERIC_STRING
|
|
65
|
+
SECRET_STRING = $anthropic_api_key;
|
|
66
|
+
|
|
67
|
+
CREATE OR REPLACE SECRET snowflake_ds_warehouse
|
|
68
|
+
TYPE = GENERIC_STRING
|
|
69
|
+
SECRET_STRING = $snowflake_ds_warehouse;
|
|
70
|
+
|
|
71
|
+
CREATE OR REPLACE SECRET snowflake_ds_database
|
|
72
|
+
TYPE = GENERIC_STRING
|
|
73
|
+
SECRET_STRING = $snowflake_ds_database;
|
|
74
|
+
|
|
75
|
+
CREATE OR REPLACE NETWORK RULE IDENTIFIER($egress_rule)
|
|
76
|
+
MODE = EGRESS
|
|
77
|
+
TYPE = HOST_PORT
|
|
78
|
+
VALUE_LIST = ('0.0.0.0:443', '0.0.0.0:80');
|
|
79
|
+
|
|
80
|
+
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION IDENTIFIER($app_eai)
|
|
81
|
+
ALLOWED_NETWORK_RULES = ($egress_rule)
|
|
82
|
+
ENABLED = TRUE;
|
|
83
|
+
|
|
84
|
+
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION IDENTIFIER($secrets_access)
|
|
85
|
+
ALLOWED_NETWORK_RULES = ($egress_rule)
|
|
86
|
+
ALLOWED_AUTHENTICATION_SECRETS = (
|
|
87
|
+
openai_api_key,
|
|
88
|
+
anthropic_api_key,
|
|
89
|
+
snowflake_ds_warehouse,
|
|
90
|
+
snowflake_ds_database
|
|
91
|
+
) ENABLED = TRUE;
|
|
92
|
+
|
|
93
|
+
CREATE OR REPLACE API INTEGRATION IDENTIFIER($git_integration)
|
|
94
|
+
API_PROVIDER = git_https_api
|
|
95
|
+
API_ALLOWED_PREFIXES = ($git_repo_origin)
|
|
96
|
+
ALLOWED_AUTHENTICATION_SECRETS = ()
|
|
97
|
+
ENABLED = TRUE;
|
|
98
|
+
|
|
99
|
+
CREATE OR REPLACE GIT REPOSITORY IDENTIFIER($git_repo_name)
|
|
100
|
+
ORIGIN = $git_repo_origin
|
|
101
|
+
API_INTEGRATION = $git_integration;
|
|
102
|
+
|
|
103
|
+
ALTER GIT REPOSITORY IDENTIFIER($git_repo_name) FETCH;
|
|
104
|
+
|
|
105
|
+
DECLARE
|
|
106
|
+
_sql VARCHAR;
|
|
107
|
+
_streamlit_stage_path VARCHAR;
|
|
108
|
+
BEGIN
|
|
109
|
+
_streamlit_stage_path := '@' || $database_name || '."PUBLIC".' || $git_repo_name || '/branches/' || $git_branch || '/';
|
|
110
|
+
|
|
111
|
+
_sql := 'CREATE OR REPLACE STREAMLIT "' || $app_name || '"'
|
|
112
|
+
|| ' FROM ''' || :_streamlit_stage_path || ''''
|
|
113
|
+
|| ' MAIN_FILE = ''' || $streamlit_main_file || ''''
|
|
114
|
+
|| ' QUERY_WAREHOUSE = ''' || $app_warehouse || ''''
|
|
115
|
+
|| ' COMPUTE_POOL = ''' || $app_compute_pool || ''''
|
|
116
|
+
|| ' RUNTIME_NAME = ''SYSTEM$ST_CONTAINER_RUNTIME_PY3_11'''
|
|
117
|
+
|| ' EXTERNAL_ACCESS_INTEGRATIONS = (' || $app_eai || ')'
|
|
118
|
+
|| ' COMMENT = ''Databao Snowflake Connection Test UI''';
|
|
119
|
+
EXECUTE IMMEDIATE :_sql;
|
|
120
|
+
END;
|
|
121
|
+
|
|
122
|
+
DECLARE
|
|
123
|
+
_sql VARCHAR;
|
|
124
|
+
BEGIN
|
|
125
|
+
_sql := 'CREATE OR REPLACE FUNCTION get_secret(secret_name STRING)'
|
|
126
|
+
|| ' RETURNS STRING'
|
|
127
|
+
|| ' LANGUAGE PYTHON'
|
|
128
|
+
|| ' RUNTIME_VERSION = 3.11'
|
|
129
|
+
|| ' HANDLER = ''get_secret'''
|
|
130
|
+
|| ' EXTERNAL_ACCESS_INTEGRATIONS = (' || $secrets_access || ')'
|
|
131
|
+
|| ' SECRETS = ('
|
|
132
|
+
|| ' ''openai_api_key'' = openai_api_key,'
|
|
133
|
+
|| ' ''anthropic_api_key'' = anthropic_api_key,'
|
|
134
|
+
|| ' ''snowflake_ds_warehouse'' = snowflake_ds_warehouse,'
|
|
135
|
+
|| ' ''snowflake_ds_database'' = snowflake_ds_database'
|
|
136
|
+
|| ') AS '
|
|
137
|
+
|| '$$' || CHR(10)
|
|
138
|
+
|| 'import _snowflake' || CHR(10)
|
|
139
|
+
|| CHR(10)
|
|
140
|
+
|| 'def get_secret(secret_name):' || CHR(10)
|
|
141
|
+
|| ' return _snowflake.get_generic_secret_string(secret_name)' || CHR(10)
|
|
142
|
+
|| '$$';
|
|
143
|
+
|
|
144
|
+
EXECUTE IMMEDIATE :_sql;
|
|
145
|
+
END;
|
|
@@ -13,11 +13,8 @@ logger = logging.getLogger(__name__)
|
|
|
13
13
|
SNOWFLAKE_SECRETS: dict[str, str] = {
|
|
14
14
|
"openai_api_key": "OPENAI_API_KEY",
|
|
15
15
|
"anthropic_api_key": "ANTHROPIC_API_KEY",
|
|
16
|
-
"snowflake_ds_account": "SNOWFLAKE_DS_ACCOUNT",
|
|
17
16
|
"snowflake_ds_warehouse": "SNOWFLAKE_DS_WAREHOUSE",
|
|
18
17
|
"snowflake_ds_database": "SNOWFLAKE_DS_DATABASE",
|
|
19
|
-
"snowflake_ds_user": "SNOWFLAKE_DS_USER",
|
|
20
|
-
"snowflake_ds_password": "SNOWFLAKE_DS_PASSWORD",
|
|
21
18
|
}
|
|
22
19
|
|
|
23
20
|
ADBC_LIB = "libadbc_driver_snowflake.so"
|