From 67e6d177b443c189660f8d21efed05a3ceaacf80 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sun, 16 Aug 2020 18:48:05 +0300 Subject: [PATCH] Minor fixes for dev-platform factory --- platformio/builder/tools/pioplatform.py | 11 ++++++-- platformio/platform/factory.py | 36 ++++++++++++++++++------- 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/platformio/builder/tools/pioplatform.py b/platformio/builder/tools/pioplatform.py index 740f6148..5ca7794f 100644 --- a/platformio/builder/tools/pioplatform.py +++ b/platformio/builder/tools/pioplatform.py @@ -149,9 +149,16 @@ def PrintConfiguration(env): # pylint: disable=too-many-statements def _get_plaform_data(): data = [ "PLATFORM: %s (%s)" - % (platform.title, pkg_metadata.version or platform.version) + % ( + platform.title, + pkg_metadata.version if pkg_metadata else platform.version, + ) ] - if int(ARGUMENTS.get("PIOVERBOSE", 0)) and pkg_metadata.spec.external: + if ( + int(ARGUMENTS.get("PIOVERBOSE", 0)) + and pkg_metadata + and pkg_metadata.spec.external + ): data.append("(%s)" % pkg_metadata.spec.url) if board_config: data.extend([">", board_config.get("name")]) diff --git a/platformio/platform/factory.py b/platformio/platform/factory.py index e48142ce..0f2bd15f 100644 --- a/platformio/platform/factory.py +++ b/platformio/platform/factory.py @@ -15,6 +15,7 @@ import os import re +from platformio import fs from platformio.compat import load_python_module from platformio.package.meta import PackageItem from platformio.platform.base import PlatformBase @@ -36,32 +37,47 @@ class PlatformFactory(object): @classmethod def new(cls, pkg_or_spec): + platform_dir = None + platform_name = None if isinstance(pkg_or_spec, PackageItem): - pkg = pkg_or_spec + platform_dir = pkg_or_spec.path + platform_name = pkg_or_spec.metadata.name + elif os.path.isdir(pkg_or_spec): + platform_dir = pkg_or_spec else: from platformio.package.manager.platform import ( # pylint: disable=import-outside-toplevel PlatformPackageManager, ) - pkg = PlatformPackageManager().get_package( - "file://%s" % pkg_or_spec if os.path.isdir(pkg_or_spec) else pkg_or_spec - ) - if not pkg: + pkg = PlatformPackageManager().get_package(pkg_or_spec) + if not pkg: + raise UnknownPlatform(pkg_or_spec) + platform_dir = pkg.path + platform_name = pkg.metadata.name + + if not platform_dir or not os.path.isfile( + os.path.join(platform_dir, "platform.json") + ): raise UnknownPlatform(pkg_or_spec) + if not platform_name: + platform_name = fs.load_json(os.path.join(platform_dir, "platform.json"))[ + "name" + ] + platform_cls = None - if os.path.isfile(os.path.join(pkg.path, "platform.py")): + if os.path.isfile(os.path.join(platform_dir, "platform.py")): platform_cls = getattr( cls.load_module( - pkg.metadata.name, os.path.join(pkg.path, "platform.py") + platform_name, os.path.join(platform_dir, "platform.py") ), - cls.get_clsname(pkg.metadata.name), + cls.get_clsname(platform_name), ) else: platform_cls = type( - str(cls.get_clsname(pkg.metadata.name)), (PlatformBase,), {} + str(cls.get_clsname(platform_name)), (PlatformBase,), {} ) - _instance = platform_cls(os.path.join(pkg.path, "platform.json")) + _instance = platform_cls(os.path.join(platform_dir, "platform.json")) assert isinstance(_instance, PlatformBase) return _instance