Skip to content

Commit

Permalink
Touch up init, fix missing adapter errors (#3483)
Browse files Browse the repository at this point in the history
* Some love to init

* Update changelog
  • Loading branch information
jtcohen6 authored Jun 24, 2021
1 parent c794600 commit 41610b8
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 18 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
### Under the hood
- Improve default view and table materialization performance by checking relational cache before attempting to drop temp relations ([#3112](https://github.com/fishtown-analytics/dbt/issues/3112), [#3468](https://github.com/fishtown-analytics/dbt/pull/3468))
- Add optional `sslcert`, `sslkey`, and `sslrootcert` profile arguments to the Postgres connector. ([#3472](https://github.com/fishtown-analytics/dbt/pull/3472), [#3473](https://github.com/fishtown-analytics/dbt/pull/3473))
- Move the example project used by `dbt init` into `dbt` repository, to avoid cloning an external repo ([#3005](https://github.com/fishtown-analytics/dbt/pull/3005), [#3474](https://github.com/fishtown-analytics/dbt/pull/3474))
- Better interaction between `dbt init` and adapters. Avoid raising errors while initializing a project ([#2814](https://github.com/fishtown-analytics/dbt/pull/2814), [#3483](https://github.com/fishtown-analytics/dbt/pull/3483))

Contributors:
- [@kostek-pl](https://github.com/kostek-pl) ([#3236](https://github.com/fishtown-analytics/dbt/pull/3408))
Expand Down
1 change: 0 additions & 1 deletion core/dbt/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,6 @@ def _build_init_subparser(subparsers, base_subparser):
)
sub.add_argument(
'--adapter',
default='redshift',
type=str,
help='''
Write sample profiles.yml for which adapter
Expand Down
43 changes: 26 additions & 17 deletions core/dbt/task/init.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

import dbt.config
import dbt.clients.system
from dbt.version import _get_adapter_plugin_names
from dbt.adapters.factory import load_plugin, get_include_paths
from dbt.exceptions import RuntimeException

from dbt.logger import GLOBAL_LOGGER as logger

Expand All @@ -13,14 +13,14 @@
from dbt.task.base import BaseTask

DOCS_URL = 'https://docs.getdbt.com/docs/configure-your-profile'
SLACK_URL = 'https://community.getdbt.com/'

# This file is not needed for the starter project but exists for finding the resource path
IGNORE_FILE = "__init__.py"

ON_COMPLETE_MESSAGE = """
Your new dbt project "{project_name}" was created! If this is your first time
using dbt, you'll need to set up your profiles.yml file (we've created a sample
file for you to connect to {sample_adapter}) -- this file will tell dbt how
using dbt, you'll need to set up your profiles.yml file -- this file will tell dbt how
to connect to your database. You can find this file by running:
{open_cmd} {profiles_path}
Expand All @@ -32,8 +32,11 @@
One more thing:
Need help? Don't hesitate to reach out to us via GitHub issues or on Slack --
There's a link to our Slack group in the GitHub Readme. Happy modeling!
Need help? Don't hesitate to reach out to us via GitHub issues or on Slack:
{slack_url}
Happy modeling!
"""


Expand All @@ -45,6 +48,8 @@ def copy_starter_repo(self, project_name):

def create_profiles_dir(self, profiles_dir):
if not os.path.exists(profiles_dir):
msg = "Creating dbt configuration folder at {}"
logger.info(msg.format(profiles_dir))
dbt.clients.system.make_directory(profiles_dir)
return True
return False
Expand All @@ -56,40 +61,44 @@ def create_profiles_file(self, profiles_file, sample_adapter):
sample_profiles_path = adapter_path / 'sample_profiles.yml'

if not sample_profiles_path.exists():
raise RuntimeException(f'No sample profile for {sample_adapter}')
logger.debug(f"No sample profile found for {sample_adapter}, skipping")
return False

if not os.path.exists(profiles_file):
msg = "With sample profiles.yml for {}"
logger.info(msg.format(sample_adapter))
shutil.copyfile(sample_profiles_path, profiles_file)
return True

return False

def get_addendum(self, project_name, profiles_path, sample_adapter):
def get_addendum(self, project_name, profiles_path):
open_cmd = dbt.clients.system.open_dir_cmd()

return ON_COMPLETE_MESSAGE.format(
open_cmd=open_cmd,
project_name=project_name,
sample_adapter=sample_adapter,
profiles_path=profiles_path,
docs_url=DOCS_URL
docs_url=DOCS_URL,
slack_url=SLACK_URL
)

def run(self):
project_dir = self.args.project_name
sample_adapter = self.args.adapter
if not sample_adapter:
try:
# pick first one available, often postgres
sample_adapter = next(_get_adapter_plugin_names())
except StopIteration:
logger.debug("No adapters installed, skipping")

profiles_dir = dbt.config.PROFILES_DIR
profiles_file = os.path.join(profiles_dir, 'profiles.yml')

msg = "Creating dbt configuration folder at {}"
logger.info(msg.format(profiles_dir))

msg = "With sample profiles.yml for {}"
logger.info(msg.format(sample_adapter))

self.create_profiles_dir(profiles_dir)
self.create_profiles_file(profiles_file, sample_adapter)
if sample_adapter:
self.create_profiles_file(profiles_file, sample_adapter)

if os.path.exists(project_dir):
raise RuntimeError("directory {} already exists!".format(
Expand All @@ -98,5 +107,5 @@ def run(self):

self.copy_starter_repo(project_dir)

addendum = self.get_addendum(project_dir, profiles_dir, sample_adapter)
addendum = self.get_addendum(project_dir, profiles_dir)
logger.info(addendum)

0 comments on commit 41610b8

Please sign in to comment.