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.
Files changed (62) hide show
  1. gooddata_dbt-1.74.1.dev2/AGENTS.md +87 -0
  2. gooddata_dbt-1.74.1.dev2/CLAUDE.md +1 -0
  3. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/PKG-INFO +5 -5
  4. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/pyproject.toml +7 -7
  5. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/.env.custom.dev +0 -0
  6. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/.env.dev +0 -0
  7. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/.gitignore +0 -0
  8. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/LICENSE.txt +0 -0
  9. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/Makefile +0 -0
  10. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/README.md +0 -0
  11. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/bin/gooddata-dbt +0 -0
  12. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/gooddata_example.yml +0 -0
  13. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/__init__.py +0 -0
  14. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/_version.py +0 -0
  15. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/args.py +0 -0
  16. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/__init__.py +0 -0
  17. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/base.py +0 -0
  18. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/cloud.py +0 -0
  19. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/environment.py +0 -0
  20. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/metrics.py +0 -0
  21. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/profiles.py +0 -0
  22. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt/tables.py +0 -0
  23. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/dbt_plugin.py +0 -0
  24. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/gooddata/__init__.py +0 -0
  25. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/gooddata/api_wrapper.py +0 -0
  26. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/gooddata/config.py +0 -0
  27. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/logger.py +0 -0
  28. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/main.py +0 -0
  29. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/sdk_wrapper.py +0 -0
  30. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/src/gooddata_dbt/utils.py +0 -0
  31. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/conftest.py +0 -0
  32. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/gooddata_example.yml +0 -0
  33. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/dbt_profiles/profiles.yml +0 -0
  34. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/dbt_target/manifest.json +0 -0
  35. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/aircraft.yaml +0 -0
  36. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/aircraft_models.yaml +0 -0
  37. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/airports.yaml +0 -0
  38. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/ambient_temperature.yaml +0 -0
  39. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/carriers.yaml +0 -0
  40. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/census.yaml +0 -0
  41. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/census_by_country.yaml +0 -0
  42. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/commits.yaml +0 -0
  43. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/customer.yaml +0 -0
  44. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/eshop_customers.yaml +0 -0
  45. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/flights.yaml +0 -0
  46. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/home_rentals.yaml +0 -0
  47. {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
  48. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/mall_customers.yaml +0 -0
  49. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/monthlyinventory.yaml +0 -0
  50. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/order_lines.yaml +0 -0
  51. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/orders.yaml +0 -0
  52. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/product.yaml +0 -0
  53. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/pull_requests.yaml +0 -0
  54. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/repos.yaml +0 -0
  55. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/returns.yaml +0 -0
  56. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/telco_customer_churn.yaml +0 -0
  57. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/users.yaml +0 -0
  58. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/resources/gooddata_layouts/pdm/workflow_runs.yaml +0 -0
  59. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/test_args.py +0 -0
  60. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/test_profiles.py +0 -0
  61. {gooddata_dbt-1.74.1.dev1 → gooddata_dbt-1.74.1.dev2}/tests/test_tables.py +0 -0
  62. {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.dev1
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<=24.2.0,>=21.4.0
21
- Requires-Dist: cattrs<=24.1.1,>=22.1.0
22
- Requires-Dist: gooddata-sdk~=1.74.1.dev1
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~=0.8.10
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.dev1"
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.dev1",
13
+ "gooddata-sdk~=1.74.1.dev2",
14
14
  "pyyaml>=6.0",
15
- "attrs>=21.4.0,<=24.2.0",
16
- "cattrs>=22.1.0,<=24.1.1",
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~=0.8.10",
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~=8.3.4",
40
- "pytest-cov~=6.0.0",
39
+ "pytest~=9.1.1",
40
+ "pytest-cov~=7.1.0",
41
41
  "pytest-json-report==1.5.0",
42
42
  ]
43
43