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.
- {databao-0.3.1 → databao-0.3.3.dev2}/PKG-INFO +2 -2
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/bigquery_utils.py +1 -1
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/utils/path_utils.py +2 -2
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_bigquery.py +3 -3
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_duckdb.py +2 -2
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_mysql.py +2 -2
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_postgres.py +2 -2
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_snowflake.py +4 -3
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/domains/test_sqlite.py +2 -2
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/README.md +22 -13
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/pyproject.toml +5 -4
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/setup.sql +21 -22
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/src/databao_snowflake_demo/app.py +1 -0
- databao-0.3.3.dev2/examples/demo-snowflake-project/uv.lock +3468 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/pyproject.toml +2 -2
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/app.py +11 -8
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/chat.py +11 -1
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/models/settings.py +9 -6
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/agent_settings.py +67 -31
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/welcome.py +32 -7
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/llm_models.py +2 -2
- {databao-0.3.1 → databao-0.3.3.dev2}/uv.lock +41 -126
- {databao-0.3.1 → databao-0.3.3.dev2}/.cursor/rules/python-style.mdc +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/.github/actions/setup-project/action.yml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/.github/workflows/e2e-tests.yml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/.github/workflows/publish-dev.yml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/.github/workflows/publish.yml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/.github/workflows/python-package.yml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/.gitignore +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/.pre-commit-config.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/.python-version +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/CONTRIBUTING.md +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/LICENSE +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/Makefile +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/README.md +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/.gitignore +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/pytest.ini +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/duckdb_utils.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/mysql_utils.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/postgres_utils.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/snowflake_utils.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/databases/sqlite_utils.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/project_utils.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/utils/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/utils/pexpect_utils.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/src/utils/yaml_compare.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/conftest.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/bigquery_introspections.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/duckdb_introspections.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/mysql_introspections.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/postgres_introspections.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/snowflake_introspections.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/e2e-tests/tests/resources/sqlite_introspections.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/dce.ini +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/examples/src/databases/example_postgres.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/examples/src/files/documentation.md +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/examples/src/files/notes.txt +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/databao/domains/root/src/snowflake.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/examples/demo-snowflake-project/src/databao_snowflake_demo/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/scripts/generate_licenses.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/__main__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/app.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/ask.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/build.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/context_engine_cli.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/datasource/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/datasource/add_datasource_config.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/datasource/check_datasource_connection.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/init.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/mcp.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/commands/status.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/executor_utils.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/log/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/log/llm_errors.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/log/logging.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/server.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/tools/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/tools/databao_ask/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/tools/databao_ask/agent_factory.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/mcp/tools/databao_ask/tool.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/project/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/project/layout.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/assets/bao.png +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/cli.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/datasource_form.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/datasource_manager.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/icons.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/results.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/sidebar.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/components/status.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/models/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/models/chat_session.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/chat.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/context_settings.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/pages/general_settings.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/project_utils.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/build_service.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/chat_persistence.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/chat_title.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/dce_operations.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/query_executor.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/settings_persistence.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/services/storage.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/streaming.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/src/databao_cli/ui/suggestions.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/check_datasource/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/check_datasource/test_check_datasource.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/check_datasource/test_project/databao/domains/root/dce.ini +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/check_datasource/test_project/databao/domains/root/src/myduck.yaml +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/conftest.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/plugins/__init__.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/plugins/get_loaded_plugins.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/plugins/test_plugins.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_add_datasource.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_app.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_ask.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_build.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_init.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_mcp.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/test_status.py +0 -0
- {databao-0.3.1 → databao-0.3.3.dev2}/tests/utils/__init__.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
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
|
|
13
|
-
return project_path.joinpath("databao", "domains", "root", "output", "
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
17
|
+
db = get_working_snowflake_connection()
|
|
18
|
+
execute_init(project_folder, db)
|
|
18
19
|
execute_build(project_folder)
|
|
19
|
-
assert_introspections_equal(
|
|
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
|
|
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(
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
74
|
-
--project-dir
|
|
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
|
|
12
|
-
|
|
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 $
|
|
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 :
|
|
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
|
|
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 = (
|
|
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.
|
|
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",
|