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.
Files changed (64) hide show
  1. dagster_dbt/__init__.py +41 -140
  2. dagster_dbt/asset_decorator.py +49 -230
  3. dagster_dbt/asset_specs.py +65 -0
  4. dagster_dbt/asset_utils.py +655 -338
  5. dagster_dbt/cli/app.py +44 -43
  6. dagster_dbt/cloud/__init__.py +6 -4
  7. dagster_dbt/cloud/asset_defs.py +119 -177
  8. dagster_dbt/cloud/cli.py +3 -4
  9. dagster_dbt/cloud/ops.py +9 -6
  10. dagster_dbt/cloud/resources.py +9 -4
  11. dagster_dbt/cloud/types.py +12 -7
  12. dagster_dbt/cloud/utils.py +186 -0
  13. dagster_dbt/cloud_v2/__init__.py +10 -0
  14. dagster_dbt/cloud_v2/asset_decorator.py +81 -0
  15. dagster_dbt/cloud_v2/cli_invocation.py +67 -0
  16. dagster_dbt/cloud_v2/client.py +438 -0
  17. dagster_dbt/cloud_v2/resources.py +462 -0
  18. dagster_dbt/cloud_v2/run_handler.py +229 -0
  19. dagster_dbt/cloud_v2/sensor_builder.py +254 -0
  20. dagster_dbt/cloud_v2/types.py +143 -0
  21. dagster_dbt/compat.py +107 -0
  22. dagster_dbt/components/__init__.py +0 -0
  23. dagster_dbt/components/dbt_project/__init__.py +0 -0
  24. dagster_dbt/components/dbt_project/component.py +545 -0
  25. dagster_dbt/components/dbt_project/scaffolder.py +65 -0
  26. dagster_dbt/core/__init__.py +0 -10
  27. dagster_dbt/core/dbt_cli_event.py +612 -0
  28. dagster_dbt/core/dbt_cli_invocation.py +474 -0
  29. dagster_dbt/core/dbt_event_iterator.py +399 -0
  30. dagster_dbt/core/resource.py +733 -0
  31. dagster_dbt/core/utils.py +14 -279
  32. dagster_dbt/dagster_dbt_translator.py +317 -74
  33. dagster_dbt/dbt_core_version.py +1 -0
  34. dagster_dbt/dbt_manifest.py +6 -5
  35. dagster_dbt/dbt_manifest_asset_selection.py +62 -22
  36. dagster_dbt/dbt_project.py +179 -40
  37. dagster_dbt/dbt_project_manager.py +173 -0
  38. dagster_dbt/dbt_version.py +0 -0
  39. dagster_dbt/errors.py +9 -84
  40. dagster_dbt/freshness_builder.py +147 -0
  41. dagster_dbt/include/pyproject.toml.jinja +21 -0
  42. dagster_dbt/include/scaffold/assets.py.jinja +1 -8
  43. dagster_dbt/include/scaffold/definitions.py.jinja +0 -15
  44. dagster_dbt/include/scaffold/project.py.jinja +1 -0
  45. dagster_dbt/include/setup.py.jinja +2 -3
  46. dagster_dbt/metadata_set.py +18 -0
  47. dagster_dbt/utils.py +136 -234
  48. dagster_dbt/version.py +1 -1
  49. dagster_dbt-0.28.4.dist-info/METADATA +47 -0
  50. dagster_dbt-0.28.4.dist-info/RECORD +59 -0
  51. {dagster_dbt-0.23.3.dist-info → dagster_dbt-0.28.4.dist-info}/WHEEL +1 -1
  52. {dagster_dbt-0.23.3.dist-info → dagster_dbt-0.28.4.dist-info}/entry_points.txt +3 -0
  53. {dagster_dbt-0.23.3.dist-info → dagster_dbt-0.28.4.dist-info/licenses}/LICENSE +1 -1
  54. dagster_dbt/asset_defs.py +0 -1049
  55. dagster_dbt/core/resources.py +0 -527
  56. dagster_dbt/core/resources_v2.py +0 -1542
  57. dagster_dbt/core/types.py +0 -63
  58. dagster_dbt/dbt_resource.py +0 -220
  59. dagster_dbt/include/scaffold/constants.py.jinja +0 -21
  60. dagster_dbt/ops.py +0 -134
  61. dagster_dbt/types.py +0 -22
  62. dagster_dbt-0.23.3.dist-info/METADATA +0 -31
  63. dagster_dbt-0.23.3.dist-info/RECORD +0 -43
  64. {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 Any, Dict, Iterator
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 find_objects_in_module_of_types
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 ..dbt_project import DbtProject
17
- from ..include import STARTER_PROJECT_PATH
18
- from ..version import __version__ as dagster_dbt_version
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: Dict[str, Any] = yaml.safe_load(dbt_project_yaml_path.read_bytes())
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: Dict[str, Any] = yaml.safe_load(dbt_profiles_path.read_bytes())
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 = "DAGSTER_DBT_PARSE_PROJECT_ON_LOAD=1 dagster dev"
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 prepare_for_deployment(project: DbtProject) -> None:
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.manifest_preparer:
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.manifest_preparer.prepare.__qualname__}[/bold green]."
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.manifest_preparer.prepare(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
- def project_prepare_for_deployment_command(
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
- str,
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 ``prepare_for_deployment`` on :py:class:`DbtProject` found in the target module or file."""
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
- prepare_for_deployment(project)
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()
@@ -1,8 +1,10 @@
1
- from .asset_defs import load_assets_from_dbt_cloud_job as load_assets_from_dbt_cloud_job
2
- from .ops import dbt_cloud_run_op as dbt_cloud_run_op
3
- from .resources import (
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