forked from dbt-labs/dbt-redshift
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
allow for bool/str input to backup/autorefresh when configuring mater…
…ialized views (dbt-labs#604) * allow for bool/str input to backup/autorefresh when configuring materialized views * add assert to backup test * add changie
- Loading branch information
1 parent
2209ff7
commit 2c8efc9
Showing
5 changed files
with
126 additions
and
18 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
kind: Under the Hood | ||
body: allow for bool/str input to backup/autorefresh when configuring materialized | ||
views | ||
time: 2023-09-14T13:55:47.951848-07:00 | ||
custom: | ||
Author: colin-rogers-dbt |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
from typing import Union | ||
|
||
|
||
def evaluate_bool_str(value: str) -> bool: | ||
value = value.strip().lower() | ||
if value == "true": | ||
return True | ||
elif value == "false": | ||
return False | ||
else: | ||
raise ValueError(f"Invalid boolean string value: {value}") | ||
|
||
|
||
def evaluate_bool(value: Union[str, bool]) -> bool: | ||
if not value: | ||
return False | ||
if isinstance(value, bool): | ||
return value | ||
elif isinstance(value, str): | ||
return evaluate_bool_str(value) | ||
else: | ||
raise TypeError( | ||
f"Invalid type for boolean evaluation, " | ||
f"expecting boolean or str, recieved: {type(value)}" | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
from unittest.mock import Mock | ||
|
||
import pytest | ||
|
||
from dbt.adapters.redshift.relation_configs import RedshiftMaterializedViewConfig | ||
|
||
|
||
@pytest.mark.parametrize("bool_value", [True, False, "True", "False", "true", "false"]) | ||
def test_redshift_materialized_view_config_handles_all_valid_bools(bool_value): | ||
config = RedshiftMaterializedViewConfig( | ||
database_name="somedb", | ||
schema_name="public", | ||
mv_name="someview", | ||
query="select * from sometable", | ||
) | ||
model_node = Mock() | ||
model_node.config.extra.get = ( | ||
lambda x, y=None: bool_value if x in ["auto_refresh", "backup"] else "someDistValue" | ||
) | ||
config_dict = config.parse_model_node(model_node) | ||
assert isinstance(config_dict["autorefresh"], bool) | ||
assert isinstance(config_dict["backup"], bool) | ||
|
||
|
||
@pytest.mark.parametrize("bool_value", [1]) | ||
def test_redshift_materialized_view_config_throws_expected_exception_with_invalid_types( | ||
bool_value, | ||
): | ||
config = RedshiftMaterializedViewConfig( | ||
database_name="somedb", | ||
schema_name="public", | ||
mv_name="someview", | ||
query="select * from sometable", | ||
) | ||
model_node = Mock() | ||
model_node.config.extra.get = ( | ||
lambda x, y=None: bool_value if x in ["auto_refresh", "backup"] else "someDistValue" | ||
) | ||
with pytest.raises(TypeError): | ||
config.parse_model_node(model_node) | ||
|
||
|
||
def test_redshift_materialized_view_config_throws_expected_exception_with_invalid_str(): | ||
config = RedshiftMaterializedViewConfig( | ||
database_name="somedb", | ||
schema_name="public", | ||
mv_name="someview", | ||
query="select * from sometable", | ||
) | ||
model_node = Mock() | ||
model_node.config.extra.get = ( | ||
lambda x, y=None: "notABool" if x in ["auto_refresh", "backup"] else "someDistValue" | ||
) | ||
with pytest.raises(ValueError): | ||
config.parse_model_node(model_node) |