Skip to content

Commit 4deb768

Browse files
authored
Organize code part 2 (#17)
* Organize code * Organize code
1 parent c3214cb commit 4deb768

File tree

18 files changed

+200
-156
lines changed

18 files changed

+200
-156
lines changed

opendbt/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from dbt.contracts.results import RunResult
1111
from dbt.exceptions import DbtRuntimeError
1212

13-
from opendbt.overrides import patch_dbt
13+
from opendbt.dbt import patch_dbt
1414
from opendbt.utils import Utils
1515

1616
######################

opendbt/dbt/__init__.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import dbt
2+
from packaging.version import Version
3+
4+
5+
def patch_dbt():
6+
# ================================================================================================================
7+
# Monkey Patching! Override dbt lib AdapterContainer.register_adapter method with new one above
8+
# ================================================================================================================
9+
if Version(dbt.version.get_installed_version().to_version_string(skip_matcher=True)) < Version("1.8.0"):
10+
from opendbt.dbt.v17.task.docs.generate import OpenDbtGenerateTask
11+
from opendbt.dbt.v17.adapters.factory import OpenDbtAdapterContainer
12+
dbt.task.generate.GenerateTask = OpenDbtGenerateTask
13+
dbt.adapters.factory.FACTORY = OpenDbtAdapterContainer()
14+
else:
15+
from opendbt.dbt.v18.task.docs.generate import OpenDbtGenerateTask
16+
from opendbt.dbt.v18.adapters.factory import OpenDbtAdapterContainer
17+
dbt.task.docs.generate.GenerateTask = OpenDbtGenerateTask
18+
dbt.adapters.factory.FACTORY = OpenDbtAdapterContainer()

opendbt/dbt/v17/__init__.py

Whitespace-only changes.

opendbt/dbt/v17/adapters/__init__.py

Whitespace-only changes.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import importlib
2+
from importlib import import_module
3+
4+
from dbt.adapters import factory
5+
from dbt.adapters.factory import Adapter
6+
from dbt.events.functions import fire_event
7+
from dbt.events.types import AdapterRegistered
8+
from dbt.semver import VersionSpecifier
9+
10+
11+
class OpenDbtAdapterContainer(factory.AdapterContainer):
12+
DBT_CUSTOM_ADAPTER_VAR = 'dbt_custom_adapter'
13+
def register_adapter(self, config: 'AdapterRequiredConfig') -> None:
14+
# ==== CUSTOM CODE ====
15+
# ==== END CUSTOM CODE ====
16+
adapter_name = config.credentials.type
17+
adapter_type = self.get_adapter_class_by_name(adapter_name)
18+
adapter_version = import_module(f".{adapter_name}.__version__", "dbt.adapters").version
19+
# ==== CUSTOM CODE ====
20+
custom_adapter_class_name: str = self.get_custom_adapter_config_value(config)
21+
if custom_adapter_class_name and custom_adapter_class_name.strip():
22+
# OVERRIDE DEFAULT ADAPTER BY USER GIVEN ADAPTER CLASS
23+
adapter_type = self.get_custom_adapter_class_by_name(custom_adapter_class_name)
24+
# ==== END CUSTOM CODE ====
25+
adapter_version_specifier = VersionSpecifier.from_version_string(
26+
adapter_version
27+
).to_version_string()
28+
fire_event(
29+
AdapterRegistered(adapter_name=adapter_name, adapter_version=adapter_version_specifier)
30+
)
31+
with self.lock:
32+
if adapter_name in self.adapters:
33+
# this shouldn't really happen...
34+
return
35+
36+
adapter: Adapter = adapter_type(config) # type: ignore
37+
self.adapters[adapter_name] = adapter
38+
39+
def get_custom_adapter_config_value(self, config: 'AdapterRequiredConfig') -> str:
40+
# FIRST: it's set as cli value: dbt run --vars {'dbt_custom_adapter': 'custom_adapters.DuckDBAdapterV1Custom'}
41+
if hasattr(config, 'cli_vars') and self.DBT_CUSTOM_ADAPTER_VAR in config.cli_vars:
42+
custom_adapter_class_name: str = config.cli_vars[self.DBT_CUSTOM_ADAPTER_VAR]
43+
if custom_adapter_class_name and custom_adapter_class_name.strip():
44+
return custom_adapter_class_name
45+
# SECOND: it's set inside dbt_project.yml
46+
if hasattr(config, 'vars') and self.DBT_CUSTOM_ADAPTER_VAR in config.vars.to_dict():
47+
custom_adapter_class_name: str = config.vars.to_dict()[self.DBT_CUSTOM_ADAPTER_VAR]
48+
if custom_adapter_class_name and custom_adapter_class_name.strip():
49+
return custom_adapter_class_name
50+
51+
return None
52+
53+
def get_custom_adapter_class_by_name(self, custom_adapter_class_name: str):
54+
if "." not in custom_adapter_class_name:
55+
raise ValueError(f"Unexpected adapter class name: `{custom_adapter_class_name}` ,"
56+
f"Expecting something like:`my.sample.library.MyAdapterClass`")
57+
58+
__module, __class = custom_adapter_class_name.rsplit('.', 1)
59+
try:
60+
user_adapter_module = importlib.import_module(__module)
61+
user_adapter_class = getattr(user_adapter_module, __class)
62+
return user_adapter_class
63+
except ModuleNotFoundError as mnfe:
64+
raise Exception(f"Module of provided adapter not found, provided: {custom_adapter_class_name}") from mnfe

opendbt/dbt/v17/task/__init__.py

Whitespace-only changes.

opendbt/dbt/v17/task/docs/__init__.py

Whitespace-only changes.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import shutil
2+
from pathlib import Path
3+
4+
import click
5+
from dbt.task.generate import GenerateTask
6+
7+
8+
class OpenDbtGenerateTask(GenerateTask):
9+
10+
def deploy_user_index_html(self):
11+
# run custom code
12+
target = Path(self.config.project_target_path).joinpath("index.html")
13+
for dir in self.config.docs_paths:
14+
index_html = Path(self.config.project_root).joinpath(dir).joinpath("index.html")
15+
if index_html.is_file() and index_html.exists():
16+
# override default dbt provided index.html with user index.html file
17+
shutil.copyfile(index_html, target)
18+
click.echo(f"Using user provided documentation page: {index_html.as_posix()}")
19+
break
20+
21+
def run(self):
22+
# Call the original dbt run method
23+
super().run()
24+
self.deploy_user_index_html()

opendbt/dbt/v18/__init__.py

Whitespace-only changes.

opendbt/dbt/v18/adapters/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)