diff --git a/platformio/__init__.py b/platformio/__init__.py index 6d0d609a..ea0e7f69 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 3, "0a16") +VERSION = (3, 3, "0a17") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/builder/tools/piotest.py b/platformio/builder/tools/piotest.py index 573f562f..04035e9c 100644 --- a/platformio/builder/tools/piotest.py +++ b/platformio/builder/tools/piotest.py @@ -16,14 +16,15 @@ from __future__ import absolute_import from os.path import join, sep +from platformio.managers.core import get_core_package_dir + def ProcessTest(env): env.Append( CPPDEFINES=["UNIT_TEST", "UNITY_INCLUDE_CONFIG_H"], CPPPATH=[join("$BUILD_DIR", "UnityTestLib")]) unitylib = env.BuildLibrary( - join("$BUILD_DIR", "UnityTestLib"), - env.PioPlatform().get_package_dir("tool-unity")) + join("$BUILD_DIR", "UnityTestLib"), get_core_package_dir("tool-unity")) env.Prepend(LIBS=[unitylib]) src_filter = None diff --git a/platformio/commands/account.py b/platformio/commands/account.py index 1481b1be..6c48539a 100644 --- a/platformio/commands/account.py +++ b/platformio/commands/account.py @@ -18,7 +18,7 @@ import sys import click -from platformio.pioplus import pioplus_call +from platformio.managers.core import pioplus_call @click.group("account", short_help="Manage PIO Account") diff --git a/platformio/commands/remote.py b/platformio/commands/remote.py index b3d4cbed..1945bf87 100644 --- a/platformio/commands/remote.py +++ b/platformio/commands/remote.py @@ -23,7 +23,7 @@ import click from platformio import exception, util from platformio.commands.device import device_monitor as cmd_device_monitor -from platformio.pioplus import pioplus_call +from platformio.managers.core import pioplus_call # pylint: disable=unused-argument diff --git a/platformio/commands/test.py b/platformio/commands/test.py index d63374c4..34b30ec9 100644 --- a/platformio/commands/test.py +++ b/platformio/commands/test.py @@ -17,7 +17,7 @@ from os import getcwd import click -from platformio.pioplus import pioplus_call +from platformio.managers.core import pioplus_call @click.command("test", short_help="Local Unit Testing") diff --git a/platformio/commands/update.py b/platformio/commands/update.py index 5d6dedb6..95511e44 100644 --- a/platformio/commands/update.py +++ b/platformio/commands/update.py @@ -16,8 +16,8 @@ import click from platformio.commands.lib import lib_update as cmd_lib_update from platformio.commands.platform import platform_update as cmd_platform_update +from platformio.managers.core import update_core_packages from platformio.managers.lib import LibraryManager -from platformio.pioplus import pioplus_update @click.command( @@ -29,10 +29,12 @@ from platformio.pioplus import pioplus_update help="Do not update, only check for new version") @click.pass_context def cli(ctx, only_check): + update_core_packages(only_check) + + click.echo() click.echo("Platform Manager") click.echo("================") ctx.invoke(cmd_platform_update, only_check=only_check) - pioplus_update() click.echo() click.echo("Library Manager") diff --git a/platformio/maintenance.py b/platformio/maintenance.py index 9cca7e3a..9cd95719 100644 --- a/platformio/maintenance.py +++ b/platformio/maintenance.py @@ -29,9 +29,9 @@ from platformio.commands.platform import \ platform_uninstall as cmd_platform_uninstall from platformio.commands.platform import platform_update as cmd_platform_update from platformio.commands.upgrade import get_latest_version +from platformio.managers.core import update_core_packages from platformio.managers.lib import LibraryManager from platformio.managers.platform import PlatformFactory, PlatformManager -from platformio.pioplus import pioplus_update def in_silence(ctx=None): @@ -157,18 +157,17 @@ def after_upgrade(ctx): else: click.secho("Please wait while upgrading PlatformIO...", fg="yellow") app.clean_cache() + + # Update PlatformIO's Core packages + update_core_packages() + u = Upgrader(last_version, __version__) if u.run(ctx): app.set_state_item("last_version", __version__) - - # update PlatformIO Plus tool if it's installed - pioplus_update() - click.secho( "PlatformIO has been successfully upgraded to %s!\n" % __version__, fg="green") - telemetry.on_event( category="Auto", action="Upgrade", diff --git a/platformio/pioplus.py b/platformio/managers/core.py similarity index 61% rename from platformio/pioplus.py rename to platformio/managers/core.py index 932605be..fabe449e 100644 --- a/platformio/pioplus.py +++ b/platformio/managers/core.py @@ -20,21 +20,18 @@ from os.path import join from platformio import exception, util from platformio.managers.package import PackageManager -PACKAGE_DEPS = { - "pysite": { - "name": "pysite-pioplus", - "requirements": ">=0.3.0,<2" - }, - "tool": { - "name": "tool-pioplus", - "requirements": ">=0.6.10,<2" - } +CORE_PACKAGES = { + "project-templates": "*", + "pysite-pioplus": ">=0.3.0,<2", + "tool-pioplus": ">=0.6.10,<2", + "tool-unity": "~1.20302.1", + "tool-scons": "~3.20501.2" } -AUTO_UPDATES_MAX = 100 +PIOPLUS_AUTO_UPDATES_MAX = 100 -class PioPlusPackageManager(PackageManager): +class CorePackageManager(PackageManager): def __init__(self): PackageManager.__init__( @@ -46,30 +43,28 @@ class PioPlusPackageManager(PackageManager): ]) -def pioplus_install(): - pm = PioPlusPackageManager() - for item in PACKAGE_DEPS.values(): - if not pm.get_package(item['name'], item['requirements']): - pm.install(item['name'], item['requirements']) +def get_core_package_dir(name): + assert name in CORE_PACKAGES + requirements = CORE_PACKAGES[name] + pm = CorePackageManager() + pkg_dir = pm.get_package_dir(name, requirements) + if pkg_dir: + return pkg_dir + return pm.install(name, requirements) -def pioplus_update(): - pm = PioPlusPackageManager() - for item in PACKAGE_DEPS.values(): - pkg_dir = pm.get_package_dir(item['name']) - if pkg_dir and pm.outdated(pkg_dir, item['requirements']): - pm.update(item['name'], item['requirements']) +def update_core_packages(only_check=False): + pm = CorePackageManager() + for name, requirements in CORE_PACKAGES.items(): + pkg_dir = pm.get_package_dir(name) + if pkg_dir and pm.outdated(pkg_dir, requirements): + pm.update(name, requirements, only_check=only_check) def pioplus_call(args, **kwargs): - pioplus_install() - pm = PioPlusPackageManager() - pioplus_path = join( - pm.get_package_dir(PACKAGE_DEPS['tool']['name'], - PACKAGE_DEPS['tool']['requirements']), "pioplus") + pioplus_path = join(get_core_package_dir("tool-pioplus"), "pioplus") os.environ['PYTHONEXEPATH'] = util.get_pythonexe_path() - os.environ['PYTHONPYSITEDIR'] = pm.get_package_dir( - PACKAGE_DEPS['pysite']['name'], PACKAGE_DEPS['pysite']['requirements']) + os.environ['PYTHONPYSITEDIR'] = get_core_package_dir("pysite-pioplus") util.copy_pythonpath_to_osenv() code = subprocess.call([pioplus_path] + args, **kwargs) @@ -83,8 +78,8 @@ def pioplus_call(args, **kwargs): setattr(pioplus_call, count_attr, 1) count_value += 1 setattr(pioplus_call, count_attr, count_value) - if count_value < AUTO_UPDATES_MAX: - pioplus_update() + if count_value < PIOPLUS_AUTO_UPDATES_MAX: + update_core_packages() return pioplus_call(args, **kwargs) # handle reload request diff --git a/platformio/managers/package.py b/platformio/managers/package.py index 5f7b37d8..6cfdacb8 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -387,9 +387,10 @@ class PkgInstallerMixin(object): if not isdir(src_dir): os.makedirs(src_dir) src_manifest_path = join(src_dir, self.SRC_MANIFEST_NAME) - _data = data + _data = {} if isfile(src_manifest_path): - _data.update(util.load_json(src_manifest_path)) + _data = util.load_json(src_manifest_path) + _data.update(data) with open(src_manifest_path, "w") as fp: json.dump(_data, fp) diff --git a/platformio/managers/platform.py b/platformio/managers/platform.py index 0283fdd1..9c68d2bc 100644 --- a/platformio/managers/platform.py +++ b/platformio/managers/platform.py @@ -23,6 +23,7 @@ import click import semantic_version from platformio import __version__, app, exception, util +from platformio.managers.core import get_core_package_dir from platformio.managers.package import BasePkgManager, PackageManager @@ -161,12 +162,14 @@ class PlatformManager(BasePkgManager): def get_registered_boards(): return util.get_api_result("/boards", cache_valid="30d") - def board_config(self, id_): + def board_config(self, id_, platform=None): for manifest in self.get_installed_boards(): - if manifest['id'] == id_: + if manifest['id'] == id_ and (not platform or + manifest['platform'] == platform): return manifest for manifest in self.get_registered_boards(): - if manifest['id'] == id_: + if manifest['id'] == id_ and (not platform or + manifest['platform'] == platform): return manifest raise exception.UnknownBoard(id_) @@ -334,7 +337,7 @@ class PlatformRunMixin(object): def _run_scons(self, variables, targets): cmd = [ util.get_pythonexe_path(), - join(self.get_package_dir("tool-scons"), "script", "scons"), "-Q", + join(get_core_package_dir("tool-scons"), "script", "scons"), "-Q", "-j %d" % self.get_job_nums(), "--warn=no-no-parallel-support", "-f", join(util.get_source_dir(), "builder", "main.py") ] @@ -553,17 +556,6 @@ class PlatformBase( # pylint: disable=too-many-public-methods # skip all packages, allow only upload tools self.packages[_name]['optional'] = True - if "__test" in targets and "tool-unity" not in self.packages: - self.packages['tool-unity'] = { - "version": "~1.20302.1", - "optional": False - } - if "tool-scons" not in self.packages: - self.packages['tool-scons'] = { - "version": "~3.20501.2", - "optional": False - } - def get_lib_storages(self): storages = [] for opts in (self.frameworks or {}).values():