44import os
55from pathlib import Path
66from typing import List , Dict , Tuple , Set , Optional
7+ import yaml
78
89from packaging .version import parse as parse_version
910import pydantic
11+ from dbt_artifacts_parser .parser import parse_run_results , parse_manifest
12+ from dbt .config .renderer import ProfileRenderer
1013
1114from .utils import getLogger , get_from_dict_with_raise
1215from .version import __version__
1518logger = 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
4848RUN_RESULTS_PATH = "target/run_results.json"
@@ -77,13 +77,8 @@ class TDatadiffModelConfig(pydantic.BaseModel):
7777
7878class 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 )
0 commit comments