Skip to content

Commit

Permalink
behavior flags take the default value when the project file is not lo…
Browse files Browse the repository at this point in the history
…aded
  • Loading branch information
mikealfare committed Oct 24, 2024
1 parent 0073e9b commit d4309ea
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 2 deletions.
5 changes: 3 additions & 2 deletions dbt/adapters/base/impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,8 +304,9 @@ def behavior(self, flags: List[BehaviorFlag]) -> None:
# we don't always get project flags, for example during `dbt debug`
self._behavior = Behavior(flags, self.config.flags)
except AttributeError:
# in that case, don't load any behavior to avoid unexpected defaults
self._behavior = Behavior([], {})
# in that case, load behavior flags with their default values to avoid compilation errors
# this mimics not loading a project file, or not specifying flags in a project file
self._behavior = Behavior(flags, {})

@property
def _behavior_flags(self) -> List[BehaviorFlag]:
Expand Down
Empty file.
File renamed without changes.
87 changes: 87 additions & 0 deletions tests/unit/behavior_flag_tests/test_empty_project.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
from types import SimpleNamespace
from typing import Any, Dict, List

from dbt_common.behavior_flags import BehaviorFlag
from dbt_common.exceptions import DbtBaseException
import pytest

from dbt.adapters.contracts.connection import AdapterRequiredConfig, QueryComment

from tests.unit.fixtures.credentials import CredentialsStub


@pytest.fixture
def flags() -> Dict[str, Any]:
return {
"unregistered_flag": True,
"default_false_user_false_flag": False,
"default_false_user_true_flag": True,
"default_true_user_false_flag": False,
"default_true_user_true_flag": True,
}


@pytest.fixture
def config(flags) -> AdapterRequiredConfig:
raw_config = {
"credentials": CredentialsStub("test_database", "test_schema"),
"profile_name": "test_profile",
"target_name": "test_target",
"threads": 4,
"project_name": "test_project",
"query_comment": QueryComment(),
"cli_vars": {},
"target_path": "path/to/nowhere",
"log_cache_events": False,
}
return SimpleNamespace(**raw_config)


@pytest.fixture
def behavior_flags() -> List[BehaviorFlag]:
return [
{
"name": "default_false_user_false_flag",
"default": False,
"docs_url": "https://docs.com",
},
{
"name": "default_false_user_true_flag",
"default": False,
"description": "This is a false flag.",
},
{
"name": "default_false_user_skip_flag",
"default": False,
"description": "This is a true flag.",
},
{
"name": "default_true_user_false_flag",
"default": True,
"description": "This is fake news.",
},
{
"name": "default_true_user_true_flag",
"default": True,
"docs_url": "https://moar.docs.com",
},
{
"name": "default_true_user_skip_flag",
"default": True,
"description": "This is a true flag.",
},
]


def test_register_behavior_flags(adapter):
# make sure that users cannot add arbitrary flags to this collection
with pytest.raises(DbtBaseException):
assert adapter.behavior.unregistered_flag

# check the values of the valid behavior flags
assert not adapter.behavior.default_false_user_false_flag
assert not adapter.behavior.default_false_user_true_flag
assert not adapter.behavior.default_false_user_skip_flag
assert adapter.behavior.default_true_user_false_flag
assert adapter.behavior.default_true_user_true_flag
assert adapter.behavior.default_true_user_skip_flag

0 comments on commit d4309ea

Please sign in to comment.