From 31d341884f8aea2b13dc2060506ef98d1104fcb1 Mon Sep 17 00:00:00 2001 From: Jiri Merunka Date: Fri, 5 Dec 2025 11:46:51 +0100 Subject: [PATCH 1/3] feat: add case sensitivity option for generate_model_yaml model and column names --- README.md | 4 ++++ .../model_from_source_case_sensitive.sql | 4 ++++ ...est_generate_model_yaml_case_sensitive.sql | 24 +++++++++++++++++++ .../tests/test_helper_get_models.sql | 8 +++++-- macros/generate_model_yaml.sql | 20 ++++++++-------- 5 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 integration_tests/models/model_from_source_case_sensitive.sql create mode 100644 integration_tests/tests/test_generate_model_yaml_case_sensitive.sql diff --git a/README.md b/README.md index 438d248..4a71294 100644 --- a/README.md +++ b/README.md @@ -257,6 +257,10 @@ schema.yml file. - `model_names` (required): The model(s) you wish to generate YAML for. - `upstream_descriptions` (optional, default=False): Whether you want to include descriptions for identical column names from upstream models and sources. - `include_data_types` (optional, default=True): Whether you want to add data types to your model column definitions. +- `case_sensitive_models` (optional, default=False): Whether you want model names to be + in lowercase, or to match the case in the model — not compatible with Redshift +- `case_sensitive_cols` (optional, default=False): Whether you want column names to be + in lowercase, or to match the case in the model ### Usage: diff --git a/integration_tests/models/model_from_source_case_sensitive.sql b/integration_tests/models/model_from_source_case_sensitive.sql new file mode 100644 index 0000000..a44d37d --- /dev/null +++ b/integration_tests/models/model_from_source_case_sensitive.sql @@ -0,0 +1,4 @@ +select + * +from {{ source('codegen_integration_tests__data_source_schema', 'codegen_integration_tests__data_source_table_case_sensitive') }} + diff --git a/integration_tests/tests/test_generate_model_yaml_case_sensitive.sql b/integration_tests/tests/test_generate_model_yaml_case_sensitive.sql new file mode 100644 index 0000000..fd66852 --- /dev/null +++ b/integration_tests/tests/test_generate_model_yaml_case_sensitive.sql @@ -0,0 +1,24 @@ +{% set actual_model_yaml = codegen.generate_model_yaml( + model_names=['Model_from_source_case_sensitive'], + case_sensitive_models=True, + case_sensitive_cols=True, + include_data_types=False + ) +%} + +{% set expected_model_yaml %} +version: 2 + +models: + - name: Model_from_source_case_sensitive + description: "" + columns: + - name: My_Integer_Col + description: "" + + - name: My_Bool_Col + description: "" + +{% endset %} + +{{ assert_equal (actual_model_yaml | trim, expected_model_yaml | trim) }} diff --git a/integration_tests/tests/test_helper_get_models.sql b/integration_tests/tests/test_helper_get_models.sql index 1c0a32a..3604353 100644 --- a/integration_tests/tests/test_helper_get_models.sql +++ b/integration_tests/tests/test_helper_get_models.sql @@ -5,9 +5,13 @@ -- depends_on: {{ ref('model_without_any_ctes') }} {% if execute %} -{% set actual_list = codegen.get_models(prefix='model_')|sort %} +{% set uppercase_model_names = codegen.get_models(prefix='Model_') %} +{% set lowercase_model_names = codegen.get_models(prefix='model_') %} + +{% set all_models = uppercase_model_names + lowercase_model_names %} +{% set actual_list = all_models | sort %} {% endif %} -{% set expected_list = ['model_data_a', 'model_from_source', 'model_incremental', 'model_repeated', 'model_struct', 'model_without_any_ctes', 'model_without_import_ctes'] %} +{% set expected_list = ['model_data_a', 'model_from_source', 'Model_from_source_case_sensitive', 'model_incremental', 'model_repeated', 'model_struct', 'model_without_any_ctes', 'model_without_import_ctes'] %} {{ assert_equal (actual_list, expected_list) }} diff --git a/macros/generate_model_yaml.sql b/macros/generate_model_yaml.sql index d4fbbee..c538046 100644 --- a/macros/generate_model_yaml.sql +++ b/macros/generate_model_yaml.sql @@ -1,15 +1,15 @@ -{% macro generate_column_yaml(column, model_yaml, column_desc_dict, include_data_types, parent_column_name="") %} - {{ return(adapter.dispatch('generate_column_yaml', 'codegen')(column, model_yaml, column_desc_dict, include_data_types, parent_column_name)) }} +{% macro generate_column_yaml(column, model_yaml, column_desc_dict, include_data_types, case_sensitive_cols, parent_column_name="") %} + {{ return(adapter.dispatch('generate_column_yaml', 'codegen')(column, model_yaml, column_desc_dict, include_data_types, case_sensitive_cols, parent_column_name)) }} {% endmacro %} -{% macro default__generate_column_yaml(column, model_yaml, column_desc_dict, include_data_types, parent_column_name) %} +{% macro default__generate_column_yaml(column, model_yaml, column_desc_dict, include_data_types, case_sensitive_cols, parent_column_name="") %} {% if parent_column_name %} {% set column_name = parent_column_name ~ "." ~ column.name %} {% else %} {% set column_name = column.name %} {% endif %} - {% do model_yaml.append(' - name: ' ~ column_name | lower ) %} + {% do model_yaml.append(' - name: ' ~ (column_name if case_sensitive_cols else column_name | lower) ) %} {% if include_data_types %} {% do model_yaml.append(' data_type: ' ~ codegen.data_type_format_model(column)) %} {% endif %} @@ -18,17 +18,17 @@ {% if column.fields|length > 0 %} {% for child_column in column.fields %} - {% set model_yaml = codegen.generate_column_yaml(child_column, model_yaml, column_desc_dict, include_data_types, parent_column_name=column_name) %} + {% set model_yaml = codegen.generate_column_yaml(child_column, model_yaml, column_desc_dict, include_data_types, case_sensitive_cols, parent_column_name=column_name) %} {% endfor %} {% endif %} {% do return(model_yaml) %} {% endmacro %} -{% macro generate_model_yaml(model_names=[], upstream_descriptions=False, include_data_types=True) -%} - {{ return(adapter.dispatch('generate_model_yaml', 'codegen')(model_names, upstream_descriptions, include_data_types)) }} +{% macro generate_model_yaml(model_names=[], upstream_descriptions=False, include_data_types=True, case_sensitive_models=False,case_sensitive_cols=False) -%} + {{ return(adapter.dispatch('generate_model_yaml', 'codegen')(model_names, upstream_descriptions, include_data_types, case_sensitive_models, case_sensitive_cols)) }} {%- endmacro %} -{% macro default__generate_model_yaml(model_names, upstream_descriptions, include_data_types) %} +{% macro default__generate_model_yaml(model_names, upstream_descriptions, include_data_types, case_sensitive_models, case_sensitive_cols) %} {% set model_yaml=[] %} @@ -40,7 +40,7 @@ {{ exceptions.raise_compiler_error("The `model_names` argument must always be a list, even if there is only one model.") }} {% else %} {% for model in model_names %} - {% do model_yaml.append(' - name: ' ~ model | lower) %} + {% do model_yaml.append(' - name: ' ~ (model if case_sensitive_models else model | lower) ) %} {% do model_yaml.append(' description: ""') %} {% do model_yaml.append(' columns:') %} @@ -49,7 +49,7 @@ {% set column_desc_dict = codegen.build_dict_column_descriptions(model) if upstream_descriptions else {} %} {% for column in columns %} - {% set model_yaml = codegen.generate_column_yaml(column, model_yaml, column_desc_dict, include_data_types) %} + {% set model_yaml = codegen.generate_column_yaml(column, model_yaml, column_desc_dict, include_data_types, case_sensitive_cols=case_sensitive_cols) %} {% endfor %} {% endfor %} {% endif %} From e334544ea5c506ee531a517974c03b6e746b1e20 Mon Sep 17 00:00:00 2001 From: Jiri Merunka Date: Fri, 5 Dec 2025 12:16:59 +0100 Subject: [PATCH 2/3] feat: add SQL file for case-sensitive model testing --- ..._case_sensitive.sql => Model_from_source_case_sensitive.sql} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename integration_tests/models/{model_from_source_case_sensitive.sql => Model_from_source_case_sensitive.sql} (54%) diff --git a/integration_tests/models/model_from_source_case_sensitive.sql b/integration_tests/models/Model_from_source_case_sensitive.sql similarity index 54% rename from integration_tests/models/model_from_source_case_sensitive.sql rename to integration_tests/models/Model_from_source_case_sensitive.sql index a44d37d..931c159 100644 --- a/integration_tests/models/model_from_source_case_sensitive.sql +++ b/integration_tests/models/Model_from_source_case_sensitive.sql @@ -1,4 +1,4 @@ select * -from {{ source('codegen_integration_tests__data_source_schema', 'codegen_integration_tests__data_source_table_case_sensitive') }} +from {{ source('codegen_integration_tests__data_source_schema', 'codegen_integration_tests__data_source_table') }} From 23c4b25700948868d400347e9203a9e8708015ac Mon Sep 17 00:00:00 2001 From: Jiri Merunka Date: Fri, 5 Dec 2025 12:25:29 +0100 Subject: [PATCH 3/3] feat: add SQL file for case-sensitive model testing --- integration_tests/models/Model_from_source_case_sensitive.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration_tests/models/Model_from_source_case_sensitive.sql b/integration_tests/models/Model_from_source_case_sensitive.sql index 931c159..a44d37d 100644 --- a/integration_tests/models/Model_from_source_case_sensitive.sql +++ b/integration_tests/models/Model_from_source_case_sensitive.sql @@ -1,4 +1,4 @@ select * -from {{ source('codegen_integration_tests__data_source_schema', 'codegen_integration_tests__data_source_table') }} +from {{ source('codegen_integration_tests__data_source_schema', 'codegen_integration_tests__data_source_table_case_sensitive') }}