dagster-dbt 0.23.3__py3-none-any.whl → 0.28.4__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.
- dagster_dbt/__init__.py +41 -140
- dagster_dbt/asset_decorator.py +49 -230
- dagster_dbt/asset_specs.py +65 -0
- dagster_dbt/asset_utils.py +655 -338
- dagster_dbt/cli/app.py +44 -43
- dagster_dbt/cloud/__init__.py +6 -4
- dagster_dbt/cloud/asset_defs.py +119 -177
- dagster_dbt/cloud/cli.py +3 -4
- dagster_dbt/cloud/ops.py +9 -6
- dagster_dbt/cloud/resources.py +9 -4
- dagster_dbt/cloud/types.py +12 -7
- dagster_dbt/cloud/utils.py +186 -0
- dagster_dbt/cloud_v2/__init__.py +10 -0
- dagster_dbt/cloud_v2/asset_decorator.py +81 -0
- dagster_dbt/cloud_v2/cli_invocation.py +67 -0
- dagster_dbt/cloud_v2/client.py +438 -0
- dagster_dbt/cloud_v2/resources.py +462 -0
- dagster_dbt/cloud_v2/run_handler.py +229 -0
- dagster_dbt/cloud_v2/sensor_builder.py +254 -0
- dagster_dbt/cloud_v2/types.py +143 -0
- dagster_dbt/compat.py +107 -0
- dagster_dbt/components/__init__.py +0 -0
- dagster_dbt/components/dbt_project/__init__.py +0 -0
- dagster_dbt/components/dbt_project/component.py +545 -0
- dagster_dbt/components/dbt_project/scaffolder.py +65 -0
- dagster_dbt/core/__init__.py +0 -10
- dagster_dbt/core/dbt_cli_event.py +612 -0
- dagster_dbt/core/dbt_cli_invocation.py +474 -0
- dagster_dbt/core/dbt_event_iterator.py +399 -0
- dagster_dbt/core/resource.py +733 -0
- dagster_dbt/core/utils.py +14 -279
- dagster_dbt/dagster_dbt_translator.py +317 -74
- dagster_dbt/dbt_core_version.py +1 -0
- dagster_dbt/dbt_manifest.py +6 -5
- dagster_dbt/dbt_manifest_asset_selection.py +62 -22
- dagster_dbt/dbt_project.py +179 -40
- dagster_dbt/dbt_project_manager.py +173 -0
- dagster_dbt/dbt_version.py +0 -0
- dagster_dbt/errors.py +9 -84
- dagster_dbt/freshness_builder.py +147 -0
- dagster_dbt/include/pyproject.toml.jinja +21 -0
- dagster_dbt/include/scaffold/assets.py.jinja +1 -8
- dagster_dbt/include/scaffold/definitions.py.jinja +0 -15
- dagster_dbt/include/scaffold/project.py.jinja +1 -0
- dagster_dbt/include/setup.py.jinja +2 -3
- dagster_dbt/metadata_set.py +18 -0
- dagster_dbt/utils.py +136 -234
- dagster_dbt/version.py +1 -1
- dagster_dbt-0.28.4.dist-info/METADATA +47 -0
- dagster_dbt-0.28.4.dist-info/RECORD +59 -0
- {dagster_dbt-0.23.3.dist-info → dagster_dbt-0.28.4.dist-info}/WHEEL +1 -1
- {dagster_dbt-0.23.3.dist-info → dagster_dbt-0.28.4.dist-info}/entry_points.txt +3 -0
- {dagster_dbt-0.23.3.dist-info → dagster_dbt-0.28.4.dist-info/licenses}/LICENSE +1 -1
- dagster_dbt/asset_defs.py +0 -1049
- dagster_dbt/core/resources.py +0 -527
- dagster_dbt/core/resources_v2.py +0 -1542
- dagster_dbt/core/types.py +0 -63
- dagster_dbt/dbt_resource.py +0 -220
- dagster_dbt/include/scaffold/constants.py.jinja +0 -21
- dagster_dbt/ops.py +0 -134
- dagster_dbt/types.py +0 -22
- dagster_dbt-0.23.3.dist-info/METADATA +0 -31
- dagster_dbt-0.23.3.dist-info/RECORD +0 -43
- {dagster_dbt-0.23.3.dist-info → dagster_dbt-0.28.4.dist-info}/top_level.txt +0 -0
dagster_dbt/cli/app.py
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import shutil
|
|
3
3
|
from pathlib import Path
|
|
4
|
-
from typing import
|
|
4
|
+
from typing import Annotated, Any, Optional
|
|
5
5
|
|
|
6
|
+
import click
|
|
6
7
|
import typer
|
|
7
8
|
import yaml
|
|
8
9
|
from dagster._cli.project import check_if_pypi_package_conflict_exists
|
|
9
10
|
from dagster._core.code_pointer import load_python_file
|
|
10
|
-
from dagster._core.definitions.load_assets_from_modules import
|
|
11
|
+
from dagster._core.definitions.module_loaders.load_assets_from_modules import (
|
|
12
|
+
find_objects_in_module_of_types,
|
|
13
|
+
)
|
|
11
14
|
from jinja2 import Environment, FileSystemLoader
|
|
12
15
|
from rich.console import Console
|
|
13
16
|
from rich.syntax import Syntax
|
|
14
|
-
from typing_extensions import Annotated
|
|
15
17
|
|
|
16
|
-
from
|
|
17
|
-
from
|
|
18
|
-
from
|
|
18
|
+
from dagster_dbt.dbt_core_version import DBT_CORE_VERSION_UPPER_BOUND
|
|
19
|
+
from dagster_dbt.dbt_project import DbtProject
|
|
20
|
+
from dagster_dbt.include import STARTER_PROJECT_PATH
|
|
21
|
+
from dagster_dbt.version import __version__ as dagster_dbt_version
|
|
19
22
|
|
|
20
23
|
app = typer.Typer(
|
|
21
24
|
no_args_is_help=True,
|
|
@@ -107,14 +110,13 @@ def copy_scaffold(
|
|
|
107
110
|
dagster_project_dir: Path,
|
|
108
111
|
dbt_project_dir: Path,
|
|
109
112
|
use_experimental_dbt_state: bool,
|
|
110
|
-
use_experimental_dbt_project: bool,
|
|
111
113
|
) -> None:
|
|
112
114
|
dbt_project_yaml_path = dbt_project_dir.joinpath(DBT_PROJECT_YML_NAME)
|
|
113
|
-
dbt_project_yaml:
|
|
115
|
+
dbt_project_yaml: dict[str, Any] = yaml.safe_load(dbt_project_yaml_path.read_bytes())
|
|
114
116
|
dbt_project_name: str = dbt_project_yaml["name"]
|
|
115
117
|
|
|
116
118
|
dbt_profiles_path = find_dbt_profiles_path(dbt_project_dir=dbt_project_dir)
|
|
117
|
-
dbt_profiles_yaml:
|
|
119
|
+
dbt_profiles_yaml: dict[str, Any] = yaml.safe_load(dbt_profiles_path.read_bytes())
|
|
118
120
|
|
|
119
121
|
# Remove config from profiles.yml
|
|
120
122
|
dbt_profiles_yaml.pop("config", None)
|
|
@@ -157,20 +159,15 @@ def copy_scaffold(
|
|
|
157
159
|
dbt_parse_command=dbt_parse_command,
|
|
158
160
|
dbt_assets_name=f"{dbt_project_name}_dbt_assets",
|
|
159
161
|
dbt_adapter_packages=dbt_adapter_packages,
|
|
162
|
+
dbt_core_version_upper_bound=DBT_CORE_VERSION_UPPER_BOUND,
|
|
160
163
|
project_name=project_name,
|
|
161
164
|
use_experimental_dbt_state=use_experimental_dbt_state,
|
|
162
|
-
use_experimental_dbt_project=use_experimental_dbt_project,
|
|
163
165
|
).dump(destination_path)
|
|
164
166
|
|
|
165
167
|
path.unlink()
|
|
166
168
|
|
|
167
169
|
dagster_project_dir.joinpath("scaffold").rename(dagster_project_dir.joinpath(project_name))
|
|
168
170
|
|
|
169
|
-
if use_experimental_dbt_project:
|
|
170
|
-
dagster_project_dir.joinpath(project_name, "constants.py").unlink()
|
|
171
|
-
else:
|
|
172
|
-
dagster_project_dir.joinpath(project_name, "project.py").unlink()
|
|
173
|
-
|
|
174
171
|
|
|
175
172
|
def _check_and_error_on_package_conflicts(project_name: str) -> None:
|
|
176
173
|
package_check_result = check_if_pypi_package_conflict_exists(project_name)
|
|
@@ -244,17 +241,6 @@ def project_scaffold_command(
|
|
|
244
241
|
hidden=True,
|
|
245
242
|
),
|
|
246
243
|
] = False,
|
|
247
|
-
use_experimental_dbt_project: Annotated[
|
|
248
|
-
bool,
|
|
249
|
-
typer.Option(
|
|
250
|
-
...,
|
|
251
|
-
"--use-experimental-dbt-project",
|
|
252
|
-
"--use-dbt-project-package-data-dir",
|
|
253
|
-
help="Controls whether `DbtProject` is used.",
|
|
254
|
-
is_flag=True,
|
|
255
|
-
hidden=True,
|
|
256
|
-
),
|
|
257
|
-
] = False,
|
|
258
244
|
) -> None:
|
|
259
245
|
"""This command will initialize a new Dagster project and create directories and files that
|
|
260
246
|
load assets from an existing dbt project.
|
|
@@ -271,19 +257,15 @@ def project_scaffold_command(
|
|
|
271
257
|
)
|
|
272
258
|
|
|
273
259
|
dagster_project_dir = Path.cwd().joinpath(project_name)
|
|
274
|
-
use_experimental_dbt_project = use_experimental_dbt_project or use_experimental_dbt_state
|
|
275
260
|
|
|
276
261
|
copy_scaffold(
|
|
277
262
|
project_name=project_name,
|
|
278
263
|
dagster_project_dir=dagster_project_dir,
|
|
279
264
|
dbt_project_dir=dbt_project_dir,
|
|
280
265
|
use_experimental_dbt_state=use_experimental_dbt_state,
|
|
281
|
-
use_experimental_dbt_project=use_experimental_dbt_project,
|
|
282
266
|
)
|
|
283
267
|
|
|
284
|
-
dagster_dev_command = "
|
|
285
|
-
if use_experimental_dbt_project:
|
|
286
|
-
dagster_dev_command = "dagster dev"
|
|
268
|
+
dagster_dev_command = "dagster dev"
|
|
287
269
|
|
|
288
270
|
console.print(
|
|
289
271
|
"Your Dagster project has been initialized. To view your dbt project in Dagster, run"
|
|
@@ -301,13 +283,13 @@ def project_scaffold_command(
|
|
|
301
283
|
)
|
|
302
284
|
|
|
303
285
|
|
|
304
|
-
def
|
|
286
|
+
def prepare_and_package(project: DbtProject) -> None:
|
|
305
287
|
"""A method that can be called as part of the deployment process."""
|
|
306
|
-
if project.
|
|
288
|
+
if project.preparer:
|
|
307
289
|
console.print(
|
|
308
|
-
f"Preparing project [bold green]{project.project_dir}[/bold green] for deployment with [bold green]{project.
|
|
290
|
+
f"Preparing project [bold green]{project.project_dir}[/bold green] for deployment with [bold green]{project.preparer.prepare.__qualname__}[/bold green]."
|
|
309
291
|
)
|
|
310
|
-
project.
|
|
292
|
+
project.preparer.prepare(project)
|
|
311
293
|
console.print("Project preparation complete.")
|
|
312
294
|
|
|
313
295
|
if project.packaged_project_dir:
|
|
@@ -356,24 +338,43 @@ def sync_project_to_packaged_dir(
|
|
|
356
338
|
console.print("Sync complete.")
|
|
357
339
|
|
|
358
340
|
|
|
359
|
-
@project_app.command(name="prepare-for-deployment")
|
|
360
|
-
|
|
341
|
+
@project_app.command(name="prepare-for-deployment", hidden=True)
|
|
342
|
+
@project_app.command(name="prepare-and-package")
|
|
343
|
+
def project_prepare_and_package_command(
|
|
361
344
|
file: Annotated[
|
|
362
|
-
|
|
345
|
+
Optional[Path],
|
|
363
346
|
typer.Option(
|
|
364
347
|
help="The file containing DbtProject definitions to prepare.",
|
|
365
348
|
),
|
|
366
|
-
],
|
|
349
|
+
] = None,
|
|
350
|
+
components: Annotated[
|
|
351
|
+
Optional[Path],
|
|
352
|
+
typer.Option(
|
|
353
|
+
help="The path to a dg project directory containing DbtProjectComponents.",
|
|
354
|
+
),
|
|
355
|
+
] = None,
|
|
367
356
|
) -> None:
|
|
368
|
-
"""This command will invoke ``
|
|
357
|
+
"""This command will invoke ``prepare_and_package`` on :py:class:`DbtProject` found in the target module or file.
|
|
358
|
+
Note that this command runs `dbt deps` and `dbt parse`.
|
|
359
|
+
"""
|
|
369
360
|
console.print(
|
|
370
361
|
f"Running with dagster-dbt version: [bold green]{dagster_dbt_version}[/bold green]."
|
|
371
362
|
)
|
|
363
|
+
if file:
|
|
364
|
+
contents = load_python_file(file, working_directory=None)
|
|
365
|
+
dbt_projects = find_objects_in_module_of_types(contents, types=DbtProject)
|
|
366
|
+
elif components:
|
|
367
|
+
from dagster_dbt.components.dbt_project.component import get_projects_from_dbt_component
|
|
368
|
+
|
|
369
|
+
dbt_projects = get_projects_from_dbt_component(components)
|
|
370
|
+
else:
|
|
371
|
+
raise click.UsageError("Must specify --file or --components")
|
|
372
372
|
|
|
373
|
-
contents = load_python_file(file, working_directory=None)
|
|
374
|
-
dbt_projects: Iterator[DbtProject] = find_objects_in_module_of_types(contents, types=DbtProject)
|
|
375
373
|
for project in dbt_projects:
|
|
376
|
-
|
|
374
|
+
prepare_and_package(project)
|
|
377
375
|
|
|
378
376
|
|
|
379
377
|
project_app_typer_click_object = typer.main.get_command(project_app)
|
|
378
|
+
|
|
379
|
+
if __name__ == "__main__":
|
|
380
|
+
app()
|
dagster_dbt/cloud/__init__.py
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
from .asset_defs import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
from dagster_dbt.cloud.asset_defs import (
|
|
2
|
+
load_assets_from_dbt_cloud_job as load_assets_from_dbt_cloud_job,
|
|
3
|
+
)
|
|
4
|
+
from dagster_dbt.cloud.ops import dbt_cloud_run_op as dbt_cloud_run_op
|
|
5
|
+
from dagster_dbt.cloud.resources import (
|
|
4
6
|
DbtCloudClientResource as DbtCloudClientResource,
|
|
5
7
|
DbtCloudResource as DbtCloudResource,
|
|
6
8
|
dbt_cloud_resource as dbt_cloud_resource,
|
|
7
9
|
)
|
|
8
|
-
from .types import DbtCloudOutput as DbtCloudOutput
|
|
10
|
+
from dagster_dbt.cloud.types import DbtCloudOutput as DbtCloudOutput
|