databay-cli 0.1.0__py3-none-any.whl
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.
- databay/__init__.py +5 -0
- databay/__main__.py +7 -0
- databay/agent_skill.py +184 -0
- databay/api.py +626 -0
- databay/cli/__init__.py +0 -0
- databay/cli/auth.py +377 -0
- databay/cli/build.py +89 -0
- databay/cli/commands/__init__.py +0 -0
- databay/cli/commands/alerting_webhook.py +19 -0
- databay/cli/commands/alerting_webhook_tag.py +14 -0
- databay/cli/commands/alerting_webhook_type.py +14 -0
- databay/cli/commands/alerting_webhook_undelivered.py +15 -0
- databay/cli/commands/announcement.py +17 -0
- databay/cli/commands/api_key.py +18 -0
- databay/cli/commands/api_key_project.py +16 -0
- databay/cli/commands/backfill_reason_code.py +14 -0
- databay/cli/commands/backfill_run.py +17 -0
- databay/cli/commands/canvas.py +16 -0
- databay/cli/commands/canvas_graph.py +15 -0
- databay/cli/commands/canvas_table_check.py +15 -0
- databay/cli/commands/dashboards.py +21 -0
- databay/cli/commands/dashboards_card.py +20 -0
- databay/cli/commands/dashboards_dataset.py +14 -0
- databay/cli/commands/dashboards_folder.py +16 -0
- databay/cli/commands/dashboards_home.py +17 -0
- databay/cli/commands/dashboards_placement.py +16 -0
- databay/cli/commands/db.py +19 -0
- databay/cli/commands/db_column.py +14 -0
- databay/cli/commands/docs_article.py +16 -0
- databay/cli/commands/dq_result.py +14 -0
- databay/cli/commands/dq_rule.py +16 -0
- databay/cli/commands/feature.py +14 -0
- databay/cli/commands/google_ads_source.py +14 -0
- databay/cli/commands/google_analytics_source.py +14 -0
- databay/cli/commands/instagram_account.py +14 -0
- databay/cli/commands/instagram_source.py +14 -0
- databay/cli/commands/linkedin_account.py +14 -0
- databay/cli/commands/linkedin_source.py +14 -0
- databay/cli/commands/me.py +14 -0
- databay/cli/commands/meta_ads_source.py +14 -0
- databay/cli/commands/metric_models.py +26 -0
- databay/cli/commands/metrics.py +14 -0
- databay/cli/commands/models.py +16 -0
- databay/cli/commands/nlq.py +15 -0
- databay/cli/commands/notebook_credential.py +16 -0
- databay/cli/commands/org.py +14 -0
- databay/cli/commands/org_member.py +17 -0
- databay/cli/commands/org_offboarding.py +14 -0
- databay/cli/commands/pipe.py +26 -0
- databay/cli/commands/pipe_backfill_run.py +14 -0
- databay/cli/commands/pipe_config_option.py +14 -0
- databay/cli/commands/pipe_destination.py +16 -0
- databay/cli/commands/pipe_leftover.py +16 -0
- databay/cli/commands/pipe_sink_type.py +14 -0
- databay/cli/commands/pipe_source_type.py +14 -0
- databay/cli/commands/pipe_status_bucket.py +14 -0
- databay/cli/commands/pipe_stuck_delete.py +14 -0
- databay/cli/commands/plan.py +14 -0
- databay/cli/commands/project.py +21 -0
- databay/cli/commands/project_budget.py +15 -0
- databay/cli/commands/project_member.py +18 -0
- databay/cli/commands/project_privilege.py +16 -0
- databay/cli/commands/project_share.py +16 -0
- databay/cli/commands/provision.py +14 -0
- databay/cli/commands/provisioning.py +14 -0
- databay/cli/commands/registry.py +14 -0
- databay/cli/commands/resource_home.py +14 -0
- databay/cli/commands/schema_change.py +18 -0
- databay/cli/commands/schema_history.py +17 -0
- databay/cli/commands/schema_version.py +16 -0
- databay/cli/commands/shopify_store.py +14 -0
- databay/cli/commands/sink_data_type.py +14 -0
- databay/cli/commands/source.py +24 -0
- databay/cli/commands/source_catalog.py +15 -0
- databay/cli/commands/source_check_run.py +17 -0
- databay/cli/commands/source_hidden_type.py +14 -0
- databay/cli/commands/source_name.py +14 -0
- databay/cli/commands/source_pipe.py +14 -0
- databay/cli/commands/source_publication.py +16 -0
- databay/cli/commands/source_readiness_override.py +15 -0
- databay/cli/commands/source_setup_choice.py +16 -0
- databay/cli/commands/source_stream.py +15 -0
- databay/cli/commands/source_table.py +14 -0
- databay/cli/commands/ssbi_job.py +18 -0
- databay/cli/commands/transform_type.py +14 -0
- databay/cli/commands/usage.py +14 -0
- databay/cli/commands/warehouse.py +21 -0
- databay/cli/commands/warehouse_access_assignment.py +16 -0
- databay/cli/commands/warehouse_access_role.py +22 -0
- databay/cli/commands/warehouse_access_settings.py +17 -0
- databay/cli/commands/warehouse_login.py +20 -0
- databay/cli/commands/warehouse_principal.py +17 -0
- databay/cli/commands/warehouse_service_account.py +17 -0
- databay/cli/commands/warehouse_service_account_credential.py +18 -0
- databay/cli/common.py +93 -0
- databay/cli/console.py +121 -0
- databay/cli/flags.py +183 -0
- databay/cli/handwritten.py +22 -0
- databay/cli/main.py +198 -0
- databay/cli/metrics.py +171 -0
- databay/cli/org.py +193 -0
- databay/cli/output.py +134 -0
- databay/cli/pipe_wait.py +357 -0
- databay/cli/profile.py +230 -0
- databay/cli/runner.py +432 -0
- databay/cli/skill.py +64 -0
- databay/cli/sql.py +84 -0
- databay/compat.py +161 -0
- databay/credentials.py +217 -0
- databay/error_catalog.py +226 -0
- databay/error_codes.py +3265 -0
- databay/errors.py +222 -0
- databay/feature_header.py +40 -0
- databay/invoke.py +225 -0
- databay/locks.py +41 -0
- databay/login_flow.py +245 -0
- databay/model_base.py +40 -0
- databay/models/__init__.py +0 -0
- databay/models/alerting_webhook.py +46 -0
- databay/models/alerting_webhook_tag.py +11 -0
- databay/models/alerting_webhook_type.py +11 -0
- databay/models/alerting_webhook_undelivered.py +23 -0
- databay/models/announcement.py +37 -0
- databay/models/api_key.py +81 -0
- databay/models/api_key_project.py +29 -0
- databay/models/backfill_reason_code.py +11 -0
- databay/models/backfill_run.py +41 -0
- databay/models/canvas.py +68 -0
- databay/models/canvas_graph.py +86 -0
- databay/models/canvas_table_check.py +181 -0
- databay/models/dashboards.py +79 -0
- databay/models/dashboards_card.py +37 -0
- databay/models/dashboards_dataset.py +27 -0
- databay/models/dashboards_folder.py +18 -0
- databay/models/dashboards_home.py +28 -0
- databay/models/db.py +34 -0
- databay/models/db_column.py +11 -0
- databay/models/docs_article.py +59 -0
- databay/models/dq_result.py +27 -0
- databay/models/dq_rule.py +43 -0
- databay/models/feature.py +15 -0
- databay/models/google_ads_source.py +11 -0
- databay/models/google_analytics_source.py +11 -0
- databay/models/instagram_source.py +11 -0
- databay/models/linkedin_source.py +11 -0
- databay/models/me.py +71 -0
- databay/models/meta_ads_source.py +11 -0
- databay/models/metric_models.py +274 -0
- databay/models/metrics.py +158 -0
- databay/models/models.py +73 -0
- databay/models/nlq.py +92 -0
- databay/models/notebook_credential.py +51 -0
- databay/models/org.py +44 -0
- databay/models/org_member.py +123 -0
- databay/models/org_offboarding.py +36 -0
- databay/models/pipe.py +340 -0
- databay/models/pipe_config_option.py +25 -0
- databay/models/pipe_destination.py +128 -0
- databay/models/pipe_leftover.py +51 -0
- databay/models/pipe_sink_type.py +11 -0
- databay/models/pipe_source_type.py +11 -0
- databay/models/pipe_status_bucket.py +13 -0
- databay/models/pipe_stuck_delete.py +25 -0
- databay/models/plan.py +37 -0
- databay/models/project.py +154 -0
- databay/models/project_budget.py +22 -0
- databay/models/project_member.py +67 -0
- databay/models/project_privilege.py +21 -0
- databay/models/project_share.py +76 -0
- databay/models/provision.py +12 -0
- databay/models/provisioning.py +20 -0
- databay/models/registry.py +18 -0
- databay/models/resource_home.py +35 -0
- databay/models/schema_change.py +96 -0
- databay/models/schema_history.py +32 -0
- databay/models/schema_version.py +23 -0
- databay/models/shared.py +875 -0
- databay/models/shopify_store.py +19 -0
- databay/models/sink_data_type.py +11 -0
- databay/models/source.py +263 -0
- databay/models/source_catalog.py +82 -0
- databay/models/source_check_run.py +63 -0
- databay/models/source_hidden_type.py +13 -0
- databay/models/source_name.py +18 -0
- databay/models/source_pipe.py +16 -0
- databay/models/source_publication.py +30 -0
- databay/models/source_readiness_override.py +13 -0
- databay/models/source_setup_choice.py +33 -0
- databay/models/source_stream.py +65 -0
- databay/models/source_table.py +27 -0
- databay/models/sql.py +31 -0
- databay/models/ssbi_job.py +97 -0
- databay/models/transform_type.py +40 -0
- databay/models/usage.py +112 -0
- databay/models/warehouse.py +38 -0
- databay/models/warehouse_access_assignment.py +70 -0
- databay/models/warehouse_access_role.py +148 -0
- databay/models/warehouse_access_settings.py +35 -0
- databay/models/warehouse_login.py +20 -0
- databay/models/warehouse_principal.py +49 -0
- databay/models/warehouse_service_account.py +35 -0
- databay/models/warehouse_service_account_credential.py +11 -0
- databay/oidc.py +205 -0
- databay/operation.py +191 -0
- databay/operations/__init__.py +0 -0
- databay/operations/alerting_webhook.py +317 -0
- databay/operations/alerting_webhook_tag.py +35 -0
- databay/operations/alerting_webhook_type.py +35 -0
- databay/operations/alerting_webhook_undelivered.py +74 -0
- databay/operations/announcement.py +135 -0
- databay/operations/api_key.py +198 -0
- databay/operations/api_key_project.py +130 -0
- databay/operations/backfill_reason_code.py +35 -0
- databay/operations/backfill_run.py +245 -0
- databay/operations/canvas.py +136 -0
- databay/operations/canvas_graph.py +102 -0
- databay/operations/canvas_table_check.py +101 -0
- databay/operations/dashboards.py +441 -0
- databay/operations/dashboards_card.py +406 -0
- databay/operations/dashboards_dataset.py +50 -0
- databay/operations/dashboards_folder.py +146 -0
- databay/operations/dashboards_home.py +176 -0
- databay/operations/dashboards_placement.py +152 -0
- databay/operations/db.py +337 -0
- databay/operations/db_column.py +57 -0
- databay/operations/docs_article.py +101 -0
- databay/operations/dq_result.py +43 -0
- databay/operations/dq_rule.py +155 -0
- databay/operations/feature.py +35 -0
- databay/operations/google_ads_source.py +40 -0
- databay/operations/google_analytics_source.py +40 -0
- databay/operations/instagram_account.py +47 -0
- databay/operations/instagram_source.py +40 -0
- databay/operations/linkedin_account.py +47 -0
- databay/operations/linkedin_source.py +40 -0
- databay/operations/me.py +57 -0
- databay/operations/meta_ads_source.py +40 -0
- databay/operations/metric_models.py +612 -0
- databay/operations/metrics.py +218 -0
- databay/operations/models.py +123 -0
- databay/operations/nlq.py +100 -0
- databay/operations/notebook_credential.py +95 -0
- databay/operations/org.py +79 -0
- databay/operations/org_member.py +192 -0
- databay/operations/org_offboarding.py +43 -0
- databay/operations/pipe.py +882 -0
- databay/operations/pipe_backfill_run.py +72 -0
- databay/operations/pipe_config_option.py +50 -0
- databay/operations/pipe_destination.py +178 -0
- databay/operations/pipe_leftover.py +110 -0
- databay/operations/pipe_sink_type.py +35 -0
- databay/operations/pipe_source_type.py +35 -0
- databay/operations/pipe_status_bucket.py +35 -0
- databay/operations/pipe_stuck_delete.py +52 -0
- databay/operations/plan.py +35 -0
- databay/operations/project.py +346 -0
- databay/operations/project_budget.py +135 -0
- databay/operations/project_member.py +226 -0
- databay/operations/project_privilege.py +143 -0
- databay/operations/project_share.py +160 -0
- databay/operations/provision.py +35 -0
- databay/operations/provisioning.py +35 -0
- databay/operations/registry.py +35 -0
- databay/operations/resource_home.py +80 -0
- databay/operations/schema_change.py +222 -0
- databay/operations/schema_history.py +136 -0
- databay/operations/schema_version.py +115 -0
- databay/operations/shopify_store.py +40 -0
- databay/operations/sink_data_type.py +43 -0
- databay/operations/source.py +1207 -0
- databay/operations/source_catalog.py +135 -0
- databay/operations/source_check_run.py +242 -0
- databay/operations/source_hidden_type.py +59 -0
- databay/operations/source_name.py +69 -0
- databay/operations/source_pipe.py +57 -0
- databay/operations/source_publication.py +139 -0
- databay/operations/source_readiness_override.py +96 -0
- databay/operations/source_setup_choice.py +161 -0
- databay/operations/source_stream.py +99 -0
- databay/operations/source_table.py +59 -0
- databay/operations/sql.py +54 -0
- databay/operations/ssbi_job.py +242 -0
- databay/operations/transform_type.py +35 -0
- databay/operations/usage.py +35 -0
- databay/operations/warehouse.py +343 -0
- databay/operations/warehouse_access_assignment.py +179 -0
- databay/operations/warehouse_access_role.py +473 -0
- databay/operations/warehouse_access_settings.py +172 -0
- databay/operations/warehouse_login.py +308 -0
- databay/operations/warehouse_principal.py +174 -0
- databay/operations/warehouse_service_account.py +206 -0
- databay/operations/warehouse_service_account_credential.py +285 -0
- databay/paths.py +32 -0
- databay/platform_check.py +20 -0
- databay/profiles.py +181 -0
- databay/redact.py +22 -0
- databay/reference.py +218 -0
- databay/resource.py +167 -0
- databay/resources/__init__.py +0 -0
- databay/resources/alerting_webhook.py +84 -0
- databay/resources/alerting_webhook_tag.py +21 -0
- databay/resources/alerting_webhook_type.py +21 -0
- databay/resources/alerting_webhook_undelivered.py +35 -0
- databay/resources/announcement.py +45 -0
- databay/resources/api_key.py +56 -0
- databay/resources/api_key_project.py +47 -0
- databay/resources/backfill_reason_code.py +21 -0
- databay/resources/backfill_run.py +78 -0
- databay/resources/canvas.py +43 -0
- databay/resources/canvas_graph.py +38 -0
- databay/resources/canvas_table_check.py +38 -0
- databay/resources/dashboards.py +105 -0
- databay/resources/dashboards_card.py +97 -0
- databay/resources/dashboards_dataset.py +27 -0
- databay/resources/dashboards_folder.py +47 -0
- databay/resources/dashboards_home.py +59 -0
- databay/resources/dashboards_placement.py +47 -0
- databay/resources/db.py +87 -0
- databay/resources/db_column.py +28 -0
- databay/resources/docs_article.py +37 -0
- databay/resources/dq_result.py +25 -0
- databay/resources/dq_rule.py +48 -0
- databay/resources/feature.py +21 -0
- databay/resources/google_ads_source.py +25 -0
- databay/resources/google_analytics_source.py +25 -0
- databay/resources/instagram_account.py +27 -0
- databay/resources/instagram_source.py +25 -0
- databay/resources/linkedin_account.py +27 -0
- databay/resources/linkedin_source.py +25 -0
- databay/resources/me.py +27 -0
- databay/resources/meta_ads_source.py +25 -0
- databay/resources/metric_models.py +154 -0
- databay/resources/metrics.py +57 -0
- databay/resources/models.py +42 -0
- databay/resources/nlq.py +34 -0
- databay/resources/notebook_credential.py +41 -0
- databay/resources/org.py +29 -0
- databay/resources/org_member.py +53 -0
- databay/resources/org_offboarding.py +25 -0
- databay/resources/pipe.py +208 -0
- databay/resources/pipe_backfill_run.py +28 -0
- databay/resources/pipe_config_option.py +26 -0
- databay/resources/pipe_destination.py +49 -0
- databay/resources/pipe_leftover.py +42 -0
- databay/resources/pipe_sink_type.py +21 -0
- databay/resources/pipe_source_type.py +21 -0
- databay/resources/pipe_status_bucket.py +21 -0
- databay/resources/pipe_stuck_delete.py +27 -0
- databay/resources/plan.py +21 -0
- databay/resources/project.py +92 -0
- databay/resources/project_budget.py +38 -0
- databay/resources/project_member.py +68 -0
- databay/resources/project_privilege.py +48 -0
- databay/resources/project_share.py +47 -0
- databay/resources/provision.py +21 -0
- databay/resources/provisioning.py +21 -0
- databay/resources/registry.py +21 -0
- databay/resources/resource_home.py +29 -0
- databay/resources/schema_change.py +62 -0
- databay/resources/schema_history.py +52 -0
- databay/resources/schema_version.py +43 -0
- databay/resources/shopify_store.py +25 -0
- databay/resources/sink_data_type.py +25 -0
- databay/resources/source.py +132 -0
- databay/resources/source_catalog.py +34 -0
- databay/resources/source_check_run.py +67 -0
- databay/resources/source_hidden_type.py +25 -0
- databay/resources/source_name.py +27 -0
- databay/resources/source_pipe.py +28 -0
- databay/resources/source_publication.py +47 -0
- databay/resources/source_readiness_override.py +37 -0
- databay/resources/source_setup_choice.py +50 -0
- databay/resources/source_stream.py +38 -0
- databay/resources/source_table.py +27 -0
- databay/resources/sql.py +27 -0
- databay/resources/ssbi_job.py +69 -0
- databay/resources/transform_type.py +21 -0
- databay/resources/usage.py +21 -0
- databay/resources/warehouse.py +136 -0
- databay/resources/warehouse_access_assignment.py +51 -0
- databay/resources/warehouse_access_role.py +118 -0
- databay/resources/warehouse_access_settings.py +56 -0
- databay/resources/warehouse_login.py +81 -0
- databay/resources/warehouse_principal.py +51 -0
- databay/resources/warehouse_service_account.py +61 -0
- databay/resources/warehouse_service_account_credential.py +78 -0
- databay/sdk.py +77 -0
- databay/settings.py +90 -0
- databay/skill/SKILL.md +357 -0
- databay/skill/references/commands.md +7025 -0
- databay/skill/references/errors.md +727 -0
- databay/spec.py +362 -0
- databay/stored_token.py +134 -0
- databay/tokens.py +108 -0
- databay/transport.py +357 -0
- databay/update_check.py +151 -0
- databay/version.py +6 -0
- databay/waits.py +330 -0
- databay_cli-0.1.0.dist-info/METADATA +42 -0
- databay_cli-0.1.0.dist-info/RECORD +403 -0
- databay_cli-0.1.0.dist-info/WHEEL +4 -0
- databay_cli-0.1.0.dist-info/entry_points.txt +2 -0
- databay_cli-0.1.0.dist-info/licenses/LICENSE +202 -0
databay/skill/SKILL.md
ADDED
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: databay
|
|
3
|
+
description: >-
|
|
4
|
+
Drive a Databay server with the databay CLI: sign in, pick a project, add and check a
|
|
5
|
+
database source, create pipes that replicate its tables into a warehouse, wait for them,
|
|
6
|
+
query metrics such as net sales, define and publish metrics, query the warehouse with SQL,
|
|
7
|
+
build dashboards, and connect a BI tool. Use when the user asks to move or sync data with
|
|
8
|
+
Databay, create or fix a pipe, ask for or define a metric, query a Databay warehouse, build
|
|
9
|
+
a dashboard, connect a BI tool, or run any `databay` command.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# databay
|
|
13
|
+
|
|
14
|
+
The `databay` CLI drives a Databay server: `databay <noun> <verb> [ARGS] [OPTIONS]`.
|
|
15
|
+
Flags, arguments and examples for every command are in `references/commands.md`; every exit
|
|
16
|
+
code and error code is in `references/errors.md`. Read them when a step below is not enough,
|
|
17
|
+
instead of guessing a flag.
|
|
18
|
+
|
|
19
|
+
## Rules
|
|
20
|
+
|
|
21
|
+
- **Always pass `--output json`.** Read the result from stdout. Progress, hints and errors
|
|
22
|
+
go to stderr, one JSON object per line.
|
|
23
|
+
- **Never print a secret.** No password, token or API key goes on a command line, in a
|
|
24
|
+
message to the user, or in a file you show. Pass a secret field with `--<field>-env NAME`
|
|
25
|
+
(an environment variable the user set) or `--<field>-stdin`; for example `--password-env`.
|
|
26
|
+
- **Never pass `--yes` on your own.** A command that takes `--yes` deletes or overwrites
|
|
27
|
+
state. Say what it will remove, wait for the user's explicit agreement, then run it with
|
|
28
|
+
`--yes`.
|
|
29
|
+
- **Keep every wait under your shell's limit.** Pass `--timeout` on every wait, below the
|
|
30
|
+
command timeout of the tool that runs it: `--timeout 540` in Claude Code, whose cap is
|
|
31
|
+
600 s. Under another agent, set the tool's timeout for the call above the `--timeout` you
|
|
32
|
+
pass, or pass a smaller `--timeout`. The examples below use 540.
|
|
33
|
+
- **Follow `next`.** A result or an error that carries `next` names the exact command to
|
|
34
|
+
run next. Prefer it to building one yourself.
|
|
35
|
+
|
|
36
|
+
## Before any task
|
|
37
|
+
|
|
38
|
+
1. Check who and where you are:
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
databay status --output json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Exit 3 means there is no profile or sign-in. Ask the user to sign in once, in their own
|
|
45
|
+
terminal, because it opens a browser (or prints a code with `--device`):
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
databay login --server https://databay.example.com
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
A machine without a browser signs in with an org API key whose secret is in a variable:
|
|
52
|
+
`databay login --server https://databay.example.com --api-key-id <client_id> --api-key-env DATABAY_API_KEY`.
|
|
53
|
+
|
|
54
|
+
`status` shows the `org` the token names. If `needs_org_choice` is true, or the user wants another
|
|
55
|
+
organization, list them, ask the user which one, and switch; switching clears the active project:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
databay org list --output json
|
|
59
|
+
databay org switch <organization> --output json
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
2. Set the project. Most commands act in the profile's active project. If `status` shows
|
|
63
|
+
none, list the projects, ask the user which one, and set it by id:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
databay project list --output json
|
|
67
|
+
databay project use <project_id> --output json
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`--project <project_id>` on a command that acts in a project overrides it for that command
|
|
71
|
+
only. A command that names a resource by its id (`pipe get`, `pipe status`, `pipe wait`) finds
|
|
72
|
+
the project from the resource and takes no `--project`.
|
|
73
|
+
|
|
74
|
+
3. If `status` reports `skill_outdated`, an installed copy of this skill is from another CLI
|
|
75
|
+
version: tell the user, and offer the `next` command its `skill_outdated` event names.
|
|
76
|
+
|
|
77
|
+
## Replicate a database table into the warehouse
|
|
78
|
+
|
|
79
|
+
Run the steps in this order. Each step's check must pass before the next.
|
|
80
|
+
|
|
81
|
+
1. **Find the source.** Look for the database in `databay source list --output json`. A row has
|
|
82
|
+
no host or database and the list shows only sources this project can use, so compare a likely
|
|
83
|
+
row's `config` in `databay source get <source_uuid> --output json`, and ask the user when you
|
|
84
|
+
cannot tell: a wrong miss makes a second source for the same database. For a match, run
|
|
85
|
+
`databay source recheck <source_uuid> --output json`, then go to step 3 if it passes:
|
|
86
|
+
- Exit 9 (`not_ready`) means a requirement failed: show the user each failing item and its
|
|
87
|
+
fix, and stop until it is done.
|
|
88
|
+
- A `source_status` such as `needs_reauth` or `deleting` holds the source whatever its checks
|
|
89
|
+
say: tell the user and stop.
|
|
90
|
+
- A check with status `unknown` or `not_run` could not be verified. On a type with no guided
|
|
91
|
+
setup, if the user has verified it by hand, acknowledge it with
|
|
92
|
+
`databay source-readiness-override set <source_uuid> --reason "<what they checked>" --output json`.
|
|
93
|
+
PostgreSQL has guided setup and takes no override (`source_override_not_offered`): the
|
|
94
|
+
check has to pass.
|
|
95
|
+
2. **Add the source.** Precheck the connection first (the password comes from a variable the
|
|
96
|
+
user set). Exit 9 with a `fail` item means the same as in step 1. With only `unknown` or
|
|
97
|
+
`not_run` items, ask the user whether to save it anyway. Then create it:
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
databay source precheck postgres --host <host> --port 5432 --db-name <db> --username <user> --password-env PGPASSWORD --output json
|
|
101
|
+
databay source create postgres --name <name> --host <host> --port 5432 --db-name <db> --username <user> --password-env PGPASSWORD --output json
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
It answers with the source's `uuid`. A create is safe to repeat only with the
|
|
105
|
+
`--idempotency-key` it printed. If its `status` is `setup_incomplete`, a setup check did not
|
|
106
|
+
pass: run `databay source recheck <source_uuid> --output json` and handle it as in step 1. Pass `--allow-incomplete` only when the user asks to save a source Databay
|
|
107
|
+
cannot reach yet. `references/commands.md` has `source create` for the other source types.
|
|
108
|
+
|
|
109
|
+
A PostgreSQL source made here has not run its connection checks, and a new pipe on it answers
|
|
110
|
+
`source_no_stored_pass` until they pass. Run them, then read the run until its `status` is no
|
|
111
|
+
longer `running` (it can take over a minute):
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
databay source-check-run start --source-id <source_uuid> --active-probes --output json
|
|
115
|
+
databay source-check-run get <run_id> --output json
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Show the user each `fail` or `unknown` row and its `fixes`, and stop until it is done. Then run
|
|
119
|
+
the same check again. A change to the source's credentials clears the result.
|
|
120
|
+
3. **Check the tables.** Each table says whether it can be replicated, and the fix if not:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
databay source-table check <source_uuid> public --output json
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Exit 9 again means fix first. Never create a pipe on a table that is not ready.
|
|
127
|
+
4. **Create the pipe.** It answers at once with the pipe's `uuid`. A create is safe to repeat
|
|
128
|
+
only with the `--idempotency-key` it printed:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
databay pipe create --source-id <source_uuid> --schema-name public --table-name orders --dest-table-name orders --output json
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
The `next` it prints waits only until the pipe is provisioned. Go on to step 5 instead.
|
|
135
|
+
5. **Wait until the table is ready, then query it.**
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
databay pipe wait <pipe_uuid> --until data --timeout 540 --output json
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Exit 4 means it is not ready yet: run the `next` command the output names (the same wait; it
|
|
142
|
+
creates nothing), at most 3 times at 540 s. After that, report the last state to the user.
|
|
143
|
+
`healthy but no rows have landed` means the pipe works and the source has sent nothing yet.
|
|
144
|
+
Exit 5 means it failed: report the reason.
|
|
145
|
+
|
|
146
|
+
Exit 0 means the table holds rows (`wait.reason` `rows_landed`), or this warehouse has no
|
|
147
|
+
way to report a row count and the pipe is healthy (`healthy_unmeasured`). Run the `next`
|
|
148
|
+
command it prints, which counts the rows:
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
databay sql --db <sink_db_uuid> "select count(*) from <db_name>.<dest_table_name>" --output json
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
After `healthy_unmeasured`, 0 rows or a table that does not exist yet means nothing has
|
|
155
|
+
landed yet. Always pass `--db`: without it the statement runs on the org's default warehouse,
|
|
156
|
+
which may not be the pipe's. `sql` runs one read-only statement; it can also read
|
|
157
|
+
`--file <path>`.
|
|
158
|
+
|
|
159
|
+
## Answer with a metric
|
|
160
|
+
|
|
161
|
+
For a business number (net sales, orders, sessions, ad spend), query a metric before writing
|
|
162
|
+
SQL: a metric is defined once, so its answer matches the dashboards. Work in this order:
|
|
163
|
+
|
|
164
|
+
1. **List** what this project can query: `databay metrics list --output json`. Each metric has
|
|
165
|
+
its `dimensions`, `grains`, `filter_ops`, `warehouses` and a `state`. An empty list with
|
|
166
|
+
`state` `compiling` means the model is being built: wait a minute and list again. With
|
|
167
|
+
`unavailable`, `reason` is the error code that says why (look it up in `references/errors.md`).
|
|
168
|
+
2. **Describe** the one you will use, to see which dimensions and grains it takes:
|
|
169
|
+
`databay metrics describe <metric> --output json`.
|
|
170
|
+
3. **Query** it, always with `--caller agent`: it tells the server an agent ran the query, so
|
|
171
|
+
it is counted apart from a person's. `--by` groups by a dimension (repeat it), `--grain` by
|
|
172
|
+
the time dimension, `--last 30d` or `--from`/`--to` sets the range, and `--where` filters (`channel=paid`; also
|
|
173
|
+
`!=`, `>`, `>=`, `<`, `<=`; repeat it and every filter must hold), and `--order <member>:desc` with
|
|
174
|
+
`--limit 10` answers a top 10. Pass `--warehouse` only
|
|
175
|
+
when the metric is in several warehouses (`ambiguous_warehouse` names them).
|
|
176
|
+
4. **Explain** when the user asks how a number was made, or before you rely on a surprising
|
|
177
|
+
one: the same query, still with `--caller agent`, plus `--explain` adds the metric's
|
|
178
|
+
definition, the SQL it ran and the tables it read. `--dry-run` answers that without running the query.
|
|
179
|
+
|
|
180
|
+
`truncated: true` means only the first `row_count` rows came back: narrow the range or pass a
|
|
181
|
+
coarser `--grain`. `model_version_unavailable` is a retry: wait for its `Retry-After`, then run
|
|
182
|
+
the same command.
|
|
183
|
+
|
|
184
|
+
### Worked example
|
|
185
|
+
|
|
186
|
+
How did net sales go over the last 30 days, and how is it computed?
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
databay metrics list --output json
|
|
190
|
+
databay metrics describe net_sales --output json
|
|
191
|
+
databay metrics query net_sales --grain day --last 30d --caller agent --output json
|
|
192
|
+
databay metrics query net_sales --grain day --last 30d --explain --caller agent --output json
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Report the rows, and say the answer came from the `net_sales` metric (`answer_path: metric`,
|
|
196
|
+
with its `model_version`).
|
|
197
|
+
|
|
198
|
+
### When there is no metric for it
|
|
199
|
+
|
|
200
|
+
`metric_not_found` means the metric is not in this project's model; its `did_you_mean` lists
|
|
201
|
+
close names you can query. If none of them fits, you may answer with `databay sql` against the
|
|
202
|
+
warehouse instead (step 5 of "Replicate a database table" shows `--db`). Label that answer `answer_path: raw_sql` when
|
|
203
|
+
you report it, and say it is your own query, not a defined metric, so the user knows it may
|
|
204
|
+
not match the dashboards. Never use SQL to get around `permission_denied` or a metric the user
|
|
205
|
+
cannot see: the SQL console applies the user's own grants and refuses the same columns.
|
|
206
|
+
|
|
207
|
+
## Define metrics
|
|
208
|
+
|
|
209
|
+
A project's own metrics come from its metric model, a YAML file. Metrics query the published
|
|
210
|
+
version; a draft changes nothing until it is published.
|
|
211
|
+
|
|
212
|
+
1. **Validate** the file: `databay metric-models validate --yaml "$(cat metrics.yml)" --output json`
|
|
213
|
+
names the cubes and metrics it defines. `model_rejected` lists each field to fix.
|
|
214
|
+
2. **Push** it as the draft: `databay metric-models push --yaml "$(cat metrics.yml)" --output json`.
|
|
215
|
+
It replaces the draft there is.
|
|
216
|
+
3. **Publish** the draft: `databay metric-models publish --output json`. Then `databay metrics list`
|
|
217
|
+
shows them with `source` `customer`.
|
|
218
|
+
|
|
219
|
+
Defining metrics needs the `model_write` privilege and publishing needs `model_publish`;
|
|
220
|
+
`databay project my-access --output json` shows what this user holds. Before publishing, show the user
|
|
221
|
+
what it would change: `databay metric-models changes --output json` lists each metric and table the
|
|
222
|
+
publish adds, changes or removes.
|
|
223
|
+
|
|
224
|
+
### Edit one metric
|
|
225
|
+
|
|
226
|
+
To add, change or remove one metric without rewriting the YAML, use the form commands. Each takes the
|
|
227
|
+
`revision` the last answer gave; `draft_changed` means someone wrote the draft since, so read it again
|
|
228
|
+
and redo your change. `model_managed_in_git` means the project keeps its model in git: edit the
|
|
229
|
+
`semantic/` files there instead.
|
|
230
|
+
|
|
231
|
+
1. **Read** the model: `databay metric-models metric-list --output json` gives the `revision`, the
|
|
232
|
+
`tables` (each with its `breakdowns`) and the `metrics`. A metric or table with `editable` false
|
|
233
|
+
can only change in the YAML (`reason` says why; a write to it is `metric_needs_yaml`).
|
|
234
|
+
2. **Write** one metric. `aggregation` is `count` (no `column`), `count_distinct`, `sum`, `avg`, `min`
|
|
235
|
+
or `max`; `conditions` filter the rows it counts (`op` is `=`, `!=`, `>`, `>=`, `<`, `<=`, `in`,
|
|
236
|
+
`is_null` or `is_not_null`). A metric on a table no cube reads yet also needs `--breakdowns`, the
|
|
237
|
+
columns it breaks down by (`type` `string`, `number` or `time`):
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
databay metric-models metric-add --revision <revision> --metric '{"name": "order_total", "description": "Sum of order totals.", "table": "orders", "aggregation": "sum", "column": "total", "conditions": []}' --breakdowns '[{"column": "created_at", "type": "time"}, {"column": "channel", "type": "string"}]' --output json
|
|
241
|
+
databay metric-models metric-update <project_id> order_total --revision <revision> --metric '{"name": "order_total", "description": "Sum of paid order totals.", "table": "orders", "aggregation": "sum", "column": "total", "conditions": [{"column": "status", "op": "=", "value": "paid"}]}' --output json
|
|
242
|
+
databay metric-models set-breakdowns <project_id> orders --revision <revision> --breakdowns '[{"column": "created_at", "type": "time"}]' --output json
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
`metric-update`, `metric-remove` and `set-breakdowns` take the project id as their first argument.
|
|
246
|
+
Removing a metric (`metric-remove <project_id> <metric> --revision <revision>`) needs `--yes`, so ask
|
|
247
|
+
first. `affected_metrics` in the answer lists the table's other metrics a breakdown change reaches:
|
|
248
|
+
tell the user. `comments_dropped` true means the YAML's comments are gone.
|
|
249
|
+
3. **Publish** with the last answer's revision, so you publish the draft you checked:
|
|
250
|
+
`databay metric-models publish --revision <revision> --output json`.
|
|
251
|
+
|
|
252
|
+
### Start from dbt
|
|
253
|
+
|
|
254
|
+
To start from the project's built dbt models instead, `databay metric-models import-dbt --dry-run --output json`
|
|
255
|
+
shows the YAML it would write; without `--dry-run` it stores that as the draft, and `draft_exists`
|
|
256
|
+
means there is one already (pass `--replace-draft` only when the user agrees to lose it). Review it with
|
|
257
|
+
`databay metric-models show-draft --output json`, then publish.
|
|
258
|
+
|
|
259
|
+
## Dashboards
|
|
260
|
+
|
|
261
|
+
Use the `dashboards`, `dashboards-card`, `dashboards-placement`, `dashboards-folder` and
|
|
262
|
+
`dashboards-dataset` nouns. A card belongs to the project and runs in a warehouse of it (for a pipe's
|
|
263
|
+
table, its `sink_db_uuid`); a dashboard shows the cards placed on it. Create a dashboard, create a card
|
|
264
|
+
placed on it, then run it:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
databay dashboards create --name <name> --output json
|
|
268
|
+
databay dashboards-card create --board-id <board_id> --warehouse-id <sink_db_uuid> --title <title> --spec '{"spec_version": 1, "query": {"sql": "select count(*) as n from <dest_table_name>"}, "chart": {"type": "kpi", "y": ["n"]}}' --output json
|
|
269
|
+
databay dashboards run <board_id> --output json
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
A metric card shows metrics of the project's model instead of SQL, so its numbers match `metrics
|
|
273
|
+
query`. Its spec is `spec_version` 2, and its `warehouse-id` must be one of the metric's `warehouses`:
|
|
274
|
+
|
|
275
|
+
```
|
|
276
|
+
databay dashboards-card create --board-id <board_id> --warehouse-id <warehouse_id> --title "Net sales by channel" --spec '{"spec_version": 2, "query": {"metrics": ["net_sales"], "dimensions": ["channel"], "time": {"grain": "week", "default": "last_90_days"}, "order": [{"member": "net_sales", "direction": "desc"}], "limit": 10}, "chart": {"type": "bar", "x": "channel", "y": ["net_sales"]}}' --output json
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
`time.from_filter` and a filter's `from_filter` read a board filter by its key, like a SQL card's
|
|
280
|
+
variables. `metric_card_invalid` names the part of the spec to fix.
|
|
281
|
+
|
|
282
|
+
- **`run` exits 0 even when a card fails.** Check `error` on every entry of `cards`, and report
|
|
283
|
+
any that is set instead of saying the dashboard works.
|
|
284
|
+
- A card's SQL names a table of that warehouse without its database, or a dataset as `ds.<name>`
|
|
285
|
+
(`databay dashboards-dataset list --warehouse-id <sink_db_uuid> --output json` lists them).
|
|
286
|
+
- A create is safe to repeat only with the `--idempotency-key` it printed.
|
|
287
|
+
- Each change to a dashboard or a card takes the `--revision` its last answer gave. `revision_conflict`
|
|
288
|
+
means it changed since: run `databay dashboards get <board_id> --output json` (or
|
|
289
|
+
`databay dashboards-card get <card_id> --output json`), check whether your change is already
|
|
290
|
+
there, and if not, send it again on the new revision.
|
|
291
|
+
- `feature_disabled` means native dashboards are off for this organization, and
|
|
292
|
+
`warehouse_not_queryable` that this warehouse cannot run cards. Tell the user the `hint`.
|
|
293
|
+
- `console_not_scoped` means no card can run until support or whoever runs the server turns on
|
|
294
|
+
project scoping for this organization's SQL console; an organization admin cannot, whatever
|
|
295
|
+
`message` says. Creating a dashboard still works, and you only learn this when a card runs.
|
|
296
|
+
Tell the user before they ask for it: the console and AI agent then act only in the active
|
|
297
|
+
project, and it cannot simply be turned back off.
|
|
298
|
+
|
|
299
|
+
The built-in dashboards that come with the product are only in the web app: no command reads
|
|
300
|
+
them, so send the user there.
|
|
301
|
+
|
|
302
|
+
## Connect a BI tool
|
|
303
|
+
|
|
304
|
+
A BI tool (Tableau, Power BI, Metabase, DBeaver) reads the project's metrics over the PostgreSQL
|
|
305
|
+
protocol, signing in with an org API key that lists the project. Show the user where to connect:
|
|
306
|
+
|
|
307
|
+
```
|
|
308
|
+
databay api-key list --output json
|
|
309
|
+
databay api-key-project bi-connection <key_id> <project_id> --output json
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
The answer gives `host`, `port`, `database`, `username` and `sslmode`. The password is the key's
|
|
313
|
+
secret, which only the user has: never ask for it or print it. The key sees only the metrics its
|
|
314
|
+
warehouse access roles grant, and a query past the row cap comes back cut short without an error,
|
|
315
|
+
so tell the user to aggregate in the tool rather than export raw rows.
|
|
316
|
+
|
|
317
|
+
## Read a failure
|
|
318
|
+
|
|
319
|
+
A failed command exits non-zero and prints one object on stderr:
|
|
320
|
+
|
|
321
|
+
```
|
|
322
|
+
{"error": {"code", "message", "hint", "next", "recovery", "context", ...}}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
Read `recovery.action` first, then the exit code for the class:
|
|
326
|
+
|
|
327
|
+
| `recovery.action` | Do |
|
|
328
|
+
|---|---|
|
|
329
|
+
| `retry` | Run the same command again, at most `recovery.max_retries` times. |
|
|
330
|
+
| `fix_and_retry` | Fix the input the `message` and `hint` name, then run it again. |
|
|
331
|
+
| `do_first` | Run `next` (sign in, set a project), then the original command. |
|
|
332
|
+
| `ask_human` | Stop and tell the user `message` and `hint`; do not retry. |
|
|
333
|
+
|
|
334
|
+
If `recovery.side_effects` is `partial`, `complete` or `unknown`, the server may already have
|
|
335
|
+
changed something: check before running a write again.
|
|
336
|
+
|
|
337
|
+
| Exit | Meaning |
|
|
338
|
+
|---|---|
|
|
339
|
+
| 0 | ok |
|
|
340
|
+
| 1 | the server refused; fix the input or ask the user |
|
|
341
|
+
| 2 | usage: a flag or argument is wrong or missing; read `hint` |
|
|
342
|
+
| 3 | sign-in or profile needed; ask the user to sign in (see "Before any task") |
|
|
343
|
+
| 4 | still pending; run `next`, the same wait |
|
|
344
|
+
| 5 | the wait ended in failure; report `last_error` |
|
|
345
|
+
| 6 | transient; retry later |
|
|
346
|
+
| 7 | the CLI and the server versions do not match; tell the user to upgrade |
|
|
347
|
+
| 8 | the CLI is outdated or hit a bug; tell the user, with `support_ref` or the crash log |
|
|
348
|
+
| 9 | not ready; fix what the answer names, then check again |
|
|
349
|
+
|
|
350
|
+
Look up a `code` you do not know in `references/errors.md`. Quote `context.request_id` when
|
|
351
|
+
the user reports a problem.
|
|
352
|
+
|
|
353
|
+
## Finding a command
|
|
354
|
+
|
|
355
|
+
Every exposed API operation has a command. Search `references/commands.md` for the noun
|
|
356
|
+
(`## pipe`, `## warehouse`, `## source`) or run `databay <noun> <verb> --help`. Ids are
|
|
357
|
+
UUIDs from a `list` or `get` result; never invent one.
|