Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add DO_NOT_TRACK environment variable support #5000

Merged
merged 5 commits into from
Apr 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changes/unreleased/Features-20220406-080328.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
kind: Features
body: Support the DO_NOT_TRACK environment variable from the consoledonottrack.com initiative
time: 2022-04-06T08:03:28.877054+02:00
custom:
Author: agoblet
Issue: "3540"
PR: "5000"
83 changes: 60 additions & 23 deletions core/dbt/flags.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,16 @@
EVENT_BUFFER_SIZE = 100000
QUIET = None

_NON_BOOLEAN_FLAGS = [
"LOG_FORMAT",
"PRINTER_WIDTH",
"PROFILES_DIR",
"INDIRECT_SELECTION",
"EVENT_BUFFER_SIZE",
]

_NON_DBT_ENV_FLAGS = ["DO_NOT_TRACK"]

# Global CLI defaults. These flags are set from three places:
# CLI args, environment variables, and user_config (profiles.yml).
# Environment variables use the pattern 'DBT_{flag name}', like DBT_PROFILES_DIR
Expand Down Expand Up @@ -133,31 +143,22 @@ def set_from_args(args, user_config):
EVENT_BUFFER_SIZE = get_flag_value("EVENT_BUFFER_SIZE", args, user_config)
QUIET = get_flag_value("QUIET", args, user_config)

_set_overrides_from_env()

def get_flag_value(flag, args, user_config):
lc_flag = flag.lower()
flag_value = getattr(args, lc_flag, None)

def _set_overrides_from_env():
global SEND_ANONYMOUS_USAGE_STATS

flag_value = _get_flag_value_from_env("DO_NOT_TRACK")
if flag_value is None:
# Environment variables use pattern 'DBT_{flag name}'
env_flag = f"DBT_{flag}"
env_value = os.getenv(env_flag)
if env_value is not None and env_value != "":
env_value = env_value.lower()
# non Boolean values
if flag in [
"LOG_FORMAT",
"PRINTER_WIDTH",
"PROFILES_DIR",
"INDIRECT_SELECTION",
"EVENT_BUFFER_SIZE",
]:
flag_value = env_value
else:
flag_value = env_set_bool(env_value)
elif user_config is not None and getattr(user_config, lc_flag, None) is not None:
flag_value = getattr(user_config, lc_flag)
else:
flag_value = flag_defaults[flag]
return

SEND_ANONYMOUS_USAGE_STATS = not flag_value


def get_flag_value(flag, args, user_config):
flag_value = _load_flag_value(flag, args, user_config)

if flag in ["PRINTER_WIDTH", "EVENT_BUFFER_SIZE"]: # must be ints
flag_value = int(flag_value)
if flag == "PROFILES_DIR":
Expand All @@ -166,6 +167,42 @@ def get_flag_value(flag, args, user_config):
return flag_value


def _load_flag_value(flag, args, user_config):
lc_flag = flag.lower()
flag_value = getattr(args, lc_flag, None)
if flag_value is not None:
return flag_value

flag_value = _get_flag_value_from_env(flag)
if flag_value is not None:
return flag_value

if user_config is not None and getattr(user_config, lc_flag, None) is not None:
return getattr(user_config, lc_flag)

return flag_defaults[flag]


def _get_flag_value_from_env(flag):
# Environment variables use pattern 'DBT_{flag name}'
env_flag = _get_env_flag(flag)
env_value = os.getenv(env_flag)
if env_value is None or env_value == "":
return None

env_value = env_value.lower()
if flag in _NON_BOOLEAN_FLAGS:
flag_value = env_value
else:
flag_value = env_set_bool(env_value)

return flag_value


def _get_env_flag(flag):
return flag if flag in _NON_DBT_ENV_FLAGS else f"DBT_{flag}"


def get_flag_dict():
return {
"use_experimental_parser": USE_EXPERIMENTAL_PARSER,
Expand Down
2 changes: 1 addition & 1 deletion dev-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
black==22.1.0
black==22.3.0
bumpversion
flake8
flaky
Expand Down
4 changes: 4 additions & 0 deletions test/unit/test_flags.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,12 @@ def test__flags(self):
setattr(self.args, 'send_anonymous_usage_stats', True)
flags.set_from_args(self.args, self.user_config)
self.assertEqual(flags.SEND_ANONYMOUS_USAGE_STATS, True)
os.environ['DO_NOT_TRACK'] = '1'
flags.set_from_args(self.args, self.user_config)
self.assertEqual(flags.SEND_ANONYMOUS_USAGE_STATS, False)
# cleanup
os.environ.pop('DBT_SEND_ANONYMOUS_USAGE_STATS')
os.environ.pop('DO_NOT_TRACK')
delattr(self.args, 'send_anonymous_usage_stats')

# printer_width
Expand Down
13 changes: 13 additions & 0 deletions test/unit/test_tracking.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,16 @@ def test_disable_never_enabled(self):
assert dbt.tracking.active_user.id is None
assert isinstance(dbt.tracking.active_user.invocation_id, str)
assert isinstance(dbt.tracking.active_user.run_started_at, datetime.datetime)

def test_initialize_from_flags(self):
for send_aonymous_usage_stats in [True, False]:
with self.subTest(
send_aonymous_usage_stats=send_aonymous_usage_stats
):
dbt.tracking.flags.SEND_ANONYMOUS_USAGE_STATS = (
send_aonymous_usage_stats
)

dbt.tracking.initialize_from_flags()

assert dbt.tracking.active_user.do_not_track != send_aonymous_usage_stats