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

Commit 3e39288

Browse files
authored
Merge pull request #613 from leoebfolsom/dx-821
remove prompt to create API key and data source, send user straight to docs
2 parents 83e3628 + 95ac52d commit 3e39288

File tree

3 files changed

+54
-30
lines changed

3 files changed

+54
-30
lines changed

data_diff/dbt.py

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,22 @@
22
import os
33
import re
44
import time
5-
import webbrowser
65
from typing import List, Optional, Dict, Tuple, Union
76
import keyring
87
import pydantic
98
import rich
10-
from rich.prompt import Confirm, Prompt
9+
from rich.prompt import Prompt
1110

12-
from data_diff.errors import DataDiffCustomSchemaNoConfigError, DataDiffDbtProjectVarsNotFoundError
11+
from data_diff.errors import (
12+
DataDiffCustomSchemaNoConfigError,
13+
DataDiffDbtProjectVarsNotFoundError,
14+
DataDiffNoAPIKeyError,
15+
DataDiffNoDatasourceIdError,
16+
)
1317

1418
from . import connect_to_table, diff_tables, Algorithm
15-
from .cloud import DatafoldAPI, TCloudApiDataDiff, TCloudApiOrgMeta, get_or_create_data_source
16-
from .dbt_parser import DbtParser, PROJECT_FILE, TDatadiffConfig
19+
from .cloud import DatafoldAPI, TCloudApiDataDiff, TCloudApiOrgMeta
20+
from .dbt_parser import DbtParser, TDatadiffConfig
1721
from .diff_tables import DiffResultWrapper
1822
from .format import jsonify, jsonify_error
1923
from .tracking import (
@@ -41,6 +45,7 @@
4145
)
4246

4347
logger = getLogger(__name__)
48+
CLOUD_DOC_URL = "https://docs.datafold.com/development_testing/cloud"
4449

4550

4651
class TDiffVars(pydantic.BaseModel):
@@ -86,20 +91,9 @@ def dbt_diff(
8691

8792
if config.datasource_id is None:
8893
rich.print("[red]Data source ID not found in dbt_project.yml")
89-
is_create_data_source = Confirm.ask("Would you like to create a new data source?")
90-
if is_create_data_source:
91-
config.datasource_id = get_or_create_data_source(api=api, dbt_parser=dbt_parser)
92-
rich.print(f'To use the data source in next runs, please, update your "{PROJECT_FILE}" with a block:')
93-
rich.print(f"[green]vars:\n data_diff:\n datasource_id: {config.datasource_id}\n")
94-
rich.print(
95-
"Read more about Datafold vars in docs: "
96-
"https://docs.datafold.com/os_diff/dbt_integration/#configure-a-data-source\n"
97-
)
98-
else:
99-
raise ValueError(
100-
"Datasource ID not found, include it as a dbt variable in the dbt_project.yml. "
101-
"\nvars:\n data_diff:\n datasource_id: 1234"
102-
)
94+
raise DataDiffNoDatasourceIdError(
95+
f"Datasource ID not found. Please include it as a dbt variable in the dbt_project.yml. \nInstructions: {CLOUD_DOC_URL}\n\nvars:\n data_diff:\n datasource_id: 1234"
96+
)
10397

10498
data_source = api.get_data_source(config.datasource_id)
10599
dbt_parser.set_casing_policy_for(connection_type=data_source.type)
@@ -339,16 +333,9 @@ def _initialize_api() -> Optional[DatafoldAPI]:
339333
rich.print("[red]API key not found. Getting from the keyring service")
340334
api_key = keyring.get_password("data-diff", "DATAFOLD_API_KEY")
341335
if not api_key:
342-
rich.print("[red]API key not found, add it as an environment variable called DATAFOLD_API_KEY.")
343-
344-
yes_or_no = Confirm.ask("Would you like to generate a new API key?")
345-
if yes_or_no:
346-
webbrowser.open(f"{datafold_host}/login?next={datafold_host}/users/me")
347-
rich.print('After generating, please, perform in the terminal "export DATAFOLD_API_KEY=<key>"')
348-
return None
349-
else:
350-
raise ValueError("Cannot initialize API because the API key is not provided")
351-
336+
raise DataDiffNoAPIKeyError(
337+
f"API key not found. Please follow the steps at {CLOUD_DOC_URL} to use the --cloud flag."
338+
)
352339
rich.print("Saving the API key to the system keyring service")
353340
try:
354341
keyring.set_password("data-diff", "DATAFOLD_API_KEY", api_key)

data_diff/errors.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,11 @@ class DataDiffDbtSelectVersionTooLowError(Exception):
4848

4949
class DataDiffCustomSchemaNoConfigError(Exception):
5050
"Raised when a model has a custom schema, but there is no prod_custom_schema config. (And not using --state)."
51+
52+
53+
class DataDiffNoAPIKeyError(Exception):
54+
"Raised when using --cloud but no API key is present in the DATAFOLD_API_KEY env var or keyring"
55+
56+
57+
class DataDiffNoDatasourceIdError(Exception):
58+
"Raised when using --cloud but no datasource_id was found in dbt_project.yml"

tests/test_dbt.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
DataDiffDbtRunResultsVersionError,
1717
DataDiffDbtSelectVersionTooLowError,
1818
DataDiffDbtSnowflakeSetConnectionError,
19+
DataDiffNoAPIKeyError,
20+
DataDiffNoDatasourceIdError,
1921
)
2022
from .test_cli import run_datadiff_cli
2123

