gooddata-dbt 1.74.1.dev1__tar.gz → 1.74.1.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.
- gooddata_dbt-1.74.1.dev2/AGENTS.md +87 -0
- gooddata_dbt-1.74.1.dev2/CLAUDE.md +1 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/PKG-INFO +5 -5
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/pyproject.toml +7 -7
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/.env.custom.dev +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/.env.dev +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/.gitignore +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/LICENSE.txt +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/Makefile +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/README.md +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/bin/gooddata-dbt +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/gooddata_example.yml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/__init__.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/_version.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/args.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/__init__.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/base.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/cloud.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/environment.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/metrics.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/profiles.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/tables.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt_plugin.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/gooddata/__init__.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/gooddata/api_wrapper.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/gooddata/config.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/logger.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/main.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/sdk_wrapper.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/utils.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/conftest.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/gooddata_example.yml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/dbt_profiles/profiles.yml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/dbt_target/manifest.json +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/aircraft.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/aircraft_models.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/airports.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/ambient_temperature.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/carriers.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/census.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/census_by_country.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/commits.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/customer.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/eshop_customers.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/flights.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/home_rentals.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/house_property_sales_time_series.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/mall_customers.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/monthlyinventory.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/order_lines.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/orders.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/product.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/pull_requests.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/repos.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/returns.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/telco_customer_churn.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/users.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/workflow_runs.yaml +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/test_args.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/test_profiles.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/test_tables.py +0 -0
- {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tox.ini +0 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# gooddata-dbt
|
|
2
|
+
|
|
3
|
+
A CLI plugin (`gooddata-dbt`) that bridges a dbt project to a GoodData workspace. It reads
|
|
4
|
+
a dbt project's compiled `manifest.json` and its `profiles.yml`, then uses them to register
|
|
5
|
+
the warehouse as a GoodData data source, generate a GoodData logical data model from the
|
|
6
|
+
dbt models, and deploy, store or test the analytics layer on top. It supports both dbt-core
|
|
7
|
+
(a local manifest) and dbt Cloud (over the dbt Cloud API).
|
|
8
|
+
|
|
9
|
+
## Owns
|
|
10
|
+
|
|
11
|
+
- The `gooddata-dbt` CLI and its subcommands — `provision_workspaces`,
|
|
12
|
+
`register_data_sources`, `deploy_ldm`, `upload_notification`, `deploy_analytics`,
|
|
13
|
+
`store_analytics`, `test_visualizations`, `dbt_cloud_run`, `dbt_cloud_stats`
|
|
14
|
+
- Conversion of dbt models and profiles into GoodData LDM and deployment inputs
|
|
15
|
+
- Workspace and data source provisioning helpers driven by `gooddata.yml`
|
|
16
|
+
|
|
17
|
+
## Does NOT Own
|
|
18
|
+
|
|
19
|
+
- Core SDK domain and client services → `gooddata-sdk`
|
|
20
|
+
- Generic orchestration and storage automation → `gooddata-pipelines`
|
|
21
|
+
- The dbt runtime itself, which comes from dbt's own tooling — this package does not
|
|
22
|
+
depend on `dbt-core` and never invokes dbt
|
|
23
|
+
|
|
24
|
+
## Architecture
|
|
25
|
+
|
|
26
|
+
**Entry point**: `gooddata_dbt.dbt_plugin:main`.
|
|
27
|
+
|
|
28
|
+
**Depends on**: `gooddata-sdk`, plus `pyyaml`, `attrs`/`cattrs`, `requests`, `tabulate`.
|
|
29
|
+
|
|
30
|
+
The bridge artifact is dbt's compiled `manifest.json`, not the dbt project source.
|
|
31
|
+
`dbt/tables.py` parses it, `dbt/profiles.py` parses `profiles.yml` for connection details,
|
|
32
|
+
`dbt/cloud.py` covers the dbt Cloud REST and GraphQL APIs, and `gooddata/config.py` reads
|
|
33
|
+
the CLI's own config file.
|
|
34
|
+
|
|
35
|
+
### Config file
|
|
36
|
+
|
|
37
|
+
`gooddata.yml` — **note the extension**, `.yml` not `.yaml`; `gooddata-sdk`'s `gdc` CLI
|
|
38
|
+
uses `gooddata.yaml`, which is a genuinely different file. Overridable with
|
|
39
|
+
`--gooddata-config` or `GOODDATA_CONFIG`. See the shipped `gooddata_example.yml`. Its
|
|
40
|
+
top-level keys are `environment_setups` (named sets of environments and workspace
|
|
41
|
+
suffixes), `data_products` (named groups of model ids, each optionally with `localization`
|
|
42
|
+
and `skip_tests`), `organizations` (mapping profiles to data products for multi-tenant
|
|
43
|
+
delivery), and `global_properties`.
|
|
44
|
+
|
|
45
|
+
## Gotchas
|
|
46
|
+
|
|
47
|
+
**Only dbt models tagged `meta.gooddata.model_id` are picked up.** `read_dbt_models()`
|
|
48
|
+
filters the manifest's nodes on that key against the model ids declared in `gooddata.yml`,
|
|
49
|
+
and raises if nothing matches. An untagged table is silently absent from GoodData — this is
|
|
50
|
+
the first thing to check when a model "didn't show up".
|
|
51
|
+
|
|
52
|
+
**`manifest.json` carries no column data types; a warehouse scan supplies them.**
|
|
53
|
+
`set_data_types()` calls the GoodData scan API to fetch real column types before the LDM is
|
|
54
|
+
built. Under `--dry-run` every column becomes `STRING` instead. Since fact/attribute/date
|
|
55
|
+
classification happens *after* this step, anything that changes or skips the scan changes
|
|
56
|
+
the generated model shape.
|
|
57
|
+
|
|
58
|
+
**Entity classification is inferred from SQL types, not configured.** By default `NUMERIC`
|
|
59
|
+
types become facts, `DATE`/`TIMESTAMP`/`TIMESTAMPTZ` become date dimensions, and everything
|
|
60
|
+
else becomes an attribute. Override per column with `meta.gooddata.ldm_type`. Getting this
|
|
61
|
+
wrong silently produces a different LDM rather than an error.
|
|
62
|
+
|
|
63
|
+
**Supported warehouses are a closed, hardcoded list.** `profiles.to_data_class()` handles
|
|
64
|
+
`postgres`, `redshift`, `snowflake`, `vertica`, and `duckdb` only when the path starts with
|
|
65
|
+
`md:` (MotherDuck) — plain local DuckDB is skipped, because GoodData cannot reach a local
|
|
66
|
+
file. Any other `type` in `profiles.yml` raises. That function is the extension point for
|
|
67
|
+
adding a warehouse.
|
|
68
|
+
|
|
69
|
+
**No dbt version or manifest schema check.** The manifest's nodes are structured straight
|
|
70
|
+
through `attrs`/`cattrs` with no assertion on `metadata.dbt_schema_version`. A dbt upgrade
|
|
71
|
+
that reshapes a node fails with an opaque structuring error rather than a version mismatch.
|
|
72
|
+
|
|
73
|
+
**Insecure local defaults.** `GOODDATA_TOKEN` defaults to the well-known GoodData.CN
|
|
74
|
+
bootstrap token and `GOODDATA_HOST` to `http://localhost:3000` — convenient locally,
|
|
75
|
+
dangerous if left unset in CI. dbt Cloud subcommands additionally read `DBT_ACCOUNT_ID`,
|
|
76
|
+
`DBT_JOB_ID`, `DBT_PROJECT_ID` and `DBT_TOKEN`; MotherDuck reads `MOTHERDUCK_TOKEN` from
|
|
77
|
+
the environment directly. dbt's own `{{ env_var(...) }}` templating inside `profiles.yml`
|
|
78
|
+
is resolved by this package's own regex substitution, not by dbt.
|
|
79
|
+
|
|
80
|
+
**`dbt_cloud_*` targets dbt Cloud's hosted endpoints.** `cloud.getdbt.com` is hardcoded;
|
|
81
|
+
there is no self-hosted or alternate-region support, and these subcommands do not work
|
|
82
|
+
against dbt-core output.
|
|
83
|
+
|
|
84
|
+
## Testing
|
|
85
|
+
|
|
86
|
+
Package-local pytest suites under `tests/`, with resources for dbt profiles, targets and
|
|
87
|
+
expected GoodData layouts.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gooddata-dbt
|
|
3
|
-
Version: 1.74.1.
|
|
3
|
+
Version: 1.74.1.dev2
|
|
4
4
|
Summary: dbt plugin for GoodData
|
|
5
5
|
Author-email: GoodData <support@gooddata.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -17,12 +17,12 @@ Classifier: Topic :: Scientific/Engineering
|
|
|
17
17
|
Classifier: Topic :: Software Development
|
|
18
18
|
Classifier: Typing :: Typed
|
|
19
19
|
Requires-Python: >=3.10
|
|
20
|
-
Requires-Dist: attrs<=
|
|
21
|
-
Requires-Dist: cattrs<=
|
|
22
|
-
Requires-Dist: gooddata-sdk~=1.74.1.
|
|
20
|
+
Requires-Dist: attrs<=26.1.0,>=21.4.0
|
|
21
|
+
Requires-Dist: cattrs<=26.1.0,>=22.1.0
|
|
22
|
+
Requires-Dist: gooddata-sdk~=1.74.1.dev2
|
|
23
23
|
Requires-Dist: pyyaml>=6.0
|
|
24
24
|
Requires-Dist: requests<3.0.0,>=2.33.0
|
|
25
|
-
Requires-Dist: tabulate
|
|
25
|
+
Requires-Dist: tabulate<1.0.0,>=0.8.10
|
|
26
26
|
Description-Content-Type: text/markdown
|
|
27
27
|
|
|
28
28
|
# gooddata-dbt
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# (C) 2025 GoodData Corporation
|
|
2
2
|
[project]
|
|
3
3
|
name = "gooddata-dbt"
|
|
4
|
-
version = "1.74.1.
|
|
4
|
+
version = "1.74.1.dev2"
|
|
5
5
|
description = "dbt plugin for GoodData"
|
|
6
6
|
readme = "README.md"
|
|
7
7
|
license = "MIT"
|
|
@@ -10,12 +10,12 @@ authors = [
|
|
|
10
10
|
]
|
|
11
11
|
requires-python = ">=3.10"
|
|
12
12
|
dependencies = [
|
|
13
|
-
"gooddata-sdk~=1.74.1.
|
|
13
|
+
"gooddata-sdk~=1.74.1.dev2",
|
|
14
14
|
"pyyaml>=6.0",
|
|
15
|
-
"attrs>=21.4.0,<=
|
|
16
|
-
"cattrs>=22.1.0,<=
|
|
15
|
+
"attrs>=21.4.0,<=26.1.0",
|
|
16
|
+
"cattrs>=22.1.0,<=26.1.0",
|
|
17
17
|
"requests>=2.33.0,<3.0.0",
|
|
18
|
-
"tabulate
|
|
18
|
+
"tabulate>=0.8.10,<1.0.0",
|
|
19
19
|
]
|
|
20
20
|
classifiers = [
|
|
21
21
|
"Development Status :: 4 - Beta",
|
|
@@ -36,8 +36,8 @@ gooddata-dbt = "gooddata_dbt.dbt_plugin:main"
|
|
|
36
36
|
|
|
37
37
|
[dependency-groups]
|
|
38
38
|
test = [
|
|
39
|
-
"pytest~=
|
|
40
|
-
"pytest-cov~=
|
|
39
|
+
"pytest~=9.1.1",
|
|
40
|
+
"pytest-cov~=7.1.0",
|
|
41
41
|
"pytest-json-report==1.5.0",
|
|
42
42
|
]
|
|
43
43
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/gooddata/api_wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/dbt_profiles/profiles.yml
RENAMED
|
File without changes
|
{gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/dbt_target/manifest.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|