|
1 | 1 | import os
|
| 2 | +import re |
2 | 3 | import time
|
3 | 4 | import webbrowser
|
4 | 5 | from typing import List, Optional, Dict, Tuple, Union
|
5 | 6 | import keyring
|
6 | 7 | import pydantic
|
7 | 8 | import rich
|
8 |
| -from rich.prompt import Confirm |
| 9 | +from rich.prompt import Confirm, Prompt |
9 | 10 |
|
10 | 11 | from data_diff.errors import DataDiffCustomSchemaNoConfigError, DataDiffDbtProjectVarsNotFoundError
|
11 | 12 |
|
12 | 13 | from . import connect_to_table, diff_tables, Algorithm
|
13 | 14 | from .cloud import DatafoldAPI, TCloudApiDataDiff, TCloudApiOrgMeta, get_or_create_data_source
|
14 | 15 | from .dbt_parser import DbtParser, PROJECT_FILE, TDatadiffConfig
|
15 | 16 | from .tracking import (
|
| 17 | + bool_ask_for_email, |
| 18 | + create_email_signup_event_json, |
16 | 19 | set_entrypoint_name,
|
17 | 20 | set_dbt_user_id,
|
18 | 21 | set_dbt_version,
|
@@ -61,10 +64,8 @@ def dbt_diff(
|
61 | 64 | dbt_parser = DbtParser(profiles_dir_override, project_dir_override, state)
|
62 | 65 | models = dbt_parser.get_models(dbt_selection)
|
63 | 66 | config = dbt_parser.get_datadiff_config()
|
| 67 | + _initialize_events(dbt_parser.dbt_user_id, dbt_parser.dbt_version, dbt_parser.dbt_project_id) |
64 | 68 |
|
65 |
| - set_dbt_user_id(dbt_parser.dbt_user_id) |
66 |
| - set_dbt_version(dbt_parser.dbt_version) |
67 |
| - set_dbt_project_id(dbt_parser.dbt_project_id) |
68 | 69 |
|
69 | 70 | if not state and not (config.prod_database or config.prod_schema):
|
70 | 71 | doc_url = "https://docs.datafold.com/development_testing/open_source#configure-your-dbt-project"
|
@@ -414,3 +415,34 @@ def _cloud_diff(diff_vars: TDiffVars, datasource_id: int, api: DatafoldAPI, org_
|
414 | 415 |
|
415 | 416 | def _diff_output_base(dev_path: str, prod_path: str) -> str:
|
416 | 417 | return f"\n[green]{prod_path} <> {dev_path}[/] \n"
|
| 418 | + |
| 419 | + |
| 420 | +def _initialize_events(dbt_user_id: Optional[str], dbt_version: Optional[str], dbt_project_id: Optional[str]) -> None: |
| 421 | + set_dbt_user_id(dbt_user_id) |
| 422 | + set_dbt_version(dbt_version) |
| 423 | + set_dbt_project_id(dbt_project_id) |
| 424 | + _email_signup() |
| 425 | + |
| 426 | + |
| 427 | +def _email_signup() -> None: |
| 428 | + email_regex = r'^[\w\.\+-]+@[\w\.-]+\.\w+$' |
| 429 | + prompt = "\nWould you like to be notified when a new data-diff version is available?\n\nEnter email or leave blank to opt out (we'll only ask once).\n" |
| 430 | + |
| 431 | + if bool_ask_for_email(): |
| 432 | + while True: |
| 433 | + email_input = Prompt.ask( |
| 434 | + prompt=prompt, |
| 435 | + default="", |
| 436 | + show_default=False, |
| 437 | + ) |
| 438 | + email = email_input.strip() |
| 439 | + |
| 440 | + if email == "" or re.match(email_regex, email): |
| 441 | + break |
| 442 | + |
| 443 | + prompt = "" |
| 444 | + rich.print("[red]Invalid email. Please enter a valid email or leave it blank to opt out.[/]") |
| 445 | + |
| 446 | + if email: |
| 447 | + event_json = create_email_signup_event_json(email) |
| 448 | + run_as_daemon(send_event_json, event_json) |
0 commit comments