Skip to content
This repository was archived by the owner on May 17, 2024. It is now read-only.

Commit e656160

Browse files
authored
Merge pull request #544 from dlawin/daniel-dx-670-simplify-data-diff-installation
remove optional flag from --dbt dependencies
2 parents 006af61 + 8a34aca commit e656160

File tree

5 files changed

+83
-70
lines changed

5 files changed

+83
-70
lines changed

data_diff/dbt_parser.py

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
import os
55
from pathlib import Path
66
from typing import List, Dict, Tuple, Set, Optional
7+
import yaml
78

89
from packaging.version import parse as parse_version
910
import pydantic
11+
from dbt_artifacts_parser.parser import parse_run_results, parse_manifest
12+
from dbt.config.renderer import ProfileRenderer
1013

1114
from .utils import getLogger, get_from_dict_with_raise
1215
from .version import __version__
@@ -15,23 +18,9 @@
1518
logger = getLogger(__name__)
1619

1720

18-
def import_dbt_dependencies():
19-
try:
20-
from dbt_artifacts_parser.parser import parse_run_results, parse_manifest
21-
from dbt.config.renderer import ProfileRenderer
22-
import yaml
23-
except ImportError:
24-
raise RuntimeError("Could not import 'dbt' package. You can install it using: pip install 'data-diff[dbt]'.")
25-
26-
# dbt 1.5+ specific stuff to power selection of models
27-
try:
28-
# ProfileRenderer.render_data() fails without instantiating global flag MACRO_DEBUGGING in dbt-core 1.5
29-
from dbt.flags import set_flags
30-
31-
set_flags(Namespace(MACRO_DEBUGGING=False))
32-
except:
33-
pass
34-
21+
# getting this dbt_runner will only succeed in dbt-core>=1.5
22+
# it's needed for `--select` functionality
23+
def try_get_dbt_runner():
3524
try:
3625
from dbt.cli.main import dbtRunner
3726
except ImportError:
@@ -42,7 +31,18 @@ def import_dbt_dependencies():
4231
else:
4332
dbt_runner = None
4433

45-
return parse_run_results, parse_manifest, ProfileRenderer, yaml, dbt_runner
34+
return dbt_runner
35+
36+
37+
# ProfileRenderer.render_data() fails without instantiating global flag MACRO_DEBUGGING in dbt-core 1.5
38+
# hacky but seems to be a bug on dbt's end
39+
def try_set_dbt_flags():
40+
try:
41+
from dbt.flags import set_flags
42+
43+
set_flags(Namespace(MACRO_DEBUGGING=False))
44+
except:
45+
pass
4646

4747

4848
RUN_RESULTS_PATH = "target/run_results.json"
@@ -77,13 +77,8 @@ class TDatadiffModelConfig(pydantic.BaseModel):
7777

7878
class DbtParser:
7979
def __init__(self, profiles_dir_override: str, project_dir_override: str) -> None:
80-
(
81-
self.parse_run_results,
82-
self.parse_manifest,
83-
self.ProfileRenderer,
84-
self.yaml,
85-
self.dbt_runner,
86-
) = import_dbt_dependencies()
80+
try_set_dbt_flags()
81+
self.dbt_runner = try_get_dbt_runner()
8782
self.profiles_dir = Path(profiles_dir_override or default_profiles_dir())
8883
self.project_dir = Path(project_dir_override or default_project_dir())
8984
self.connection = {}
@@ -173,7 +168,7 @@ def get_run_results_models(self):
173168
with open(self.project_dir / RUN_RESULTS_PATH) as run_results:
174169
logger.info(f"Parsing file {RUN_RESULTS_PATH}")
175170
run_results_dict = json.load(run_results)
176-
run_results_obj = self.parse_run_results(run_results=run_results_dict)
171+
run_results_obj = parse_run_results(run_results=run_results_dict)
177172

