diff --git a/HISTORY.rst b/HISTORY.rst index d6803d0b..58613cf6 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -18,6 +18,7 @@ PlatformIO Core 5 * `pio pkg outdated `__ - check for project outdated packages * `pio pkg exec `_ - run command from package tool (`issue #4163 `_) + - Added support for dependencies declared in a "tool" type package - Dropped automatic updates of global libraries and development platforms (`issue #4179 `_) - Dropped support for "pythonPackages" field in "platform.json" manifest in favor of `Extra Python Dependencies `__ diff --git a/platformio/package/manager/_install.py b/platformio/package/manager/_install.py index d14338ae..dca2593f 100644 --- a/platformio/package/manager/_install.py +++ b/platformio/package/manager/_install.py @@ -20,8 +20,8 @@ import tempfile import click from platformio import app, compat, fs, util -from platformio.package.exception import PackageException -from platformio.package.meta import PackageItem +from platformio.package.exception import PackageException, UnknownPackageError +from platformio.package.meta import PackageItem, PackageSpec from platformio.package.unpack import FileUnpacker from platformio.package.vcsclient import VCSClientFactory @@ -115,7 +115,38 @@ class PackageManagerInstallMixin(object): return pkg def install_dependencies(self, pkg): - pass + assert isinstance(pkg, PackageItem) + manifest = self.load_manifest(pkg) + dependencies = manifest.get("dependencies") + if not dependencies: + return + self.log.info("Resolving dependencies...") + for dependency in dependencies: + if not self._install_dependency(dependency): + self.log.warning( + click.style( + "Warning! Could not install dependency %s for package '%s'" + % (dependency, pkg.metadata.name), + fg="yellow", + ) + ) + + def _install_dependency(self, dependency): + spec = PackageSpec( + owner=dependency.get("owner"), + name=dependency.get("name"), + requirements=dependency.get("version"), + ) + search_filters = { + key: value + for key, value in dependency.items() + if key in ("authors", "platforms", "frameworks") + } + try: + return self._install(spec, search_filters=search_filters or None) + except UnknownPackageError: + pass + return None def install_from_url(self, url, spec, checksum=None): spec = self.ensure_spec(spec) diff --git a/platformio/package/manager/_uninstall.py b/platformio/package/manager/_uninstall.py index ff330c64..2fe71753 100644 --- a/platformio/package/manager/_uninstall.py +++ b/platformio/package/manager/_uninstall.py @@ -19,7 +19,7 @@ import click from platformio import fs from platformio.package.exception import UnknownPackageError -from platformio.package.meta import PackageSpec +from platformio.package.meta import PackageItem, PackageSpec class PackageManagerUninstallMixin(object): @@ -75,4 +75,18 @@ class PackageManagerUninstallMixin(object): return pkg def uninstall_dependencies(self, pkg): - pass + assert isinstance(pkg, PackageItem) + manifest = self.load_manifest(pkg) + if not manifest.get("dependencies"): + return + self.log.info(click.style("Removing dependencies...", fg="yellow")) + for dependency in manifest.get("dependencies"): + spec = PackageSpec( + owner=dependency.get("owner"), + name=dependency.get("name"), + requirements=dependency.get("version"), + ) + pkg = self.get_package(spec) + if not pkg: + continue + self._uninstall(pkg) diff --git a/platformio/package/manager/library.py b/platformio/package/manager/library.py index f1e8f553..9a428449 100644 --- a/platformio/package/manager/library.py +++ b/platformio/package/manager/library.py @@ -15,14 +15,12 @@ import json import os -import click - from platformio.package.exception import ( MissingPackageManifestError, UnknownPackageError, ) from platformio.package.manager.base import BasePackageManager -from platformio.package.meta import PackageItem, PackageSpec, PackageType +from platformio.package.meta import PackageSpec, PackageType from platformio.project.config import ProjectConfig @@ -107,53 +105,3 @@ class LibraryPackageManager(BasePackageManager): # pylint: disable=too-many-anc return True raise e - - def install_dependencies(self, pkg): - assert isinstance(pkg, PackageItem) - manifest = self.load_manifest(pkg) - if not manifest.get("dependencies"): - return - self.log.info("Installing dependencies...") - for dependency in manifest.get("dependencies"): - if not self._install_dependency(dependency): - self.log.warning( - click.style( - "Warning! Could not install dependency %s for package '%s'" - % (dependency, pkg.metadata.name), - fg="yellow", - ) - ) - - def _install_dependency(self, dependency): - spec = PackageSpec( - owner=dependency.get("owner"), - name=dependency.get("name"), - requirements=dependency.get("version"), - ) - search_filters = { - key: value - for key, value in dependency.items() - if key in ("authors", "platforms", "frameworks") - } - try: - return self._install(spec, search_filters=search_filters or None) - except UnknownPackageError: - pass - return None - - def uninstall_dependencies(self, pkg): - assert isinstance(pkg, PackageItem) - manifest = self.load_manifest(pkg) - if not manifest.get("dependencies"): - return - self.log.info(click.style("Removing dependencies...", fg="yellow")) - for dependency in manifest.get("dependencies"): - spec = PackageSpec( - owner=dependency.get("owner"), - name=dependency.get("name"), - requirements=dependency.get("version"), - ) - pkg = self.get_package(spec) - if not pkg: - continue - self._uninstall(pkg)