diff --git a/.changes/unreleased/Features-20230929-170945.yaml b/.changes/unreleased/Features-20230929-170945.yaml new file mode 100644 index 00000000000..92a2ce484d1 --- /dev/null +++ b/.changes/unreleased/Features-20230929-170945.yaml @@ -0,0 +1,6 @@ +kind: Features +body: Add meta attribute to SemanticModels config +time: 2023-09-29T17:09:45.0354-05:00 +custom: + Author: emmyoop + Issue: "8511" diff --git a/core/dbt/contracts/graph/model_config.py b/core/dbt/contracts/graph/model_config.py index b28091e68c1..f44fee5d50c 100644 --- a/core/dbt/contracts/graph/model_config.py +++ b/core/dbt/contracts/graph/model_config.py @@ -382,6 +382,10 @@ class SemanticModelConfig(BaseConfig): default=None, metadata=CompareBehavior.Exclude.meta(), ) + meta: Dict[str, Any] = field( + default_factory=dict, + metadata=MergeBehavior.Update.meta(), + ) @dataclass diff --git a/core/dbt/parser/schema_yaml_readers.py b/core/dbt/parser/schema_yaml_readers.py index dddad84c6db..167175b4dcd 100644 --- a/core/dbt/parser/schema_yaml_readers.py +++ b/core/dbt/parser/schema_yaml_readers.py @@ -549,6 +549,7 @@ def _generate_semantic_model_config( base=False, patch_config_dict=precedence_configs, ) + return config def parse_semantic_model(self, unparsed: UnparsedSemanticModel): diff --git a/schemas/dbt/manifest/v11.json b/schemas/dbt/manifest/v11.json index 431641576eb..aafbab125d3 100644 --- a/schemas/dbt/manifest/v11.json +++ b/schemas/dbt/manifest/v11.json @@ -5497,6 +5497,12 @@ } ], "default": null + }, + "meta": { + "type": "object", + "propertyNames": { + "type": "string" + } } }, "additionalProperties": true diff --git a/tests/functional/semantic_models/fixtures.py b/tests/functional/semantic_models/fixtures.py index 3fb65a3a4fb..be5d88a7809 100644 --- a/tests/functional/semantic_models/fixtures.py +++ b/tests/functional/semantic_models/fixtures.py @@ -134,6 +134,9 @@ config: enabled: true group: some_group + meta: + my_meta: 'testing' + my_other_meta: 'testing more' dimensions: - name: favorite_color type: categorical @@ -185,6 +188,7 @@ agg_time_dimension: created_at """ + schema_yml = """models: - name: fct_revenue description: This is the model fct_revenue. It should be able to use doc blocks diff --git a/tests/functional/semantic_models/test_semantic_model_configs.py b/tests/functional/semantic_models/test_semantic_model_configs.py index 38009cddbe0..bd74ad95edd 100644 --- a/tests/functional/semantic_models/test_semantic_model_configs.py +++ b/tests/functional/semantic_models/test_semantic_model_configs.py @@ -204,3 +204,25 @@ def test_project_plus_yaml_level(self, project): ).config assert isinstance(config_test_table, SemanticModelConfig) + + +# test setting meta attributes in semantic model config +class TestMetaConfig: + @pytest.fixture(scope="class") + def models(self): + return { + "people.sql": models_people_sql, + "metricflow_time_spine.sql": metricflow_time_spine_sql, + "semantic_models.yml": enabled_semantic_model_people_yml, + "people_metrics.yml": models_people_metrics_yml, + "groups.yml": groups_yml, + } + + def test_meta_config(self, project): + run_dbt(["parse"]) + manifest = get_manifest(project.project_root) + sm_id = "semantic_model.test.semantic_people" + assert sm_id in manifest.semantic_models + sm_node = manifest.semantic_models[sm_id] + meta_expected = {"my_meta": "testing", "my_other_meta": "testing more"} + assert sm_node.config.meta == meta_expected