diff --git a/platformio/commands/boards.py b/platformio/commands/boards.py index 585ff84b..1a5c258d 100644 --- a/platformio/commands/boards.py +++ b/platformio/commands/boards.py @@ -92,6 +92,7 @@ def _get_boards(installed=False): boards = _new_boards return boards + def _ouput_boards_json(query, installed=False): result = [] for board in _get_boards(installed): diff --git a/platformio/commands/run.py b/platformio/commands/run.py index e32654ef..6e350a27 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -23,6 +23,8 @@ import click from platformio import app, exception, telemetry, util from platformio.commands.lib import lib_install as cmd_lib_install +from platformio.commands.platform import \ + platform_install as cmd_platform_install from platformio.libmanager import LibraryManager from platformio.managers.platform import PlatformFactory @@ -186,7 +188,6 @@ class EnvironmentProcessor(object): if "platform" not in self.options: raise exception.UndefinedEnvPlatform(self.name) - platform = self.options['platform'] build_vars = self._get_build_variables() build_targets = self._get_build_targets() @@ -196,7 +197,17 @@ class EnvironmentProcessor(object): if "lib_install" in self.options: _autoinstall_libs(self.cmd_ctx, self.options['lib_install']) - p = PlatformFactory.newPlatform(platform) + platform = self.options['platform'] + version = None + if "@" in platform: + platform, version = platform.rsplit("@", 1) + + try: + p = PlatformFactory.newPlatform(platform) + except exception.UnknownPlatform: + self.cmd_ctx.invoke(cmd_platform_install, platforms=[platform]) + p = PlatformFactory.newPlatform(platform) + return p.run(build_vars, build_targets, self.verbose_level) diff --git a/platformio/managers/platform.py b/platformio/managers/platform.py index 778896e4..d2bad516 100644 --- a/platformio/managers/platform.py +++ b/platformio/managers/platform.py @@ -125,6 +125,7 @@ class PlatformFactory(object): name, requirements) if _manifest: platform_dir = dirname(_manifest['_manifest_path']) + if not platform_dir: raise exception.UnknownPlatform( name if not requirements else "%s@%s" % (name, requirements)) diff --git a/tests/commands/test_boards.py b/tests/commands/test_boards.py index f137096c..1a2539fd 100644 --- a/tests/commands/test_boards.py +++ b/tests/commands/test_boards.py @@ -16,16 +16,16 @@ import json from platformio import util from platformio.commands.boards import cli as cmd_boards -from platformio.commands.platforms import \ - platforms_search as cmd_platforms_search +from platformio.commands.platform import \ + platform_search as cmd_platform_search def test_board_json_output(platformio_setup, clirunner, validate_cliresult): - result = clirunner.invoke(cmd_boards, ["cortex", "--json-output"]) + result = clirunner.invoke(cmd_boards, ["mbed", "--json-output"]) validate_cliresult(result) boards = json.loads(result.output) - assert isinstance(boards, dict) - assert "teensy30" in boards + assert isinstance(boards, list) + assert any(["mbed" in b['frameworks'] for b in boards]) def test_board_raw_output(platformio_setup, clirunner, validate_cliresult): @@ -36,16 +36,20 @@ def test_board_raw_output(platformio_setup, clirunner, validate_cliresult): def test_board_options(platformio_setup, clirunner, validate_cliresult): required_opts = set( - ["build", "platform", "upload", "name"]) + ["fcpu", "frameworks", "id", "mcu", "name", "platform"]) # fetch available platforms - result = clirunner.invoke(cmd_platforms_search, ["--json-output"]) + result = clirunner.invoke(cmd_platform_search, ["--json-output"]) validate_cliresult(result) search_result = json.loads(result.output) assert isinstance(search_result, list) assert len(search_result) - platforms = [item['type'] for item in search_result] + platforms = [item['name'] for item in search_result] - for _, opts in util.get_boards().iteritems(): - assert required_opts.issubset(set(opts)) - assert opts['platform'] in platforms + result = clirunner.invoke(cmd_boards, ["mbed", "--json-output"]) + validate_cliresult(result) + boards = json.loads(result.output) + + for board in boards: + assert required_opts.issubset(set(board)) + assert board['platform'] in platforms diff --git a/tests/commands/test_init.py b/tests/commands/test_init.py index 93b47053..3cea718a 100644 --- a/tests/commands/test_init.py +++ b/tests/commands/test_init.py @@ -12,10 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json from os import makedirs, getcwd from os.path import getsize, isdir, isfile, join from platformio.commands.init import cli +from platformio.commands.boards import cli as cmd_boards from platformio import util @@ -48,11 +50,14 @@ def test_init_special_board(platformio_setup, clirunner, validate_cliresult): validate_cliresult(result) validate_pioproject(getcwd()) - uno = util.get_boards("uno") + result = clirunner.invoke(cmd_boards, ["Arduino Uno", "--json-output"]) + validate_cliresult(result) + boards = json.loads(result.output) + config = util.get_project_config() expected_result = [ - ("platform", str(uno['platform'])), - ("framework", str(uno['frameworks'][0])), + ("platform", str(boards[0]['platform'])), + ("framework", str(boards[0]['frameworks'][0])), ("board", "uno") ] diff --git a/tests/commands/test_platforms.py b/tests/commands/test_platforms.py index 0d0251d1..db4d735e 100644 --- a/tests/commands/test_platforms.py +++ b/tests/commands/test_platforms.py @@ -14,14 +14,14 @@ import json -from platformio.commands.platforms import \ - platforms_list as cmd_platforms_list -from platformio.commands.platforms import \ - platforms_search as cmd_platforms_search +from platformio.commands.platform import \ + platform_list as cmd_platform_list +from platformio.commands.platform import \ + platform_search as cmd_platform_search def test_list_json_output(clirunner, validate_cliresult): - result = clirunner.invoke(cmd_platforms_list, ["--json-output"]) + result = clirunner.invoke(cmd_platform_list, ["--json-output"]) validate_cliresult(result) list_result = json.loads(result.output) assert isinstance(list_result, list) @@ -31,23 +31,23 @@ def test_list_json_output(clirunner, validate_cliresult): def test_list_raw_output(clirunner, validate_cliresult): - result = clirunner.invoke(cmd_platforms_list) + result = clirunner.invoke(cmd_platform_list) validate_cliresult(result) assert "teensy" in result.output def test_search_json_output(clirunner, validate_cliresult): - result = clirunner.invoke(cmd_platforms_search, + result = clirunner.invoke(cmd_platform_search, ["arduino", "--json-output"]) validate_cliresult(result) search_result = json.loads(result.output) assert isinstance(search_result, list) assert len(search_result) - platforms = [item['type'] for item in search_result] + platforms = [item['name'] for item in search_result] assert "atmelsam" in platforms def test_search_raw_output(clirunner, validate_cliresult): - result = clirunner.invoke(cmd_platforms_search, ["arduino"]) + result = clirunner.invoke(cmd_platform_search, ["arduino"]) validate_cliresult(result) assert "teensy" in result.output