-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Use profile specified in --profile with dbt init #7450
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
9179070
2755820
f8d66f8
7e921ce
9a58a15
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| kind: Fixes | ||
| body: If --profile specified with dbt-init, create the project with the specified | ||
| profile | ||
| time: 2023-04-24T16:16:42.994547-04:00 | ||
| custom: | ||
| Author: ezraerb | ||
| Issue: CT-1418 | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,6 @@ | ||
| import click | ||
| import os | ||
| import yaml | ||
| import pytest | ||
| from pathlib import Path | ||
| from unittest import mock | ||
|
|
@@ -84,6 +85,12 @@ def test_init_task_in_project_with_existing_profiles_yml( | |
| """ | ||
| ) | ||
|
|
||
| def test_init_task_in_project_specifying_profile_errors(self): | ||
| # This triggers a call to sys.exit(), requring the following to test it | ||
| with pytest.raises(SystemExit) as error: | ||
ezraerb marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| run_dbt(["init", "--profile", "test"]) | ||
| assert error.value.code == 1 | ||
|
|
||
|
|
||
| class TestInitProjectWithoutExistingProfilesYml: | ||
| @mock.patch("dbt.task.init._get_adapter_plugin_names") | ||
|
|
@@ -159,6 +166,21 @@ def exists_side_effect(path): | |
| """ | ||
| ) | ||
|
|
||
| @mock.patch.object(Path, "exists", autospec=True) | ||
| def test_init_task_in_project_without_profile_yml_specifying_profile_errors(self, exists): | ||
| def exists_side_effect(path): | ||
| # Override responses on specific files, default to 'real world' if not overriden | ||
| return {"profiles.yml": False}.get(path.name, os.path.exists(path)) | ||
|
|
||
| exists.side_effect = exists_side_effect | ||
|
|
||
| # Even through no profiles.yml file exists, the init will not modify project.yml, | ||
| # so this errors | ||
| # This triggers a call to sys.exit(), requring the following to test it | ||
| with pytest.raises(SystemExit) as error: | ||
ezraerb marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| run_dbt(["init", "--profile", "test"]) | ||
| assert error.value.code == 1 | ||
|
|
||
|
|
||
| class TestInitProjectWithoutExistingProfilesYmlOrTemplate: | ||
| @mock.patch("dbt.task.init._get_adapter_plugin_names") | ||
|
|
@@ -684,3 +706,130 @@ def test_init_provided_project_name_and_skip_profile_setup( | |
| +materialized: view | ||
| """ | ||
| ) | ||
|
|
||
|
|
||
| class TestInitOutsideOfProjectWithSpecifiedProfile(TestInitOutsideOfProjectBase): | ||
| @mock.patch("dbt.task.init._get_adapter_plugin_names") | ||
| @mock.patch("click.prompt") | ||
| def test_init_task_outside_of_project_with_specified_profile( | ||
| self, mock_prompt, mock_get_adapter, project, project_name, unique_schema, dbt_profile_data | ||
| ): | ||
| manager = Mock() | ||
| manager.attach_mock(mock_prompt, "prompt") | ||
| manager.prompt.side_effect = [ | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Curious why Black didn't reformat this or the line below it to be the same. |
||
| project_name, | ||
| ] | ||
| mock_get_adapter.return_value = [project.adapter.type()] | ||
| run_dbt(["init", "--profile", "test"]) | ||
|
|
||
| manager.assert_has_calls( | ||
| [ | ||
| call.prompt("Enter a name for your project (letters, digits, underscore)"), | ||
| ] | ||
| ) | ||
|
|
||
| # profiles.yml is NOT overwritten, so assert that the text matches that of the | ||
| # original fixture | ||
| with open(os.path.join(project.profiles_dir, "profiles.yml"), "r") as f: | ||
| assert f.read() == yaml.safe_dump(dbt_profile_data) | ||
|
|
||
| with open(os.path.join(project.project_root, project_name, "dbt_project.yml"), "r") as f: | ||
| assert ( | ||
| f.read() | ||
| == f""" | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we make this a fixture in a constant at file top or in a
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Checking the other init tests shows that all of them use this pattern. Its probably worth getting more opinions before changing it. |
||
| # Name your project! Project names should contain only lowercase characters | ||
| # and underscores. A good package name should reflect your organization's | ||
| # name or the intended use of these models | ||
| name: '{project_name}' | ||
| version: '1.0.0' | ||
| config-version: 2 | ||
|
|
||
| # This setting configures which "profile" dbt uses for this project. | ||
| profile: 'test' | ||
|
|
||
| # These configurations specify where dbt should look for different types of files. | ||
| # The `model-paths` config, for example, states that models in this project can be | ||
| # found in the "models/" directory. You probably won't need to change these! | ||
| model-paths: ["models"] | ||
| analysis-paths: ["analyses"] | ||
| test-paths: ["tests"] | ||
| seed-paths: ["seeds"] | ||
| macro-paths: ["macros"] | ||
| snapshot-paths: ["snapshots"] | ||
|
|
||
| clean-targets: # directories to be removed by `dbt clean` | ||
| - "target" | ||
| - "dbt_packages" | ||
|
|
||
|
|
||
| # Configuring models | ||
| # Full documentation: https://docs.getdbt.com/docs/configuring-models | ||
|
|
||
| # In this example config, we tell dbt to build all models in the example/ | ||
| # directory as views. These settings can be overridden in the individual model | ||
| # files using the `{{{{ config(...) }}}}` macro. | ||
| models: | ||
| {project_name}: | ||
| # Config indicated by + and applies to all files under models/example/ | ||
| example: | ||
| +materialized: view | ||
| """ | ||
| ) | ||
|
|
||
|
|
||
| class TestInitOutsideOfProjectSpecifyingInvalidProfile(TestInitOutsideOfProjectBase): | ||
| @mock.patch("dbt.task.init._get_adapter_plugin_names") | ||
| @mock.patch("click.prompt") | ||
| def test_init_task_outside_project_specifying_invalid_profile_errors( | ||
| self, mock_prompt, mock_get_adapter, project, project_name | ||
| ): | ||
| manager = Mock() | ||
| manager.attach_mock(mock_prompt, "prompt") | ||
| manager.prompt.side_effect = [ | ||
| project_name, | ||
| ] | ||
| mock_get_adapter.return_value = [project.adapter.type()] | ||
|
|
||
| # This triggers a call to sys.exit(), requring the following to test it | ||
| with pytest.raises(SystemExit) as error: | ||
ezraerb marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| run_dbt(["init", "--profile", "invalid"]) | ||
| assert error.value.code == 1 | ||
|
|
||
| manager.assert_has_calls( | ||
| [ | ||
| call.prompt("Enter a name for your project (letters, digits, underscore)"), | ||
| ] | ||
| ) | ||
|
|
||
|
|
||
| class TestInitOutsideOfProjectSpecifyingProfileNoProfilesYml(TestInitOutsideOfProjectBase): | ||
| @mock.patch("dbt.task.init._get_adapter_plugin_names") | ||
| @mock.patch("click.prompt") | ||
| def test_init_task_outside_project_specifying_profile_no_profiles_yml_errors( | ||
| self, mock_prompt, mock_get_adapter, project, project_name | ||
| ): | ||
| manager = Mock() | ||
| manager.attach_mock(mock_prompt, "prompt") | ||
| manager.prompt.side_effect = [ | ||
| project_name, | ||
| ] | ||
| mock_get_adapter.return_value = [project.adapter.type()] | ||
|
|
||
| # Override responses on specific files, default to 'real world' if not overriden | ||
| original_isfile = os.path.isfile | ||
| with mock.patch( | ||
| "os.path.isfile", | ||
| new=lambda path: {"profiles.yml": False}.get( | ||
| os.path.basename(path), original_isfile(path) | ||
| ), | ||
| ): | ||
| # This triggers a call to sys.exit(), requring the following to test it | ||
| with pytest.raises(SystemExit) as error: | ||
ezraerb marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| run_dbt(["init", "--profile", "test"]) | ||
| assert error.value.code == 1 | ||
|
|
||
| manager.assert_has_calls( | ||
| [ | ||
| call.prompt("Enter a name for your project (letters, digits, underscore)"), | ||
| ] | ||
| ) | ||
Uh oh!
There was an error while loading. Please reload this page.