Repository: dbt-labs/dbt-core

Issue:
Support config aliases in dbt_project.yml file configs
### Describe the feature
Databases like BigQuery support config aliases (eg. `project --> database`). These configs are supported inline in model `config()` blocks, but are not yet supported in the `dbt_project.yml` file.

Let's add support to bring these two configs inline with each other!

```
# dbt_project.yml

models:
  project: my_project
```

^ this should configure all models to be built into the `my_project` project


Discussion:

Resolving patch:
diff --git a/core/dbt/context/context_config.py b/core/dbt/context/context_config.py
--- a/core/dbt/context/context_config.py
+++ b/core/dbt/context/context_config.py
@@ -131,8 +131,9 @@ def active_project_configs(
     def _update_from_config(
         self, result: T, partial: Dict[str, Any], validate: bool = False
     ) -> T:
+        translated = self.active_project.credentials.translate_aliases(partial)
         return result.update_from(
-            partial,
+            translated,
             self.active_project.credentials.type,
             validate=validate
         )


Test patch:
diff --git a/test/integration/040_override_database_test/models/view_2.sql b/test/integration/040_override_database_test/models/view_2.sql
--- a/test/integration/040_override_database_test/models/view_2.sql
+++ b/test/integration/040_override_database_test/models/view_2.sql
@@ -1,4 +1,6 @@
-{{
-    config(database=var('alternate_db'))
-}}
+{%- if target.type == 'bigquery' -%}
+  {{ config(project=var('alternate_db')) }}
+{%- else -%}
+  {{ config(database=var('alternate_db')) }}
+{%- endif -%}
 select * from {{ ref('seed') }}
diff --git a/test/integration/040_override_database_test/test_override_database.py b/test/integration/040_override_database_test/test_override_database.py
--- a/test/integration/040_override_database_test/test_override_database.py
+++ b/test/integration/040_override_database_test/test_override_database.py
@@ -99,14 +99,45 @@ def test_snowflake_database_override(self):
         self.run_database_override()
 
 
-class TestProjectModelOverride(BaseOverrideDatabase):
+class BaseTestProjectModelOverride(BaseOverrideDatabase):
+    # this is janky, but I really want to access self.default_database in
+    # project_config
+    @property
+    def default_database(self):
+        target = self._profile_config['test']['target']
+        profile = self._profile_config['test']['outputs'][target]
+        for key in ['database', 'project', 'dbname']:
+            if key in profile:
+                database = profile[key]
+                if self.adapter_type == 'snowflake':
+                    return database.upper()
+                return database
+        assert False, 'No profile database found!'
+
     def run_database_override(self):
+        self.run_dbt_notstrict(['seed'])
+        self.assertEqual(len(self.run_dbt_notstrict(['run'])), 4)
+        self.assertExpectedRelations()
+
+    def assertExpectedRelations(self):
         if self.adapter_type == 'snowflake':
             func = lambda x: x.upper()
         else:
             func = lambda x: x
 
-        self.use_default_project({
+        self.assertManyRelationsEqual([
+            (func('seed'), self.unique_schema(), self.default_database),
+            (func('view_2'), self.unique_schema(), self.alternative_database),
+            (func('view_1'), self.unique_schema(), self.alternative_database),
+            (func('view_3'), self.unique_schema(), self.default_database),
+            (func('view_4'), self.unique_schema(), self.alternative_database),
+        ])
+
+
+class TestProjectModelOverride(BaseTestProjectModelOverride):
+    @property
+    def project_config(self):
+        return {
             'config-version': 2,
             'vars': {
                 'alternate_db': self.alternative_database,
@@ -119,17 +150,17 @@ def run_database_override(self):
                     }
                 }
             },
-        })
-        self.run_dbt_notstrict(['seed'])
-
-        self.assertEqual(len(self.run_dbt_notstrict(['run'])), 4)
-        self.assertManyRelationsEqual([
-            (func('seed'), self.unique_schema(), self.default_database),
-            (func('view_2'), self.unique_schema(), self.alternative_database),
-            (func('view_1'), self.unique_schema(), self.alternative_database),
-            (func('view_3'), self.unique_schema(), self.default_database),
-            (func('view_4'), self.unique_schema(), self.alternative_database),
-        ])
+            'data-paths': ['data'],
+            'vars': {
+                'alternate_db': self.alternative_database,
+            },
+            'quoting': {
+                'database': True,
+            },
+            'seeds': {
+                'quote_columns': False,
+            }
+        }
 
     @use_profile('bigquery')
     def test_bigquery_database_override(self):
@@ -140,6 +171,39 @@ def test_snowflake_database_override(self):
         self.run_database_override()
 
 
+class TestProjectModelAliasOverride(BaseTestProjectModelOverride):
+    @property
+    def project_config(self):
+        return {
+            'config-version': 2,
+            'vars': {
+                'alternate_db': self.alternative_database,
+            },
+            'models': {
+                'project': self.alternative_database,
+                'test': {
+                    'subfolder': {
+                        'project': self.default_database,
+                    }
+                }
+            },
+            'data-paths': ['data'],
+            'vars': {
+                'alternate_db': self.alternative_database,
+            },
+            'quoting': {
+                'database': True,
+            },
+            'seeds': {
+                'quote_columns': False,
+            }
+        }
+
+    @use_profile('bigquery')
+    def test_bigquery_project_override(self):
+        self.run_database_override()
+
+
 class TestProjectSeedOverride(BaseOverrideDatabase):
     def run_database_override(self):
         if self.adapter_type == 'snowflake':
diff --git a/test/integration/base.py b/test/integration/base.py
--- a/test/integration/base.py
+++ b/test/integration/base.py
@@ -1024,6 +1024,8 @@ def assertManyRelationsEqual(self, relations, default_schema=None, default_datab
         first_columns = None
         for relation in specs:
             key = (relation.database, relation.schema, relation.identifier)
+            # get a good error here instead of a hard-to-diagnose KeyError
+            self.assertIn(key, column_specs, f'No columns found for {key}')
             columns = column_specs[key]
             if first_columns is None:
                 first_columns = columns