96 lines
3.4 KiB
Python
96 lines
3.4 KiB
Python
|
import dbt.utils
|
||
|
import dbt.deprecations
|
||
|
import dbt.exceptions
|
||
|
|
||
|
from dbt.config import UnsetProfileConfig
|
||
|
from dbt.config.renderer import DbtProjectYamlRenderer
|
||
|
from dbt.context.target import generate_target_context
|
||
|
from dbt.deps.base import downloads_directory
|
||
|
from dbt.deps.resolver import resolve_packages
|
||
|
|
||
|
from dbt.logger import GLOBAL_LOGGER as logger
|
||
|
from dbt.clients import system
|
||
|
|
||
|
from dbt.task.base import BaseTask, move_to_nearest_project_dir
|
||
|
|
||
|
|
||
|
class DepsTask(BaseTask):
|
||
|
ConfigType = UnsetProfileConfig
|
||
|
|
||
|
def __init__(self, args, config: UnsetProfileConfig):
|
||
|
super().__init__(args=args, config=config)
|
||
|
|
||
|
def track_package_install(
|
||
|
self, package_name: str, source_type: str, version: str
|
||
|
) -> None:
|
||
|
# Hub packages do not need to be hashed, as they are public
|
||
|
# Use the string 'local' for local package versions
|
||
|
if source_type == 'local':
|
||
|
package_name = dbt.utils.md5(package_name)
|
||
|
version = 'local'
|
||
|
elif source_type != 'hub':
|
||
|
package_name = dbt.utils.md5(package_name)
|
||
|
version = dbt.utils.md5(version)
|
||
|
|
||
|
dbt.tracking.track_package_install(
|
||
|
self.config,
|
||
|
self.config.args,
|
||
|
{
|
||
|
"name": package_name,
|
||
|
"source": source_type,
|
||
|
"version": version
|
||
|
}
|
||
|
)
|
||
|
|
||
|
def run(self):
|
||
|
system.make_directory(self.config.modules_path)
|
||
|
packages = self.config.packages.packages
|
||
|
if not packages:
|
||
|
logger.info('Warning: No packages were found in packages.yml')
|
||
|
return
|
||
|
|
||
|
with downloads_directory():
|
||
|
final_deps = resolve_packages(packages, self.config)
|
||
|
|
||
|
renderer = DbtProjectYamlRenderer(generate_target_context(
|
||
|
self.config, self.config.cli_vars
|
||
|
))
|
||
|
|
||
|
packages_to_upgrade = []
|
||
|
for package in final_deps:
|
||
|
package_name = package.name
|
||
|
source_type = package.source_type()
|
||
|
version = package.get_version()
|
||
|
|
||
|
logger.info('Installing {}', package)
|
||
|
package.install(self.config, renderer)
|
||
|
logger.info(' Installed from {}',
|
||
|
package.nice_version_name())
|
||
|
if source_type == 'hub':
|
||
|
version_latest = package.get_version_latest()
|
||
|
if version_latest != version:
|
||
|
packages_to_upgrade.append(package_name)
|
||
|
logger.info(' Updated version available: {}',
|
||
|
version_latest)
|
||
|
else:
|
||
|
logger.info(' Up to date!')
|
||
|
if package.get_subdirectory():
|
||
|
logger.info(' and subdirectory {}',
|
||
|
package.get_subdirectory())
|
||
|
|
||
|
self.track_package_install(
|
||
|
package_name=package_name,
|
||
|
source_type=source_type,
|
||
|
version=version)
|
||
|
if packages_to_upgrade:
|
||
|
logger.info('\nUpdates available for packages: {} \
|
||
|
\nUpdate your versions in packages.yml, then run dbt deps',
|
||
|
packages_to_upgrade)
|
||
|
|
||
|
@classmethod
|
||
|
def from_args(cls, args):
|
||
|
# deps needs to move to the project directory, as it does put files
|
||
|
# into the modules directory
|
||
|
move_to_nearest_project_dir(args)
|
||
|
return super().from_args(args)
|