178173
dbt_version = parse_version(run_results_obj.metadata.dbt_version)
179174

@@ -199,28 +194,28 @@ def get_manifest_obj(self):
199194
with open(self.project_dir / MANIFEST_PATH) as manifest:
200195
logger.info(f"Parsing file {MANIFEST_PATH}")
201196
manifest_dict = json.load(manifest)
202-
manifest_obj = self.parse_manifest(manifest=manifest_dict)
197+
manifest_obj = parse_manifest(manifest=manifest_dict)
203198
return manifest_obj
204199

205200
def get_project_dict(self):
206201
with open(self.project_dir / PROJECT_FILE) as project:
207202
logger.info(f"Parsing file {PROJECT_FILE}")
208-
project_dict = self.yaml.safe_load(project)
203+
project_dict = yaml.safe_load(project)
209204
return project_dict
210205

211206
def get_connection_creds(self) -> Tuple[Dict[str, str], str]:
212207
profiles_path = self.profiles_dir / PROFILES_FILE
213208
with open(profiles_path) as profiles:
214209
logger.info(f"Parsing file {profiles_path}")
215-
profiles = self.yaml.safe_load(profiles)
210+
profiles = yaml.safe_load(profiles)
216211

217212
dbt_profile_var = self.project_dict.get("profile")
218213

219214
profile = get_from_dict_with_raise(
220215
profiles, dbt_profile_var, f"No profile '{dbt_profile_var}' found in '{profiles_path}'."
221216
)
222217
# values can contain env_vars
223-
rendered_profile = self.ProfileRenderer().render_data(profile)
218+
rendered_profile = ProfileRenderer().render_data(profile)
224219
profile_target = get_from_dict_with_raise(
225220
rendered_profile, "target", f"No target found in profile '{dbt_profile_var}' in '{profiles_path}'."
226221
)

data_diff/sqeleton/databases/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
DbTime,
3737
DbPath,
3838
Boolean,
39-
JSON
39+
JSON,
4040
)
4141
from ..abcs.mixins import Compilable
4242
from ..abcs.mixins import (
@@ -63,7 +63,7 @@ def _inner():
6363
except ModuleNotFoundError as e:
6464
s = text
6565
if package:
66-
s += f"You can install it using 'pip install data_diff[{package}]'."
66+
s += f"Please complete setup by running: pip install 'data_diff[{package}]'."
6767
raise ModuleNotFoundError(f"{e}\n\n{s}\n")
6868

6969
return _inner

poetry.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ trino = {version="^0.314.0", optional=true}
4040
presto-python-client = {version="*", optional=true}
4141
clickhouse-driver = {version="*", optional=true}
4242
duckdb = {version="^0.7.0", optional=true}
43-
dbt-artifacts-parser = {version="^0.3.0", optional=true}
44-
dbt-core = {version="^1.0.0", optional=true}
43+
dbt-artifacts-parser = {version="^0.3.0"}
44+
dbt-core = {version="^1.0.0"}
4545
keyring = "*"
4646
tabulate = "^0.9.0"
4747
preql = {version="^0.2.19", optional=true}
@@ -71,6 +71,7 @@ dbt-core = "^1.0.0"
7171
preql = ["preql"]
7272
mysql = ["mysql-connector-python"]
7373
postgresql = ["psycopg2"]
74+
redshift = ["psycopg2"]
7475
snowflake = ["snowflake-connector-python", "cryptography"]
7576
presto = ["presto-python-client"]
7677
oracle = ["cx_Oracle"]
@@ -79,7 +80,6 @@ trino = ["trino"]
7980
clickhouse = ["clickhouse-driver"]
8081
vertica = ["vertica-python"]
8182
duckdb = ["duckdb"]
82-
dbt = ["dbt-core", "dbt-artifacts-parser"]
8383

8484
[build-system]
8585
requires = ["poetry-core>=1.0.0"]

0 commit comments

Comments
 (0)