databao 0.3.1__tar.gz → 0.3.3.dev2__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.
Files changed (132) hide show
  1. {databao-0.3.1 → databao-0.3.3.dev2}/PKG-INFO +2 -2
  2. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/bigquery_utils.py +1 -1
  3. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/utils/path_utils.py +2 -2
  4. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_bigquery.py +3 -3
  5. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_duckdb.py +2 -2
  6. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_mysql.py +2 -2
  7. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_postgres.py +2 -2
  8. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_snowflake.py +4 -3
  9. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_sqlite.py +2 -2
  10. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/README.md +22 -13
  11. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/pyproject.toml +5 -4
  12. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/setup.sql +21 -22
  13. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/src/databao_snowflake_demo/app.py +1 -0
  14. databao-0.3.3.dev2/examples/demo-snowflake-project/uv.lock +3468 -0
  15. {databao-0.3.1 → databao-0.3.3.dev2}/pyproject.toml +2 -2
  16. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/app.py +11 -8
  17. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/chat.py +11 -1
  18. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/models/settings.py +9 -6
  19. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/agent_settings.py +67 -31
  20. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/welcome.py +32 -7
  21. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/llm_models.py +2 -2
  22. {databao-0.3.1 → databao-0.3.3.dev2}/uv.lock +41 -126
  23. {databao-0.3.1 → databao-0.3.3.dev2}/.cursor/rules/python-style.mdc +0 -0
  24. {databao-0.3.1 → databao-0.3.3.dev2}/.github/actions/setup-project/action.yml +0 -0
  25. {databao-0.3.1 → databao-0.3.3.dev2}/.github/workflows/e2e-tests.yml +0 -0
  26. {databao-0.3.1 → databao-0.3.3.dev2}/.github/workflows/publish-dev.yml +0 -0
  27. {databao-0.3.1 → databao-0.3.3.dev2}/.github/workflows/publish.yml +0 -0
  28. {databao-0.3.1 → databao-0.3.3.dev2}/.github/workflows/python-package.yml +0 -0
  29. {databao-0.3.1 → databao-0.3.3.dev2}/.gitignore +0 -0
  30. {databao-0.3.1 → databao-0.3.3.dev2}/.pre-commit-config.yaml +0 -0
  31. {databao-0.3.1 → databao-0.3.3.dev2}/.python-version +0 -0
  32. {databao-0.3.1 → databao-0.3.3.dev2}/CONTRIBUTING.md +0 -0
  33. {databao-0.3.1 → databao-0.3.3.dev2}/LICENSE +0 -0
  34. {databao-0.3.1 → databao-0.3.3.dev2}/Makefile +0 -0
  35. {databao-0.3.1 → databao-0.3.3.dev2}/README.md +0 -0
  36. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/.gitignore +0 -0
  37. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/pytest.ini +0 -0
  38. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/__init__.py +0 -0
  39. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/__init__.py +0 -0
  40. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/duckdb_utils.py +0 -0
  41. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/mysql_utils.py +0 -0
  42. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/postgres_utils.py +0 -0
  43. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/snowflake_utils.py +0 -0
  44. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/sqlite_utils.py +0 -0
  45. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/project_utils.py +0 -0
  46. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/utils/__init__.py +0 -0
  47. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/utils/pexpect_utils.py +0 -0
  48. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/utils/yaml_compare.py +0 -0
  49. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/conftest.py +0 -0
  50. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/bigquery_introspections.yaml +0 -0
  51. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/duckdb_introspections.yaml +0 -0
  52. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/mysql_introspections.yaml +0 -0
  53. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/postgres_introspections.yaml +0 -0
  54. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/snowflake_introspections.yaml +0 -0
  55. {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/sqlite_introspections.yaml +0 -0
  56. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/dce.ini +0 -0
  57. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/examples/src/databases/example_postgres.yaml +0 -0
  58. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/examples/src/files/documentation.md +0 -0
  59. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/examples/src/files/notes.txt +0 -0
  60. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/src/snowflake.yaml +0 -0
  61. {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/src/databao_snowflake_demo/__init__.py +0 -0
  62. {databao-0.3.1 → databao-0.3.3.dev2}/scripts/generate_licenses.py +0 -0
  63. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/__init__.py +0 -0
  64. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/__main__.py +0 -0
  65. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/__init__.py +0 -0
  66. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/app.py +0 -0
  67. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/ask.py +0 -0
  68. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/build.py +0 -0
  69. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/context_engine_cli.py +0 -0
  70. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/datasource/__init__.py +0 -0
  71. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/datasource/add_datasource_config.py +0 -0
  72. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/datasource/check_datasource_connection.py +0 -0
  73. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/init.py +0 -0
  74. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/mcp.py +0 -0
  75. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/status.py +0 -0
  76. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/executor_utils.py +0 -0
  77. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/log/__init__.py +0 -0
  78. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/log/llm_errors.py +0 -0
  79. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/log/logging.py +0 -0
  80. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/__init__.py +0 -0
  81. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/server.py +0 -0
  82. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/tools/__init__.py +0 -0
  83. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/tools/databao_ask/__init__.py +0 -0
  84. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/tools/databao_ask/agent_factory.py +0 -0
  85. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/tools/databao_ask/tool.py +0 -0
  86. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/project/__init__.py +0 -0
  87. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/project/layout.py +0 -0
  88. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/__init__.py +0 -0
  89. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/assets/bao.png +0 -0
  90. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/cli.py +0 -0
  91. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/__init__.py +0 -0
  92. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/datasource_form.py +0 -0
  93. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/datasource_manager.py +0 -0
  94. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/icons.py +0 -0
  95. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/results.py +0 -0
  96. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/sidebar.py +0 -0
  97. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/status.py +0 -0
  98. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/models/__init__.py +0 -0
  99. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/models/chat_session.py +0 -0
  100. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/__init__.py +0 -0
  101. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/chat.py +0 -0
  102. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/context_settings.py +0 -0
  103. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/general_settings.py +0 -0
  104. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/project_utils.py +0 -0
  105. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/__init__.py +0 -0
  106. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/build_service.py +0 -0
  107. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/chat_persistence.py +0 -0
  108. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/chat_title.py +0 -0
  109. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/dce_operations.py +0 -0
  110. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/query_executor.py +0 -0
  111. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/settings_persistence.py +0 -0
  112. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/storage.py +0 -0
  113. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/streaming.py +0 -0
  114. {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/suggestions.py +0 -0
  115. {databao-0.3.1 → databao-0.3.3.dev2}/tests/__init__.py +0 -0
  116. {databao-0.3.1 → databao-0.3.3.dev2}/tests/check_datasource/__init__.py +0 -0
  117. {databao-0.3.1 → databao-0.3.3.dev2}/tests/check_datasource/test_check_datasource.py +0 -0
  118. {databao-0.3.1 → databao-0.3.3.dev2}/tests/check_datasource/test_project/databao/domains/root/dce.ini +0 -0
  119. {databao-0.3.1 → databao-0.3.3.dev2}/tests/check_datasource/test_project/databao/domains/root/src/myduck.yaml +0 -0
  120. {databao-0.3.1 → databao-0.3.3.dev2}/tests/conftest.py +0 -0
  121. {databao-0.3.1 → databao-0.3.3.dev2}/tests/plugins/__init__.py +0 -0
  122. {databao-0.3.1 → databao-0.3.3.dev2}/tests/plugins/get_loaded_plugins.py +0 -0
  123. {databao-0.3.1 → databao-0.3.3.dev2}/tests/plugins/test_plugins.py +0 -0
  124. {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_add_datasource.py +0 -0
  125. {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_app.py +0 -0
  126. {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_ask.py +0 -0
  127. {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_build.py +0 -0
  128. {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_init.py +0 -0
  129. {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_mcp.py +0 -0
  130. {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_status.py +0 -0
  131. {databao-0.3.1 → databao-0.3.3.dev2}/tests/utils/__init__.py +0 -0
  132. {databao-0.3.1 → databao-0.3.3.dev2}/tests/utils/project.py +0 -0
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: databao
3
- Version: 0.3.1
3
+ Version: 0.3.3.dev2
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~=0.1.4.dev8
9
+ Requires-Dist: databao-agent~=0.2.0
10
10
  Requires-Dist: databao-context-engine[snowflake]~=0.6.0
11
11
  Requires-Dist: fastmcp>=2.0.0
12
12
  Requires-Dist: nh3>=0.2.15
@@ -34,7 +34,7 @@ class BigQueryServiceAccountJsonAuth:
34
34
 
35
35
  def apply(self, child) -> None:
36
36
  child_answer(child, r"connection\.auth\.type\?", "BigQueryServiceAccountJsonAuth")
37
- child_answer_safe(child, r"connection\.auth\.credentials_json\? \(Optional\)", self.credentials_json)
37
+ child_answer_safe(child, r"connection\.auth\.credentials_json\?:", self.credentials_json)
38
38
 
39
39
 
40
40
  @dataclass()
@@ -9,8 +9,8 @@ ARTIFACT_DIR = get_root() / "artifacts"
9
9
  TEST_RESOURCES_DIR = get_root() / "tests" / "resources"
10
10
 
11
11
 
12
- def get_all_results(project_path: Path):
13
- return project_path.joinpath("databao", "domains", "root", "output", "all_results.yaml")
12
+ def get_datasource_result(project_path: Path, datasource_name: str):
13
+ return project_path.joinpath("databao", "domains", "root", "output", f"{datasource_name}.yaml")
14
14
 
15
15
 
16
16
  def get_src_folder(project_path: Path):
@@ -11,7 +11,7 @@ from databases.bigquery_utils import (
11
11
  BigQueryServiceAccountKeyFileAuth,
12
12
  )
13
13
  from project_utils import execute_build, execute_init
14
- from utils.path_utils import get_all_results
14
+ from utils.path_utils import get_datasource_result
15
15
  from utils.yaml_compare import assert_introspections_equal
16
16
 
17
17
 
@@ -26,7 +26,7 @@ def test_databao_build_bigquery_datasource_from_init_config_from_json(project_fo
26
26
  )
27
27
  execute_init(project_folder, db)
28
28
  execute_build(project_folder)
29
- assert_introspections_equal(get_all_results(project_folder), "bigquery_introspections.yaml")
29
+ assert_introspections_equal(get_datasource_result(project_folder, db.datasource_name), "bigquery_introspections.yaml")
30
30
 
31
31
 
32
32
  @allure.title("Test databao build with BigQuery using BigQueryServiceAccountKeyFileAuth auth type")
@@ -43,4 +43,4 @@ def test_databao_build_bigquery_datasource_from_init_config_from_json_file_path(
43
43
  )
44
44
  execute_init(project_folder, db)
45
45
  execute_build(project_folder)
46
- assert_introspections_equal(get_all_results(project_folder), "bigquery_introspections.yaml")
46
+ assert_introspections_equal(get_datasource_result(project_folder, db.datasource_name), "bigquery_introspections.yaml")
@@ -4,7 +4,7 @@ import allure
4
4
  import pytest
5
5
  from databases.duckdb_utils import DuckdbDB
6
6
  from project_utils import execute_build, execute_init
7
- from utils.path_utils import get_all_results
7
+ from utils.path_utils import get_datasource_result
8
8
  from utils.yaml_compare import assert_introspections_equal
9
9
 
10
10
 
@@ -20,4 +20,4 @@ def test_databao_build_duckdb(project_folder: Path, temp_duckdb_file: Path):
20
20
  db = DuckdbDB.prepare_database(temp_duckdb_file)
21
21
  execute_init(project_folder, db)
22
22
  execute_build(project_folder)
23
- assert_introspections_equal(get_all_results(project_folder), "duckdb_introspections.yaml")
23
+ assert_introspections_equal(get_datasource_result(project_folder, db.datasource_name), "duckdb_introspections.yaml")
@@ -5,7 +5,7 @@ import pytest
5
5
  from databases.mysql_utils import MysqlDB
6
6
  from project_utils import execute_build, execute_init
7
7
  from testcontainers.mysql import MySqlContainer
8
- from utils.path_utils import get_all_results
8
+ from utils.path_utils import get_datasource_result
9
9
  from utils.yaml_compare import assert_introspections_equal
10
10
 
11
11
 
@@ -23,4 +23,4 @@ def test_databao_build_mysql(project_folder: Path, mysql_container: MySqlContain
23
23
  db = MysqlDB.prepare_database(mysql_container)
24
24
  execute_init(project_folder, db)
25
25
  execute_build(project_folder)
26
- assert_introspections_equal(get_all_results(project_folder), "mysql_introspections.yaml")
26
+ assert_introspections_equal(get_datasource_result(project_folder, db.datasource_name), "mysql_introspections.yaml")
@@ -5,7 +5,7 @@ import pytest
5
5
  from databases.postgres_utils import PostgresDB
6
6
  from project_utils import execute_build, execute_init
7
7
  from testcontainers.postgres import PostgresContainer
8
- from utils.path_utils import get_all_results
8
+ from utils.path_utils import get_datasource_result
9
9
  from utils.yaml_compare import assert_introspections_equal
10
10
 
11
11
 
@@ -25,4 +25,4 @@ def test_databao_build_postgres(project_folder: Path, postgres_container: Postgr
25
25
  db = PostgresDB.prepare_database(postgres_container)
26
26
  execute_init(project_folder, db)
27
27
  execute_build(project_folder)
28
- assert_introspections_equal(get_all_results(project_folder), "postgres_introspections.yaml")
28
+ assert_introspections_equal(get_datasource_result(project_folder, db.datasource_name), "postgres_introspections.yaml")
@@ -4,7 +4,7 @@ import allure
4
4
  import pytest
5
5
  from databases.snowflake_utils import get_working_snowflake_connection
6
6
  from project_utils import execute_build, execute_init
7
- from utils.path_utils import get_all_results
7
+ from utils.path_utils import get_datasource_result
8
8
  from utils.yaml_compare import assert_introspections_equal
9
9
 
10
10
 
@@ -14,6 +14,7 @@ from utils.yaml_compare import assert_introspections_equal
14
14
  )
15
15
  @pytest.mark.skip(reason="Temporarily disabled")
16
16
  def test_databao_build_snowflake_datasource_from_init_config(project_folder: Path):
17
- execute_init(project_folder, get_working_snowflake_connection())
17
+ db = get_working_snowflake_connection()
18
+ execute_init(project_folder, db)
18
19
  execute_build(project_folder)
19
- assert_introspections_equal(get_all_results(project_folder), "snowflake_introspections.yaml")
20
+ assert_introspections_equal(get_datasource_result(project_folder, db.datasource_name), "snowflake_introspections.yaml")
@@ -4,7 +4,7 @@ import allure
4
4
  import pytest
5
5
  from databases.sqlite_utils import SqliteDB
6
6
  from project_utils import execute_build, execute_init
7
- from utils.path_utils import get_all_results
7
+ from utils.path_utils import get_datasource_result
8
8
  from utils.yaml_compare import assert_introspections_equal
9
9
 
10
10
 
@@ -20,4 +20,4 @@ def test_databao_build_sqlite(project_folder: Path, temp_sqlite_file: Path):
20
20
  db = SqliteDB.prepare_database(temp_sqlite_file)
21
21
  execute_init(project_folder, db)
22
22
  execute_build(project_folder)
23
- assert_introspections_equal(get_all_results(project_folder), "sqlite_introspections.yaml")
23
+ assert_introspections_equal(get_datasource_result(project_folder, db.datasource_name), "sqlite_introspections.yaml")
@@ -5,8 +5,7 @@ This project deploys the [Databao](https://github.com/JetBrains/databao-cli) Str
5
5
  ## Prerequisites
6
6
 
7
7
  - A Snowflake account with `ACCOUNTADMIN` privileges (for the initial setup)
8
- - A GitHub personal access token (PAT) with read access to the `databao-cli` repository
9
- - An OpenAI API key
8
+ - An OpenAI API key and/or an Anthropic API key
10
9
  - A second Snowflake account/user to serve as the **datasource** (the database you want to explore through Databao)
11
10
 
12
11
  ## How It Works
@@ -16,13 +15,13 @@ This project deploys the [Databao](https://github.com/JetBrains/databao-cli) Str
16
15
  - Network rules and external access integrations for outbound HTTPS
17
16
  - A service user with a permissive network policy
18
17
  - A Git repository object pointing at `databao-cli` on GitHub
19
- - Snowflake secrets for the OpenAI API key and datasource credentials
18
+ - Snowflake secrets for the OpenAI and Anthropic API keys and datasource credentials
20
19
  - A Python UDF (`get_secret`) that reads those secrets at runtime
21
20
  - The Streamlit app itself, running on a container runtime (`CPU_X64_M`)
22
21
 
23
22
  2. **`app.py`** is the Streamlit entry point that adapts `databao-cli`'s UI for Snowflake:
24
23
  - Detects whether it is running inside Snowflake (via `/snowflake/session/token`)
25
- - Calls `get_secret()` through a Snowflake SQL session to load secrets into environment variables (`OPENAI_API_KEY`, `SNOWFLAKE_DS_*`)
24
+ - Calls `get_secret()` through a Snowflake SQL session to load secrets into environment variables (`OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `SNOWFLAKE_DS_*`)
26
25
  - Locates and configures the ADBC Snowflake driver shared library so DuckDB's Snowflake extension can find it
27
26
  - Launches the standard Databao UI in **read-only domain** mode
28
27
 
@@ -36,14 +35,14 @@ Open `setup.sql` and fill in the placeholder values at the top:
36
35
 
37
36
  | Variable | Description |
38
37
  |---|---|
39
- | `git_pat` | GitHub PAT with repo read access |
40
- | `git_username` | GitHub username associated with the PAT |
41
38
  | `openai_key` | OpenAI API key |
39
+ | `anthropic_key` | Anthropic API key |
42
40
  | `sf_ds_account` | Snowflake datasource account identifier |
43
41
  | `sf_ds_warehouse` | Warehouse on the datasource account |
44
42
  | `sf_ds_database` | Database to explore |
45
43
  | `sf_ds_user` | User on the datasource account |
46
44
  | `sf_ds_password` | Password for that user |
45
+ | `streamlit_app_name` | Name of the Streamlit app object (default: `STREAMLIT_DATABAO_DEMO_SNOWFLAKE`) |
47
46
 
48
47
  ### 2. Run the Setup Script
49
48
 
@@ -51,18 +50,17 @@ Execute the entire `setup.sql` in a Snowflake worksheet (or via SnowSQL) while c
51
50
 
52
51
  ### 3. Open the App
53
52
 
54
- Once the script finishes, navigate to **Streamlit** in Snowsight and open **STREAMLIT_DATABAO_DEMO_SNOWFLAKE**. 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 by the name you configured in `streamlit_app_name`. The compute pool may take a minute or two to resume on first launch.
55
54
 
56
55
  ## Local Development
57
56
 
58
- The project is part of the `databao-cli` uv workspace. To run it locally:
59
-
60
57
  ```bash
61
- # From the databao-cli repository root
58
+ # From the examples/demo-snowflake-project directory
62
59
  uv sync
63
60
 
64
61
  # Set the required environment variables
65
62
  export OPENAI_API_KEY="..."
63
+ export ANTHROPIC_API_KEY="..."
66
64
  export SNOWFLAKE_DS_ACCOUNT="..."
67
65
  export SNOWFLAKE_DS_WAREHOUSE="..."
68
66
  export SNOWFLAKE_DS_DATABASE="..."
@@ -70,14 +68,25 @@ export SNOWFLAKE_DS_USER="..."
70
68
  export SNOWFLAKE_DS_PASSWORD="..."
71
69
 
72
70
  # Run the Streamlit app
73
- uv run streamlit run examples/demo-snowflake-project/src/databao_snowflake_demo/app.py -- \
74
- --project-dir examples/demo-snowflake-project
71
+ uv run streamlit run src/databao_snowflake_demo/app.py -- \
72
+ --project-dir .
75
73
  ```
76
74
 
77
75
  When running locally, the Snowflake secret-loading logic is skipped (it only activates inside a Snowflake container). Environment variables must be set manually.
78
76
 
77
+ ## Updating the `databao` Package
78
+
79
+ This project has its own `uv.lock` and installs `databao` from PyPI (not from the workspace). To update to a newer release:
80
+
81
+ ```bash
82
+ # From the examples/demo-snowflake-project directory
83
+ uv lock -P databao
84
+ ```
85
+
86
+ To test a dev/pre-release version, update the version specifier in `pyproject.toml` to include the pre-release tag (e.g. `databao>=0.4.0.dev1`), then re-lock. Pre-release specifiers tell `uv` to allow pre-releases for that package.
87
+
79
88
  ## Notes
80
89
 
81
90
  - 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/`.
82
91
  - The compute pool uses `CPU_X64_M` instances with auto-suspend after 5 minutes and auto-resume enabled.
83
- - Network egress is allowed on ports 80 and 443 to enable OpenAI API calls and Snowflake datasource connections.
92
+ - Network egress is allowed on ports 80 and 443 to enable OpenAI/Anthropic API calls and Snowflake datasource connections.
@@ -3,13 +3,14 @@ name = "databao-demo-snowflake-project"
3
3
  version = "0.1.0"
4
4
  description = "Databao demo project for Snowflake"
5
5
  readme = "README.md"
6
- requires-python = ">=3.11"
6
+ requires-python = ">=3.11,<3.12"
7
7
  dependencies = [
8
- "databao",
8
+ "databao>=0.3.2",
9
9
  ]
10
10
 
11
- [tool.uv.sources]
12
- databao = { workspace = true }
11
+ [tool.uv]
12
+ # DuckDB Snowflake community extension hasn't been built for 1.5.0 yet
13
+ constraint-dependencies = ["duckdb<1.5.0"]
13
14
 
14
15
  [build-system]
15
16
  requires = ["hatchling"]
@@ -3,9 +3,8 @@
3
3
  -- ============================================================
4
4
 
5
5
  -- Secrets
6
- SET git_pat = '<YOUR_GITHUB_PAT>';
7
- SET git_username = '<YOUR_GITHUB_USERNAME>';
8
6
  SET openai_key = '<YOUR_OPENAI_API_KEY>';
7
+ SET anthropic_key = '<YOUR_ANTHROPIC_API_KEY>';
9
8
  SET sf_ds_account = '<SNOWFLAKE_DATASOURCE_ACCOUNT>';
10
9
  SET sf_ds_warehouse = '<SNOWFLAKE_DATASOURCE_WAREHOUSE>';
11
10
  SET sf_ds_database = '<SNOWFLAKE_DATASOURCE_DATABASE>';
@@ -18,6 +17,7 @@ SET git_repo_name = 'databao-cli';
18
17
  SET git_branch = 'main';
19
18
 
20
19
  -- Streamlit app
20
+ SET streamlit_app_name = 'STREAMLIT_DATABAO_DEMO_SNOWFLAKE';
21
21
  SET streamlit_main_file = 'examples/demo-snowflake-project/src/databao_snowflake_demo/app.py';
22
22
 
23
23
  -- ============================================================
@@ -64,36 +64,28 @@ ALTER USER STREAMLIT_DATABAO_USER SET NETWORK_POLICY = 'STREAMLIT_DATABAO_NETWOR
64
64
  -- ============================================================
65
65
  DECLARE
66
66
  _sql VARCHAR;
67
- _git_pat VARCHAR;
68
- _git_username VARCHAR;
69
67
  _git_origin VARCHAR;
70
68
  _git_repo VARCHAR;
71
69
  _openai_key VARCHAR;
70
+ _anthropic_key VARCHAR;
72
71
  _ds_account VARCHAR;
73
72
  _ds_warehouse VARCHAR;
74
73
  _ds_database VARCHAR;
75
74
  _ds_user VARCHAR;
76
75
  _ds_password VARCHAR;
77
76
  BEGIN
78
- SELECT $git_pat, $git_username, $git_repo_origin, $git_repo_name,
79
- $openai_key, $sf_ds_account, $sf_ds_warehouse, $sf_ds_database,
77
+ SELECT $git_repo_origin, $git_repo_name,
78
+ $openai_key, $anthropic_key, $sf_ds_account, $sf_ds_warehouse, $sf_ds_database,
80
79
  $sf_ds_user, $sf_ds_password
81
- INTO :_git_pat, :_git_username, :_git_origin, :_git_repo,
82
- :_openai_key, :_ds_account, :_ds_warehouse, :_ds_database,
80
+ INTO :_git_origin, :_git_repo,
81
+ :_openai_key, :_anthropic_key, :_ds_account, :_ds_warehouse, :_ds_database,
83
82
  :_ds_user, :_ds_password;
84
83
 
85
- -- Git PAT secret
86
- _sql := 'CREATE OR REPLACE SECRET STREAMLIT_DATABAO.PUBLIC.git_pat_secret'
87
- || ' TYPE = PASSWORD'
88
- || ' USERNAME = ''' || :_git_username || ''''
89
- || ' PASSWORD = ''' || :_git_pat || '''';
90
- EXECUTE IMMEDIATE :_sql;
91
-
92
- -- API integration for Git
84
+ -- API integration for Git (no credentials needed — public repo)
93
85
  _sql := 'CREATE OR REPLACE API INTEGRATION STREAMLIT_DATABAO_GIT_INTEGRATION'
94
86
  || ' API_PROVIDER = git_https_api'
95
87
  || ' API_ALLOWED_PREFIXES = (''' || :_git_origin || ''')'
96
- || ' ALLOWED_AUTHENTICATION_SECRETS = (STREAMLIT_DATABAO.PUBLIC.git_pat_secret)'
88
+ || ' ALLOWED_AUTHENTICATION_SECRETS = ()'
97
89
  || ' ENABLED = TRUE';
98
90
  EXECUTE IMMEDIATE :_sql;
99
91
 
@@ -101,8 +93,7 @@ BEGIN
101
93
  _sql := 'CREATE OR REPLACE GIT REPOSITORY STREAMLIT_DATABAO.PUBLIC."'
102
94
  || :_git_repo || '"'
103
95
  || ' ORIGIN = ''' || :_git_origin || ''''
104
- || ' API_INTEGRATION = STREAMLIT_DATABAO_GIT_INTEGRATION'
105
- || ' GIT_CREDENTIALS = STREAMLIT_DATABAO.PUBLIC.git_pat_secret';
96
+ || ' API_INTEGRATION = STREAMLIT_DATABAO_GIT_INTEGRATION';
106
97
  EXECUTE IMMEDIATE :_sql;
107
98
 
108
99
  -- Fetch latest
@@ -116,6 +107,11 @@ BEGIN
116
107
  || ' SECRET_STRING = ''' || :_openai_key || '''';
117
108
  EXECUTE IMMEDIATE :_sql;
118
109
 
110
+ _sql := 'CREATE OR REPLACE SECRET STREAMLIT_DATABAO.PUBLIC.anthropic_api_key'
111
+ || ' TYPE = GENERIC_STRING'
112
+ || ' SECRET_STRING = ''' || :_anthropic_key || '''';
113
+ EXECUTE IMMEDIATE :_sql;
114
+
119
115
  _sql := 'CREATE OR REPLACE SECRET STREAMLIT_DATABAO.PUBLIC.snowflake_ds_account'
120
116
  || ' TYPE = GENERIC_STRING'
121
117
  || ' SECRET_STRING = ''' || :_ds_account || '''';
@@ -153,6 +149,7 @@ CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION STREAMLIT_DATABAO_SECRETS_ACCESS
153
149
  ALLOWED_NETWORK_RULES = (STREAMLIT_DATABAO.PUBLIC.STREAMLIT_DATABAO_EGRESS_RULE)
154
150
  ALLOWED_AUTHENTICATION_SECRETS = (
155
151
  STREAMLIT_DATABAO.PUBLIC.openai_api_key,
152
+ STREAMLIT_DATABAO.PUBLIC.anthropic_api_key,
156
153
  STREAMLIT_DATABAO.PUBLIC.snowflake_ds_account,
157
154
  STREAMLIT_DATABAO.PUBLIC.snowflake_ds_warehouse,
158
155
  STREAMLIT_DATABAO.PUBLIC.snowflake_ds_database,
@@ -183,6 +180,7 @@ CREATE OR REPLACE FUNCTION STREAMLIT_DATABAO.PUBLIC.get_secret(secret_name STRIN
183
180
  EXTERNAL_ACCESS_INTEGRATIONS = (STREAMLIT_DATABAO_SECRETS_ACCESS)
184
181
  SECRETS = (
185
182
  'openai_api_key' = STREAMLIT_DATABAO.PUBLIC.openai_api_key,
183
+ 'anthropic_api_key' = STREAMLIT_DATABAO.PUBLIC.anthropic_api_key,
186
184
  'snowflake_ds_account' = STREAMLIT_DATABAO.PUBLIC.snowflake_ds_account,
187
185
  'snowflake_ds_warehouse' = STREAMLIT_DATABAO.PUBLIC.snowflake_ds_warehouse,
188
186
  'snowflake_ds_database' = STREAMLIT_DATABAO.PUBLIC.snowflake_ds_database,
@@ -201,12 +199,13 @@ DECLARE
201
199
  _sql VARCHAR;
202
200
  _git_repo VARCHAR;
203
201
  _git_branch VARCHAR;
202
+ _app_name VARCHAR;
204
203
  _main_file VARCHAR;
205
204
  BEGIN
206
- SELECT $git_repo_name, $git_branch, $streamlit_main_file
207
- INTO :_git_repo, :_git_branch, :_main_file;
205
+ SELECT $git_repo_name, $git_branch, $streamlit_app_name, $streamlit_main_file
206
+ INTO :_git_repo, :_git_branch, :_app_name, :_main_file;
208
207
 
209
- _sql := 'CREATE OR REPLACE STREAMLIT STREAMLIT_DATABAO.PUBLIC.STREAMLIT_DATABAO_DEMO_SNOWFLAKE'
208
+ _sql := 'CREATE OR REPLACE STREAMLIT STREAMLIT_DATABAO.PUBLIC."' || :_app_name || '"'
210
209
  || ' FROM ''@"STREAMLIT_DATABAO"."PUBLIC"."' || :_git_repo || '"/branches/"' || :_git_branch || '"/'''
211
210
  || ' MAIN_FILE = ''' || :_main_file || ''''
212
211
  || ' QUERY_WAREHOUSE = ''STREAMLIT_DATABAO_WAREHOUSE'''
@@ -12,6 +12,7 @@ logger = logging.getLogger(__name__)
12
12
 
13
13
  SNOWFLAKE_SECRETS: dict[str, str] = {
14
14
  "openai_api_key": "OPENAI_API_KEY",
15
+ "anthropic_api_key": "ANTHROPIC_API_KEY",
15
16
  "snowflake_ds_account": "SNOWFLAKE_DS_ACCOUNT",
16
17
  "snowflake_ds_warehouse": "SNOWFLAKE_DS_WAREHOUSE",
17
18
  "snowflake_ds_database": "SNOWFLAKE_DS_DATABASE",