Skip to content

Commit

Permalink
Add flyway variables support via placeholder templater (#4026)
Browse files Browse the repository at this point in the history
* adding new style for supporting flyway placeholder variables in sql

* add fixture for flyway style placeholder templating

* adding placeholder test for flyway_var style

* mandate flyway_var pattern be enclosed in curly brakcets always

* adding test__config__load_placeholder_cfg

Co-authored-by: Barry Hart <barrywhart@yahoo.com>
  • Loading branch information
srjonemed and barrywhart committed Nov 13, 2022
1 parent 29faf04 commit 4d2a83c
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/sqlfluff/core/config.py
Expand Up @@ -302,7 +302,7 @@ def _get_config_elems_from_file(cls, fpath: str) -> List[ConfigElemType]:
# Disable interpolation so we can load macros
kw: Dict = {}
kw["interpolation"] = None
config = configparser.ConfigParser(**kw)
config = configparser.ConfigParser(delimiters="=", **kw)
# NB: We want to be case sensitive in how we read from files,
# because jinja is also case sensitive. To do this we override
# the optionxform attribute.
Expand Down
2 changes: 2 additions & 0 deletions src/sqlfluff/core/templaters/placeholder.py
Expand Up @@ -35,6 +35,8 @@
"dollar": regex.compile(
r"(?<![:\w\x5c])\${?(?P<param_name>[\w_]+)}?", regex.UNICODE
),
# e.g. USE ${flyway:database}.schema_name;
"flyway_var": regex.compile(r"\${(?P<param_name>\w+[:\w_]+)}", regex.UNICODE),
# e.g. WHERE bla = ?
"question_mark": regex.compile(r"(?<![:\w\x5c])\?", regex.UNICODE),
# e.g. WHERE bla = $3 or WHERE bla = ${3}
Expand Down
22 changes: 22 additions & 0 deletions test/core/config_test.py
Expand Up @@ -137,6 +137,28 @@ def test__config__load_toml():
}


def test__config__load_placeholder_cfg():
"""Test loading a sqlfluff configuration file for placeholder templater."""
c = ConfigLoader()
cfg = c.load_config_file(
os.path.join("test", "fixtures", "config", "placeholder"),
".sqlfluff-placeholder",
)
assert cfg == {
"core": {
"testing_val": "foobar",
"testing_int": 4,
},
"bar": {"foo": "barbar"},
"templater": {
"placeholder": {
"param_style": "flyway_var",
"flyway:database": "test_db",
}
},
}


def test__config__iter_config_paths_right_order():
"""Test that config paths are fetched ordered by priority."""
c = ConfigLoader()
Expand Down
18 changes: 18 additions & 0 deletions test/core/templaters/placeholder_test.py
Expand Up @@ -289,6 +289,22 @@ def test__templater_raw():
start_date="'2021-10-01'",
),
),
(
"USE ${flyway:database}.test_schema;",
"flyway_var",
"USE test_db.test_schema;",
{
"flyway:database": "test_db",
},
),
(
"SELECT metadata$filename, $1 FROM @stg_data_export_${env_name};",
"flyway_var",
"SELECT metadata$filename, $1 FROM @stg_data_export_staging;",
{
"env_name": "staging",
},
),
],
ids=[
"no_changes",
Expand All @@ -306,6 +322,8 @@ def test__templater_raw():
"numeric_dollar_with_braces_and_string",
"percent",
"ampersand",
"flyway_var",
"flyway_var",
],
)
def test__templater_param_style(instr, expected_outstr, param_style, values):
Expand Down
10 changes: 10 additions & 0 deletions test/fixtures/config/placeholder/.sqlfluff-placeholder
@@ -0,0 +1,10 @@
[sqlfluff]
testing_val=foobar
testing_int=4

[sqlfluff:bar]
foo=barbar

[sqlfluff:templater:placeholder]
param_style = flyway_var
flyway:database = test_db
@@ -0,0 +1,5 @@
USE ${flyway:database}.test_schema;

CREATE OR REPLACE STAGE stg_data_export_${env_name}
URL = 's3://${s3_data_lake_bucket}/${env_name}/exports/stg_data_export'
STORAGE_INTEGRATION = s3_integ_main;

0 comments on commit 4d2a83c

Please sign in to comment.