@@ -771,7 +773,7 @@ def test_diff_is_cloud_no_ds_id(
771773
)
772774
mock_get_diff_vars.return_value = diff_vars
773775

774-
with self.assertRaises(ValueError):
776+
with self.assertRaises(DataDiffNoDatasourceIdError):
775777
dbt_diff(is_cloud=True)
776778
mock_dbt_parser_inst.get_models.assert_called_once()
777779
mock_dbt_parser_inst.set_connection.assert_not_called()
@@ -781,6 +783,33 @@ def test_diff_is_cloud_no_ds_id(
781783
mock_local_diff.assert_not_called()
782784
mock_print.assert_called_once()
783785

786+
@patch("data_diff.dbt.keyring.get_password")
787+
@patch("data_diff.dbt._get_diff_vars")
788+
@patch("data_diff.dbt._local_diff")
789+
@patch("data_diff.dbt._cloud_diff")
790+
@patch("data_diff.dbt_parser.DbtParser.__new__")
791+
@patch("builtins.input", return_value="n")
792+
def test_diff_is_cloud_no_api_key(
793+
self, _, mock_dbt_parser, mock_cloud_diff, mock_local_diff, mock_get_diff_vars, mock_get_password
794+
):
795+
mock_get_password.return_value = None
796+
mock_dbt_parser_inst = Mock()
797+
mock_model = Mock()
798+
config = TDatadiffConfig(prod_database="prod_db", prod_schema="prod_schema")
799+
800+
mock_dbt_parser.return_value = mock_dbt_parser_inst
801+
mock_dbt_parser_inst.get_models.return_value = [mock_model]
802+
mock_dbt_parser_inst.get_datadiff_config.return_value = config
803+
804+
with self.assertRaises(DataDiffNoAPIKeyError):
805+
dbt_diff(is_cloud=True)
806+
mock_dbt_parser_inst.get_models.assert_called_once()
807+
mock_dbt_parser_inst.set_connection.assert_not_called()
808+
809+
mock_get_diff_vars.assert_not_called()
810+
mock_cloud_diff.assert_not_called()
811+
mock_local_diff.assert_not_called()
812+
784813
@patch("data_diff.dbt._get_diff_vars")
785814
@patch("data_diff.dbt._local_diff")
786815
@patch("data_diff.dbt._cloud_diff")

0 commit comments

Comments
 (0)