Skip to content

Commit

Permalink
Enable multi project references and settings
Browse files Browse the repository at this point in the history
  • Loading branch information
ismailsimsek committed Dec 16, 2024
1 parent 532719f commit 2d09443
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
2 changes: 2 additions & 0 deletions opendbt/dbt/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ def patch_dbt():
dbt.adapters.factory.FACTORY = OpenDbtAdapterContainer()
from opendbt.dbt.v18.task.run import ModelRunner
dbt.task.run.ModelRunner = ModelRunner
from opendbt.dbt.v18.config.runtime import OpenDbtRuntimeConfig
dbt.config.RuntimeConfig = OpenDbtRuntimeConfig
else:
raise Exception(
f"Unsupported dbt version {dbt_version}, please make sure dbt version is supported/integrated by opendbt")
Expand Down
Empty file.
53 changes: 53 additions & 0 deletions opendbt/dbt/v18/config/runtime.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from dataclasses import dataclass
from pathlib import Path
from typing import Mapping

from dbt.config import RuntimeConfig
from dbt.config.project import load_yml_dict
from dbt.constants import DEPENDENCIES_FILE_NAME
from dbt.exceptions import (
DbtProjectError, NonUniquePackageNameError,
)
from typing_extensions import override


# pylint: disable=too-many-ancestors
@dataclass
class OpenDbtRuntimeConfig(RuntimeConfig):
def load_dependence_projects(self):
dependencies_yml_dict = load_yml_dict(f"{self.project_root}/{DEPENDENCIES_FILE_NAME}")

if "projects" not in dependencies_yml_dict:
return

projects = dependencies_yml_dict["projects"]
project_root_parent = Path(self.project_root).parent
for project in projects:
path = project_root_parent.joinpath(project['name'])
try:
project = self.new_project(str(path.as_posix()))
except DbtProjectError as e:
raise DbtProjectError(
f"Failed to read depending project: {e} \n project path:{path.as_posix()}",
result_type="invalid_project",
path=path,
) from e

yield project.project_name, project

@override
def load_dependencies(self, base_only=False) -> Mapping[str, "RuntimeConfig"]:
# if self.dependencies is None:

if self.dependencies is None:
# this sets self.dependencies variable!
self.dependencies = super().load_dependencies()

# additionally load `projects` defined in `dependencies.yml`
for project_name, project in self.load_dependence_projects():
print(f"WARN: loading:{project_name} , project:{project}")
if project_name in self.dependencies:
raise NonUniquePackageNameError(project_name)
self.dependencies[project_name] = project

return self.dependencies

0 comments on commit 2d09443

Please sign in to comment.