From 3ad4ff02e84a39c2f01906ba144d821fd0c90d05 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 28 Dec 2017 18:57:17 +0200 Subject: [PATCH 01/49] Typo fix --- HISTORY.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index 666336b3..4b9a0ca4 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -28,7 +28,7 @@ PlatformIO 3.0 * New `include `__ folder for project's header files (`issue #1107 `_) -* Depend on development platform using VSC URL (Git, Mercurial and Subversion) +* Depend on development platform using VCS URL (Git, Mercurial and Subversion) instead of a name in `Project Configuration File "platformio.ini" `__. Drop support for ``*_stage`` dev/platform names (use VCS URL instead). * Reinstall/redownload package with a new ``-f, --force`` option for From b3078552079e745e2042c05c703c0767ddf816be Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 28 Dec 2017 20:35:24 +0200 Subject: [PATCH 02/49] Fix typo in docs --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index c76ccaf3..880feae4 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit c76ccaf33786e93392c80decdb457794ac234380 +Subproject commit 880feae411f4ab897fec587ca3be250a3ca75a84 From 86cb2efd64bf20de0b52ff43a89227a9a5f8b69f Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 28 Dec 2017 20:36:57 +0200 Subject: [PATCH 03/49] Sync docs --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 880feae4..1d76f644 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 880feae411f4ab897fec587ca3be250a3ca75a84 +Subproject commit 1d76f644a004b9db6a025ec17b637233e46db575 From d58c39293008eefd29eb78a0daaedf6814086b69 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 28 Dec 2017 20:38:08 +0200 Subject: [PATCH 04/49] Typo fix in docs --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 1d76f644..a8665ce5 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 1d76f644a004b9db6a025ec17b637233e46db575 +Subproject commit a8665ce53b7b37c85c9f92047cb76e555eddc7ba From 7354515845d1d30a7514837800c674cfcc54fbf3 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 29 Dec 2017 20:50:17 +0200 Subject: [PATCH 05/49] Fix project generator for CLion IDE --- HISTORY.rst | 5 +++++ docs | 2 +- platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 4b9a0ca4..eaa6768d 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,6 +4,11 @@ Release Notes PlatformIO 3.0 -------------- +3.5.1 (2018-??-??) +~~~~~~~~~~~~~~~~~~ + +* Fixed project generator for CLion IDE + 3.5.0 (2017-12-28) ~~~~~~~~~~~~~~~~~~ diff --git a/docs b/docs index a8665ce5..9ba6ef3f 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit a8665ce53b7b37c85c9f92047cb76e555eddc7ba +Subproject commit 9ba6ef3fad7585002a628fc81b1f970f3d4b98e3 diff --git a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl index ca27ad43..225a3b67 100644 --- a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl +++ b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl @@ -8,7 +8,9 @@ SET(CMAKE_C_FLAGS_DISTRIBUTION "{{cc_flags}}") set(CMAKE_CXX_STANDARD 11) % for define in defines: -add_definitions(-D{{!define}}) +% if "##" not in define: +add_definitions("-D{{!define.replace("(", "\(").replace(")", "\)").replace('"', '\\"')}}") +% end % end % for include in includes: From 2758e99295e103ac3cfcc14d07199ad86e80bd59 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 29 Dec 2017 20:51:20 +0200 Subject: [PATCH 06/49] Bump version to 3.5.1a1 --- platformio/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index 33de06c8..9f9b1ce4 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 5, 0) +VERSION = (3, 5, "1a1") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" From 82246a837ef96af3308e5c2ebc14bc2923a9b8bb Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sun, 31 Dec 2017 00:07:12 +0200 Subject: [PATCH 07/49] Change wording --- platformio/builder/tools/piolib.py | 2 +- platformio/managers/package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index 8973bdfb..ecf47a25 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -815,7 +815,7 @@ def BuildProjectLibraries(env): print_deps_tree(lb, level + 1) print "Collected %d compatible libraries" % len(lib_builders) - print "Looking for dependencies..." + print "Scanning dependencies..." project = ProjectAsLibBuilder(env, "$PROJECT_DIR") project.env = env diff --git a/platformio/managers/package.py b/platformio/managers/package.py index cc3e444c..4d935e76 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -361,7 +361,7 @@ class PkgInstallerMixin(object): break except Exception as e: # pylint: disable=broad-except click.secho("Warning! Package Mirror: %s" % e, fg="yellow") - click.secho("Looking for other mirror...", fg="yellow") + click.secho("Looking for another mirror...", fg="yellow") if versions is None: raise exception.UnknownPackage(name) From 5e666492c36480d3967604c9ceea0afc94479e25 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 3 Jan 2018 15:47:02 +0200 Subject: [PATCH 08/49] Rename `envs_dir` option to `build_dir` in platformio.ini --- HISTORY.rst | 2 ++ docs | 2 +- examples | 2 +- platformio/builder/main.py | 6 +++--- platformio/commands/run.py | 30 +++++++++++++------------- platformio/util.py | 10 ++++++--- tests/test_examples.py | 43 +++++++++++++++++++------------------- 7 files changed, 51 insertions(+), 44 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index eaa6768d..e015f4f2 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,8 @@ PlatformIO 3.0 3.5.1 (2018-??-??) ~~~~~~~~~~~~~~~~~~ +* Renamed ``envs_dir`` option to ``build_dir`` + in `Project Configuration File "platformio.ini" `__ * Fixed project generator for CLion IDE 3.5.0 (2017-12-28) diff --git a/docs b/docs index 9ba6ef3f..3c76b2d2 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 9ba6ef3fad7585002a628fc81b1f970f3d4b98e3 +Subproject commit 3c76b2d28905bf778daa192fa2d07235ab6b4a12 diff --git a/examples b/examples index 2d716306..817a51b7 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit 2d716306f33cbaa3d9146e417d02e15747cadb2a +Subproject commit 817a51b7192c2c8a4d9df882659ca2fd09ac9cd6 diff --git a/platformio/builder/main.py b/platformio/builder/main.py index 6e073cce..c729e4af 100644 --- a/platformio/builder/main.py +++ b/platformio/builder/main.py @@ -91,8 +91,8 @@ DEFAULT_ENV_OPTIONS = dict( PROJECTSRC_DIR=util.get_projectsrc_dir(), PROJECTTEST_DIR=util.get_projecttest_dir(), PROJECTDATA_DIR=util.get_projectdata_dir(), - PROJECTPIOENVS_DIR=util.get_projectpioenvs_dir(), - BUILD_DIR=join("$PROJECTPIOENVS_DIR", "$PIOENV"), + PROJECTBUILD_DIR=util.get_projectbuild_dir(), + BUILD_DIR=join("$PROJECTBUILD_DIR", "$PIOENV"), BUILDSRC_DIR=join("$BUILD_DIR", "src"), BUILDTEST_DIR=join("$BUILD_DIR", "test"), LIBSOURCE_DIRS=[ @@ -150,7 +150,7 @@ env['LIBSOURCE_DIRS'] = [ env.LoadPioPlatform(commonvars) env.SConscriptChdir(0) -env.SConsignFile(join("$PROJECTPIOENVS_DIR", ".sconsign.dblite")) +env.SConsignFile(join("$PROJECTBUILD_DIR", ".sconsign.dblite")) for item in env.GetPreExtraScripts(): env.SConscript(item, exports="env") diff --git a/platformio/commands/run.py b/platformio/commands/run.py index 59654de5..7c045ade 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -60,15 +60,15 @@ def cli(ctx, environment, target, upload_port, project_dir, silent, verbose, raise exception.NotPlatformIOProject(project_dir) with util.cd(project_dir): - # clean obsolete .pioenvs dir + # clean obsolete build dir if not disable_auto_clean: try: - _clean_pioenvs_dir(util.get_projectpioenvs_dir()) + _clean_build_dir(util.get_projectbuild_dir()) except: # pylint: disable=bare-except click.secho( "Can not remove temporary directory `%s`. Please remove " - "`.pioenvs` directory from the project manually to avoid " - "build issues" % util.get_projectpioenvs_dir(force=True), + "it manually to avoid build issues" % + util.get_projectbuild_dir(force=True), fg="yellow") config = util.load_project_config() @@ -318,25 +318,25 @@ def _is_builtin_lib(lib_name): return False -def _clean_pioenvs_dir(pioenvs_dir): - structhash_file = join(pioenvs_dir, "structure.hash") +def _clean_build_dir(build_dir): + structhash_file = join(build_dir, "structure.hash") proj_hash = calculate_project_hash() # if project's config is modified - if (isdir(pioenvs_dir) + if (isdir(build_dir) and getmtime(join(util.get_project_dir(), - "platformio.ini")) > getmtime(pioenvs_dir)): - util.rmtree_(pioenvs_dir) + "platformio.ini")) > getmtime(build_dir)): + util.rmtree_(build_dir) # check project structure - if isdir(pioenvs_dir) and isfile(structhash_file): + if isdir(build_dir) and isfile(structhash_file): with open(structhash_file) as f: if f.read() == proj_hash: return - util.rmtree_(pioenvs_dir) + util.rmtree_(build_dir) - if not isdir(pioenvs_dir): - makedirs(pioenvs_dir) + if not isdir(build_dir): + makedirs(build_dir) with open(structhash_file, "w") as f: f.write(proj_hash) @@ -384,13 +384,13 @@ def check_project_defopts(config): if not config.has_section("platformio"): return True known = ("env_default", "home_dir", "lib_dir", "libdeps_dir", "src_dir", - "envs_dir", "data_dir", "test_dir", "boards_dir", + "build_dir", "data_dir", "test_dir", "boards_dir", "lib_extra_dirs") unknown = set([k for k, _ in config.items("platformio")]) - set(known) if not unknown: return True click.secho( - "Warning! Ignore unknown `%s` option from `[platformio]` section" % + "Warning! Ignore unknown `%s` option in `[platformio]` section" % ", ".join(unknown), fg="yellow") return False diff --git a/platformio/util.py b/platformio/util.py index a040380f..183f2110 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -311,8 +311,8 @@ def get_projectboards_dir(): join(get_project_dir(), "boards")) -def get_projectpioenvs_dir(force=False): - path = get_project_optional_dir("envs_dir", +def get_projectbuild_dir(force=False): + path = get_project_optional_dir("build_dir", join(get_project_dir(), ".pioenvs")) try: if not isdir(path): @@ -322,7 +322,7 @@ def get_projectpioenvs_dir(force=False): with open(dontmod_path, "w") as fp: fp.write(""" [InternetShortcut] -URL=http://docs.platformio.org/page/projectconf.html#envs-dir +URL=http://docs.platformio.org/page/projectconf.html#build-dir """) except Exception as e: # pylint: disable=broad-except if not force: @@ -330,6 +330,10 @@ URL=http://docs.platformio.org/page/projectconf.html#envs-dir return path +# compatibility with PIO Core+ +get_projectpioenvs_dir = get_projectbuild_dir + + def get_projectdata_dir(): return get_project_optional_dir("data_dir", join(get_project_dir(), "data")) diff --git a/tests/test_examples.py b/tests/test_examples.py index 86bc7741..4d2a1a52 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -36,26 +36,27 @@ def pytest_generate_tests(metafunc): @pytest.mark.examples def test_run(pioproject_dir): - if isdir(join(pioproject_dir, ".pioenvs")): - util.rmtree_(join(pioproject_dir, ".pioenvs")) + with util.cd(pioproject_dir): + build_dir = util.get_projectbuild_dir() + if isdir(build_dir): + util.rmtree_(build_dir) - result = util.exec_command( - ["platformio", "--force", "run", "--project-dir", pioproject_dir] - ) - if result['returncode'] != 0: - pytest.fail(result) + result = util.exec_command(["platformio", "--force", "run"]) + if result['returncode'] != 0: + pytest.fail(result) - # check .elf file - pioenvs_dir = join(pioproject_dir, ".pioenvs") - for item in listdir(pioenvs_dir): - if not isdir(item): - continue - assert isfile(join(pioenvs_dir, item, "firmware.elf")) - # check .hex or .bin files - firmwares = [] - for ext in ("bin", "hex"): - firmwares += glob(join(pioenvs_dir, item, "firmware*.%s" % ext)) - if not firmwares: - pytest.fail("Missed firmware file") - for firmware in firmwares: - assert getsize(firmware) > 0 + assert isdir(build_dir) + + # check .elf file + for item in listdir(build_dir): + if not isdir(item): + continue + assert isfile(join(build_dir, item, "firmware.elf")) + # check .hex or .bin files + firmwares = [] + for ext in ("bin", "hex"): + firmwares += glob(join(build_dir, item, "firmware*.%s" % ext)) + if not firmwares: + pytest.fail("Missed firmware file") + for firmware in firmwares: + assert getsize(firmware) > 0 From ec40dcada71818aed06fe6b61e416d33ea3d67b5 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 3 Jan 2018 18:35:25 +0200 Subject: [PATCH 09/49] Custom firmware/program name in build directory --- HISTORY.rst | 1 + docs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index e015f4f2..1dbefa64 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,6 +7,7 @@ PlatformIO 3.0 3.5.1 (2018-??-??) ~~~~~~~~~~~~~~~~~~ +* Custom firmware/program name in build directory (`example `__) * Renamed ``envs_dir`` option to ``build_dir`` in `Project Configuration File "platformio.ini" `__ * Fixed project generator for CLion IDE diff --git a/docs b/docs index 3c76b2d2..3f5d93fc 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 3c76b2d28905bf778daa192fa2d07235ab6b4a12 +Subproject commit 3f5d93fc22ed90128e583ab929dee49b2ec7cd2a From 62235ef32d57f16fb3f2a76c10dd93426a082580 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 3 Jan 2018 18:59:41 +0200 Subject: [PATCH 10/49] Sync examples --- examples | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples b/examples index 817a51b7..79fabfb8 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit 817a51b7192c2c8a4d9df882659ca2fd09ac9cd6 +Subproject commit 79fabfb8b3e0cd60f14dfb2b7ca5d86193d7e9b8 From 5260217537468468bbb64c6f4abc4b6e4be1621a Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 3 Jan 2018 19:46:44 +0200 Subject: [PATCH 11/49] Sync docs with new boards --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 3f5d93fc..ab95233b 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 3f5d93fc22ed90128e583ab929dee49b2ec7cd2a +Subproject commit ab95233b39db244a6c78be6bfe926f2502aa5aa0 From 2b3bc05f2b0d2f1156e07b1e858c4bea24da8815 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 4 Jan 2018 16:14:56 +0200 Subject: [PATCH 12/49] Option which allows to specify custom `test_speed` // Resolve #1273 --- HISTORY.rst | 6 +++++- docs | 2 +- platformio/commands/run.py | 20 +++++++++++--------- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 1dbefa64..ce5c8d24 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -7,7 +7,11 @@ PlatformIO 3.0 3.5.1 (2018-??-??) ~~~~~~~~~~~~~~~~~~ -* Custom firmware/program name in build directory (`example `__) +* New ``test_speed`` option to control a communication baudrate/speed between + `PIO Unit Testing `__ + engine and a target device + (`issue #1273 `_) +* Configure a custom firmware/program name in build directory (`example `__) * Renamed ``envs_dir`` option to ``build_dir`` in `Project Configuration File "platformio.ini" `__ * Fixed project generator for CLion IDE diff --git a/docs b/docs index ab95233b..cbe24d46 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit ab95233b39db244a6c78be6bfe926f2502aa5aa0 +Subproject commit cbe24d46b20f78e513568a7955424c9cf387aab6 diff --git a/platformio/commands/run.py b/platformio/commands/run.py index 7c045ade..beba742e 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -133,17 +133,19 @@ class EnvironmentProcessor(object): "upload_resetmethod", "lib_deps", "lib_ignore", "lib_extra_dirs", "lib_ldf_mode", "lib_compat_mode", "lib_archive", "piotest", "test_transport", "test_filter", - "test_ignore", "test_port", "debug_tool", "debug_port", - "debug_init_cmds", "debug_extra_cmds", "debug_server", - "debug_init_break", "debug_load_cmd", "monitor_port", - "monitor_baud", "monitor_rts", "monitor_dtr") + "test_ignore", "test_port", "test_speed", "debug_tool", + "debug_port", "debug_init_cmds", "debug_extra_cmds", + "debug_server", "debug_init_break", "debug_load_cmd", + "monitor_port", "monitor_baud", "monitor_rts", + "monitor_dtr") IGNORE_BUILD_OPTIONS = ("test_transport", "test_filter", "test_ignore", - "test_port", "debug_tool", "debug_port", - "debug_init_cmds", "debug_extra_cmds", - "debug_server", "debug_init_break", - "debug_load_cmd", "monitor_port", "monitor_baud", - "monitor_rts", "monitor_dtr") + "test_port", "test_speed", "debug_tool", + "debug_port", "debug_init_cmds", + "debug_extra_cmds", "debug_server", + "debug_init_break", "debug_load_cmd", + "monitor_port", "monitor_baud", "monitor_rts", + "monitor_dtr") REMAPED_OPTIONS = {"framework": "pioframework", "platform": "pioplatform"} From 93c055a2ec93ef9a03845439048abd15ccd63673 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 4 Jan 2018 17:14:04 +0200 Subject: [PATCH 13/49] Bump version to 3.5.1a2 --- platformio/__init__.py | 2 +- platformio/managers/core.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index 9f9b1ce4..611b27cd 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 5, "1a1") +VERSION = (3, 5, "1a2") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/managers/core.py b/platformio/managers/core.py index 42a6c775..8b45b42f 100644 --- a/platformio/managers/core.py +++ b/platformio/managers/core.py @@ -23,7 +23,7 @@ from platformio.managers.package import PackageManager CORE_PACKAGES = { "contrib-piohome": ">=0.6.0,<2", "contrib-pysite": ">=0.1.2,<2", - "tool-pioplus": ">=0.12.1,<2", + "tool-pioplus": ">=0.13.0,<2", "tool-unity": "~1.20302.1", "tool-scons": "~3.20501.2" } From ba858989f2eafc5fd7a1a0bc0168a17e35e1f0a8 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 5 Jan 2018 00:17:45 +0200 Subject: [PATCH 14/49] Fix PIO Unified Debugger for mbed framework --- HISTORY.rst | 1 + platformio/builder/tools/platformio.py | 28 ++++++++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index ce5c8d24..57d0867c 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -15,6 +15,7 @@ PlatformIO 3.0 * Renamed ``envs_dir`` option to ``build_dir`` in `Project Configuration File "platformio.ini" `__ * Fixed project generator for CLion IDE +* Fixed PIO Unified Debugger for mbed framework 3.5.0 (2017-12-28) ~~~~~~~~~~~~~~~~~~ diff --git a/platformio/builder/tools/platformio.py b/platformio/builder/tools/platformio.py index dd6be6a4..f9dd5386 100644 --- a/platformio/builder/tools/platformio.py +++ b/platformio/builder/tools/platformio.py @@ -46,6 +46,9 @@ def BuildProgram(env): if not case_sensitive_suffixes(".s", ".S"): env.Replace(AS="$CC", ASCOM="$ASPPCOM") + if "__debug" in COMMAND_LINE_TARGETS: + env.ProcessDebug() + # process extra flags from board if "BOARD" in env and "build.extra_flags" in env.BoardConfig(): env.ProcessFlags(env.BoardConfig().get("build.extra_flags")) @@ -60,18 +63,6 @@ def BuildProgram(env): # restore PIO macros if it was deleted by framework _append_pio_macros() - # Search for project source files - env.Append( - LIBPATH=["$BUILD_DIR"], - PIOBUILDFILES=env.CollectBuildFiles( - "$BUILDSRC_DIR", "$PROJECTSRC_DIR", "$SRC_FILTER", - duplicate=False)) - - if "__debug" in COMMAND_LINE_TARGETS: - env.ProcessDebug() - if "__test" in COMMAND_LINE_TARGETS: - env.Append(PIOBUILDFILES=env.ProcessTest()) - # build dependent libs env.Append(LIBS=env.BuildProjectLibraries()) @@ -88,7 +79,18 @@ def BuildProgram(env): # Handle SRC_BUILD_FLAGS env.ProcessFlags(env.get("SRC_BUILD_FLAGS")) - if not env.get("PIOBUILDFILES") and not COMMAND_LINE_TARGETS: + env.Append( + LIBPATH=["$BUILD_DIR"], + PIOBUILDFILES=env.CollectBuildFiles( + "$BUILDSRC_DIR", + "$PROJECTSRC_DIR", + src_filter=env.get("SRC_FILTER"), + duplicate=False)) + + if "__test" in COMMAND_LINE_TARGETS: + env.Append(PIOBUILDFILES=env.ProcessTest()) + + if not env['PIOBUILDFILES'] and not COMMAND_LINE_TARGETS: sys.stderr.write( "Error: Nothing to build. Please put your source code files " "to '%s' folder\n" % env.subst("$PROJECTSRC_DIR")) From a4770a27f4b72f9a78db10591fb88d89c14f1092 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 5 Jan 2018 00:18:08 +0200 Subject: [PATCH 15/49] Bump version to 3.5.1a3 --- platformio/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index 611b27cd..78ef6377 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 5, "1a2") +VERSION = (3, 5, "1a3") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" From 16b307d1b34c078a3b996f8855410e312ad6eb18 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 5 Jan 2018 19:08:16 +0200 Subject: [PATCH 16/49] Sync docs --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index cbe24d46..437d9b82 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit cbe24d46b20f78e513568a7955424c9cf387aab6 +Subproject commit 437d9b8201d75aadd028272d971c94c1a2dbda66 From 61872dd73469772a1b8f8246f9852ecf597c1d0c Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 6 Jan 2018 01:04:43 +0200 Subject: [PATCH 17/49] Improve support of PIO Unified Debugger for Eclipse Oxygen --- HISTORY.rst | 1 + platformio/builder/tools/piolib.py | 4 +- platformio/ide/tpls/eclipse/.cproject.tpl | 100 +++++++++++++++++- .../.settings/PlatformIO Debugger.launch.tpl | 8 +- .../.settings/language.settings.xml.tpl | 15 +++ .../.settings/org.eclipse.cdt.core.prefs.tpl | 7 +- platformio/util.py | 2 +- 7 files changed, 129 insertions(+), 8 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 57d0867c..cc8198db 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -14,6 +14,7 @@ PlatformIO 3.0 * Configure a custom firmware/program name in build directory (`example `__) * Renamed ``envs_dir`` option to ``build_dir`` in `Project Configuration File "platformio.ini" `__ +* Improved support of PIO Unified Debugger for Eclipse Oxygen * Fixed project generator for CLion IDE * Fixed PIO Unified Debugger for mbed framework diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index ecf47a25..a4bcd6ff 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -646,7 +646,9 @@ class ProjectAsLibBuilder(LibBuilderBase): def get_include_dirs(self): include_dirs = LibBuilderBase.get_include_dirs(self) - include_dirs.append(self.env.subst("$PROJECTINCLUDE_DIR")) + project_include_dir = self.env.subst("$PROJECTINCLUDE_DIR") + if isdir(project_include_dir): + include_dirs.append(project_include_dir) return include_dirs def get_search_files(self): diff --git a/platformio/ide/tpls/eclipse/.cproject.tpl b/platformio/ide/tpls/eclipse/.cproject.tpl index 3060a7bb..29b76ebc 100644 --- a/platformio/ide/tpls/eclipse/.cproject.tpl +++ b/platformio/ide/tpls/eclipse/.cproject.tpl @@ -5,13 +5,13 @@ + - @@ -99,6 +99,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/platformio/ide/tpls/eclipse/.settings/PlatformIO Debugger.launch.tpl b/platformio/ide/tpls/eclipse/.settings/PlatformIO Debugger.launch.tpl index e27a3061..501ce04b 100644 --- a/platformio/ide/tpls/eclipse/.settings/PlatformIO Debugger.launch.tpl +++ b/platformio/ide/tpls/eclipse/.settings/PlatformIO Debugger.launch.tpl @@ -2,7 +2,7 @@ - + @@ -12,17 +12,17 @@ - + - + - + diff --git a/platformio/ide/tpls/eclipse/.settings/language.settings.xml.tpl b/platformio/ide/tpls/eclipse/.settings/language.settings.xml.tpl index 53c9c72f..19740737 100644 --- a/platformio/ide/tpls/eclipse/.settings/language.settings.xml.tpl +++ b/platformio/ide/tpls/eclipse/.settings/language.settings.xml.tpl @@ -15,4 +15,19 @@ + + + + + + % if "windows" in systype: + + % else: + + % end + + + + + diff --git a/platformio/ide/tpls/eclipse/.settings/org.eclipse.cdt.core.prefs.tpl b/platformio/ide/tpls/eclipse/.settings/org.eclipse.cdt.core.prefs.tpl index 8cac7fbd..e87cf90b 100644 --- a/platformio/ide/tpls/eclipse/.settings/org.eclipse.cdt.core.prefs.tpl +++ b/platformio/ide/tpls/eclipse/.settings/org.eclipse.cdt.core.prefs.tpl @@ -3,4 +3,9 @@ environment/project/0.910961921/PATH/delimiter={{env_pathsep.replace(":", "\\:") environment/project/0.910961921/PATH/operation=replace environment/project/0.910961921/PATH/value={{env_path.replace(":", "\\:")}} environment/project/0.910961921/append=true -environment/project/0.910961921/appendContributed=true \ No newline at end of file +environment/project/0.910961921/appendContributed=true +environment/project/0.910961921.1363900502/PATH/delimiter={{env_pathsep.replace(":", "\\:")}} +environment/project/0.910961921.1363900502/PATH/operation=replace +environment/project/0.910961921.1363900502/PATH/value={{env_path.replace(":", "\\:")}} +environment/project/0.910961921.1363900502/append=true +environment/project/0.910961921.1363900502/appendContributed=true \ No newline at end of file diff --git a/platformio/util.py b/platformio/util.py index 183f2110..6b41949d 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -322,7 +322,7 @@ def get_projectbuild_dir(force=False): with open(dontmod_path, "w") as fp: fp.write(""" [InternetShortcut] -URL=http://docs.platformio.org/page/projectconf.html#build-dir +URL=http://docs.platformio.org/page/projectconf/section_platformio.html#build-dir """) except Exception as e: # pylint: disable=broad-except if not force: From e4f8a1877c13acbad5a4d2ded56baceff054eab1 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 9 Jan 2018 21:56:21 +0200 Subject: [PATCH 18/49] Fix library updates when a version is declared in VCS format (not SemVer) --- HISTORY.rst | 1 + platformio/managers/package.py | 2 ++ tests/commands/test_lib.py | 15 +++++++-------- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index cc8198db..488c0dc0 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -17,6 +17,7 @@ PlatformIO 3.0 * Improved support of PIO Unified Debugger for Eclipse Oxygen * Fixed project generator for CLion IDE * Fixed PIO Unified Debugger for mbed framework +* Fixed library updates when a version is declared in VCS format (not SemVer) 3.5.0 (2017-12-28) ~~~~~~~~~~~~~~~~~~ diff --git a/platformio/managers/package.py b/platformio/managers/package.py index 4d935e76..760cc733 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -211,6 +211,8 @@ class PkgInstallerMixin(object): try: return semantic_version.Version(value) except ValueError: + if "." not in str(value) and not str(value).isdigit(): + raise ValueError("Invalid SemVer version %s" % value) return semantic_version.Version.coerce(value) except ValueError as e: if raise_exception: diff --git a/tests/commands/test_lib.py b/tests/commands/test_lib.py index f2b8d725..657297a8 100644 --- a/tests/commands/test_lib.py +++ b/tests/commands/test_lib.py @@ -15,8 +15,7 @@ import json import re -from platformio import exception, util -from platformio.commands.init import cli as cmd_init +from platformio import exception from platformio.commands.lib import cli as cmd_lib @@ -38,7 +37,7 @@ def test_global_install_registry(clirunner, validate_cliresult, result = clirunner.invoke(cmd_lib, [ "-g", "install", "58", "547@2.2.4", "DallasTemperature", "http://dl.platformio.org/libraries/archives/3/5174.tar.gz", - "ArduinoJson@5.6.7", "ArduinoJson@~5.7.0", "168@00589a3250" + "ArduinoJson@5.6.7", "ArduinoJson@~5.7.0", "999@77d4eb3f8a" ]) validate_cliresult(result) @@ -64,7 +63,7 @@ def test_global_install_registry(clirunner, validate_cliresult, items2 = [ "ArduinoJson_ID64", "ArduinoJson_ID64@5.6.7", "DallasTemperature_ID54", "DHT22_ID58", "ESPAsyncTCP_ID305", "NeoPixelBus_ID547", "OneWire_ID1", - "EspSoftwareSerial_ID168" + "RFcontrol_ID999" ] assert set(items1) == set(items2) @@ -150,7 +149,7 @@ def test_global_lib_list(clirunner, validate_cliresult): "OneWire", "DHT22", "PJON", "ESPAsyncTCP", "ArduinoJson", "PubSubClient", "rs485-nodeproto", "Adafruit ST7735 Library", "RadioHead-1.62", "DallasTemperature", "NeoPixelBus", - "EspSoftwareSerial", "platformio-libmirror" + "RFcontrol", "platformio-libmirror" ] assert set(items1) == set(items2) @@ -160,7 +159,7 @@ def test_global_lib_update_check(clirunner, validate_cliresult): cmd_lib, ["-g", "update", "--only-check", "--json-output"]) validate_cliresult(result) output = json.loads(result.output) - assert set(["ArduinoJson", "EspSoftwareSerial", + assert set(["ArduinoJson", "RFcontrol", "NeoPixelBus"]) == set([l['name'] for l in output]) @@ -185,7 +184,7 @@ def test_global_lib_update(clirunner, validate_cliresult): assert result.output.count("[Fixed]") == 5 assert result.output.count("[Up-to-date]") == 10 assert "Uninstalling ArduinoJson @ 5.7.3" in result.output - assert "Uninstalling EspSoftwareSerial @ 00589a3250" in result.output + assert "Uninstalling RFcontrol @ 77d4eb3f8a" in result.output # update unknown library result = clirunner.invoke(cmd_lib, ["-g", "update", "Unknown"]) @@ -207,7 +206,7 @@ def test_global_lib_uninstall(clirunner, validate_cliresult, # uninstall the rest libraries result = clirunner.invoke(cmd_lib, [ "-g", "uninstall", "1", "https://github.com/bblanchon/ArduinoJson.git", - "ArduinoJson@!=5.6.7", "EspSoftwareSerial@>=3.3.1" + "ArduinoJson@!=5.6.7", "RFcontrol" ]) validate_cliresult(result) From 23ae8e0d3ec7e55258c0c0e2cecf3d6820f338c8 Mon Sep 17 00:00:00 2001 From: Dmitry Bolotin Date: Tue, 9 Jan 2018 23:07:57 +0300 Subject: [PATCH 19/49] Additional fix to 7354515 (#1287) * Additional fix to 7354515 * Update CMakeListsPrivate.txt.tpl Also perform `replace('"', '\\"')` --- platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl index 225a3b67..8d63931b 100644 --- a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl +++ b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl @@ -8,9 +8,7 @@ SET(CMAKE_C_FLAGS_DISTRIBUTION "{{cc_flags}}") set(CMAKE_CXX_STANDARD 11) % for define in defines: -% if "##" not in define: -add_definitions("-D{{!define.replace("(", "\(").replace(")", "\)").replace('"', '\\"')}}") -% end +add_definitions(-D'{{!re.sub(r"([\"()#])",r"\\\1",define)}}') % end % for include in includes: From 61eb989eddd40465e58e7f142f154b1465432dba Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 9 Jan 2018 22:15:03 +0200 Subject: [PATCH 20/49] Fix project generator for CLion // Issue #1287 --- platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl index 8d63931b..6efdb036 100644 --- a/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl +++ b/platformio/ide/tpls/clion/CMakeListsPrivate.txt.tpl @@ -7,8 +7,9 @@ SET(CMAKE_CXX_FLAGS_DISTRIBUTION "{{cxx_flags}}") SET(CMAKE_C_FLAGS_DISTRIBUTION "{{cc_flags}}") set(CMAKE_CXX_STANDARD 11) +% import re % for define in defines: -add_definitions(-D'{{!re.sub(r"([\"()#])",r"\\\1",define)}}') +add_definitions(-D'{{!re.sub(r"([\"\(\)#])", r"\\\1", define)}}') % end % for include in includes: From 5b64bf1f7cf50aed6c2ac0a3dc7edf665d4e5253 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 9 Jan 2018 22:26:33 +0200 Subject: [PATCH 21/49] Set default build environment for each example --- examples | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples b/examples index 79fabfb8..2d081875 160000 --- a/examples +++ b/examples @@ -1 +1 @@ -Subproject commit 79fabfb8b3e0cd60f14dfb2b7ca5d86193d7e9b8 +Subproject commit 2d08187562e83b2b3d3a2d9f4d124c25f2629506 From 1090c414f568c9606a70f4ab47949f6da87eee52 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 10 Jan 2018 02:06:05 +0200 Subject: [PATCH 22/49] Update PIO Core+ and PIO Home // Resolve #1247 Resolve #1280 Resolve #1284 Resolve #1286 --- docs | 2 +- platformio/managers/core.py | 4 ++-- platformio/util.py | 20 ++++++-------------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/docs b/docs index 437d9b82..a1ee45a3 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 437d9b8201d75aadd028272d971c94c1a2dbda66 +Subproject commit a1ee45a30b57a266d41760e2d80cdd4bd4e07418 diff --git a/platformio/managers/core.py b/platformio/managers/core.py index 8b45b42f..8477c624 100644 --- a/platformio/managers/core.py +++ b/platformio/managers/core.py @@ -21,9 +21,9 @@ from platformio import __version__, exception, util from platformio.managers.package import PackageManager CORE_PACKAGES = { - "contrib-piohome": ">=0.6.0,<2", + "contrib-piohome": ">=0.6.1,<2", "contrib-pysite": ">=0.1.2,<2", - "tool-pioplus": ">=0.13.0,<2", + "tool-pioplus": ">=0.13.2,<2", "tool-unity": "~1.20302.1", "tool-scons": "~3.20501.2" } diff --git a/platformio/util.py b/platformio/util.py index 6b41949d..3d63926a 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -22,6 +22,7 @@ import socket import stat import subprocess import sys +from configparser import ConfigParser from functools import wraps from glob import glob from os.path import (abspath, basename, dirname, expanduser, isdir, isfile, @@ -35,12 +36,7 @@ import requests from platformio import __apiurl__, __version__, exception -# pylint: disable=wrong-import-order, too-many-ancestors - -try: - from configparser import ConfigParser -except ImportError: - from ConfigParser import ConfigParser +# pylint: too-many-ancestors class ProjectConfig(ConfigParser): @@ -449,6 +445,10 @@ def get_serial_ports(filter_hwid=False): return result +# Backward compatibility for PIO Core <3.5 +get_serialports = get_serial_ports + + def get_logical_devices(): items = [] if platform.system() == "Windows": @@ -487,14 +487,6 @@ def get_logical_devices(): return items -### Backward compatibility for PIO Core <3.5 -get_serialports = get_serial_ports -get_logicaldisks = lambda: [{ - "disk": d['path'], - "name": d['name'] -} for d in get_logical_devices()] - - def get_mdns_services(): try: import zeroconf From cfb04b31a4bb2688e569b8a1750797ff0f00ed8f Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 10 Jan 2018 02:12:26 +0200 Subject: [PATCH 23/49] Bump version to 3.5.1a4 --- platformio/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index 78ef6377..3dfb09cd 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 5, "1a3") +VERSION = (3, 5, "1a4") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" From c558584640a20f705f59f064295d9fd36f2ab1ad Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 10 Jan 2018 02:58:50 +0200 Subject: [PATCH 24/49] Fix importing of ConfigParser --- platformio/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/util.py b/platformio/util.py index 3d63926a..b86c5ccd 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -22,7 +22,7 @@ import socket import stat import subprocess import sys -from configparser import ConfigParser +from ConfigParser import ConfigParser from functools import wraps from glob import glob from os.path import (abspath, basename, dirname, expanduser, isdir, isfile, From fda439841e3885e00682c16a64689e13999c038b Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 10 Jan 2018 03:07:17 +0200 Subject: [PATCH 25/49] Restore PY2/3 ConfigParser --- platformio/util.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/platformio/util.py b/platformio/util.py index b86c5ccd..aa3f58b5 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -22,7 +22,6 @@ import socket import stat import subprocess import sys -from ConfigParser import ConfigParser from functools import wraps from glob import glob from os.path import (abspath, basename, dirname, expanduser, isdir, isfile, @@ -36,7 +35,12 @@ import requests from platformio import __apiurl__, __version__, exception -# pylint: too-many-ancestors +# pylint: disable=wrong-import-order, too-many-ancestors + +try: + from configparser import ConfigParser +except ImportError: + from ConfigParser import ConfigParser class ProjectConfig(ConfigParser): From 7bbb850c2f1c80be729a7cef518a460282b3e0e4 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 10 Jan 2018 03:33:51 +0200 Subject: [PATCH 26/49] Bump version to 3.5.1a5 --- platformio/__init__.py | 2 +- platformio/managers/core.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index 3dfb09cd..25cc4e8c 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 5, "1a4") +VERSION = (3, 5, "1a5") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/managers/core.py b/platformio/managers/core.py index 8477c624..0e872ce7 100644 --- a/platformio/managers/core.py +++ b/platformio/managers/core.py @@ -23,7 +23,7 @@ from platformio.managers.package import PackageManager CORE_PACKAGES = { "contrib-piohome": ">=0.6.1,<2", "contrib-pysite": ">=0.1.2,<2", - "tool-pioplus": ">=0.13.2,<2", + "tool-pioplus": ">=0.13.3,<2", "tool-unity": "~1.20302.1", "tool-scons": "~3.20501.2" } From ae38d17b7f422c5be24b74f14d3c0fcf92f689e3 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 10 Jan 2018 15:23:56 +0200 Subject: [PATCH 27/49] Ignore packages with TMP_FOLDER_PREFIX --- platformio/managers/package.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/platformio/managers/package.py b/platformio/managers/package.py index 760cc733..e46c615d 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -134,6 +134,7 @@ class PkgRepoMixin(object): class PkgInstallerMixin(object): SRC_MANIFEST_NAME = ".piopkgmanager.json" + TMP_FOLDER_PREFIX = "_tmp_installing-" FILE_CACHE_VALID = "1m" # 1 month FILE_CACHE_MAX_SIZE = 1024 * 1024 @@ -294,6 +295,8 @@ class PkgInstallerMixin(object): def get_installed(self): items = [] for pkg_dir in self.read_dirs(self.package_dir): + if self.TMP_FOLDER_PREFIX in pkg_dir: + continue manifest = self.load_manifest(pkg_dir) if not manifest: continue @@ -378,7 +381,7 @@ class PkgInstallerMixin(object): requirements=None, sha1=None, track=False): - tmp_dir = mkdtemp("-package", "_tmp_installing-", self.package_dir) + tmp_dir = mkdtemp("-package", self.TMP_FOLDER_PREFIX, self.package_dir) src_manifest_dir = None src_manifest = {"name": name, "url": url, "requirements": requirements} From 16eb41b84ee2dfb3bbb4b5a0accf8b4b8199f75a Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 11 Jan 2018 02:02:59 +0200 Subject: [PATCH 28/49] Document "[Error 5] Access is denied" for Package Manager --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index a1ee45a3..33ca4abb 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit a1ee45a30b57a266d41760e2d80cdd4bd4e07418 +Subproject commit 33ca4abb622abb419fb75cab258b536176d54972 From cfb22f2a36d19be2e0f7543e893ebbcf65c1ff4c Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 11 Jan 2018 02:10:51 +0200 Subject: [PATCH 29/49] Add FAQ:Package Manager for PackageInstallError --- platformio/exception.py | 6 +++--- platformio/managers/package.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/platformio/exception.py b/platformio/exception.py index e477bd30..891b994e 100644 --- a/platformio/exception.py +++ b/platformio/exception.py @@ -98,9 +98,9 @@ class UndefinedPackageVersion(PlatformioException): class PackageInstallError(PlatformioException): MESSAGE = ( - "Could not install '{0}' with version requirements '{1}' for your " - "system '{2}'.\n If you use Antivirus, it can block PlatformIO " - "Package Manager. Try to disable it for a while.") + "Could not install '{0}' with version requirements '{1}' " + "for your system '{2}'.\n" + "More details: http://bit.ly/faq-package-manager") class FDUnrecognizedStatusCode(PlatformioException): diff --git a/platformio/managers/package.py b/platformio/managers/package.py index e46c615d..0b1e0ad1 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -666,6 +666,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): name, url, requirements, track=True) else: pkg_dir = self._install_from_piorepo(name, requirements) + if not pkg_dir or not self.manifest_exists(pkg_dir): raise exception.PackageInstallError(name, requirements or "*", util.get_systype()) From 1d5245edbdcc576d526ae5922503e0a0914208ec Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 11 Jan 2018 14:14:35 +0200 Subject: [PATCH 30/49] Add "lib_ldf_mode = chain+" for example with C/C++ Preprocessor conditional syntax --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 33ca4abb..1d05a91d 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 33ca4abb622abb419fb75cab258b536176d54972 +Subproject commit 1d05a91d458f1572e9324982f7bd44557ceb8af9 From 2091a33fb9d2ee5512e253c5eb3f11c31ffc70b2 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 12 Jan 2018 02:23:55 +0200 Subject: [PATCH 31/49] Show full version of the current interpreter --- platformio/__init__.py | 2 +- platformio/managers/core.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index 25cc4e8c..e56cfd25 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -36,5 +36,5 @@ if sys.version_info < (2, 7, 0) or sys.version_info >= (3, 0, 0): msg = ("PlatformIO Core v%s does not run under Python version %s.\n" "Minimum supported version is 2.7, please upgrade Python.\n" "Python 3 is not yet supported.\n") - sys.stderr.write(msg % (__version__, sys.version.split()[0])) + sys.stderr.write(msg % (__version__, sys.version)) sys.exit(1) diff --git a/platformio/managers/core.py b/platformio/managers/core.py index 0e872ce7..3d1e8721 100644 --- a/platformio/managers/core.py +++ b/platformio/managers/core.py @@ -101,8 +101,7 @@ def pioplus_call(args, **kwargs): raise exception.PlatformioException( "PlatformIO Core Plus v%s does not run under Python version %s.\n" "Minimum supported version is 2.7.6, please upgrade Python.\n" - "Python 3 is not yet supported.\n" % (__version__, - sys.version.split()[0])) + "Python 3 is not yet supported.\n" % (__version__, sys.version)) pioplus_path = join(get_core_package_dir("tool-pioplus"), "pioplus") pythonexe_path = util.get_pythonexe_path() From 712155243c7fda0b9eda7f40c7d05b2bafa5e5cd Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 12 Jan 2018 14:20:53 +0200 Subject: [PATCH 32/49] Add "lib" and ".piolibdeps" to CLion project index --- platformio/ide/tpls/clion/CMakeLists.txt.tpl | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/platformio/ide/tpls/clion/CMakeLists.txt.tpl b/platformio/ide/tpls/clion/CMakeLists.txt.tpl index 63274c43..075bc805 100644 --- a/platformio/ide/tpls/clion/CMakeLists.txt.tpl +++ b/platformio/ide/tpls/clion/CMakeLists.txt.tpl @@ -51,4 +51,18 @@ add_custom_target( WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) +if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib) + add_custom_target( + CODE_COMPLETION_PIOLIB + SOURCES lib + ) +endif() + +if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/.piolibdeps) + add_custom_target( + CODE_COMPLETION_PIOLIBDEPS + SOURCES .piolibdeps + ) +endif() + add_executable(${PROJECT_NAME} ${SRC_LIST}) From 7cad113f0a07875c74fef2ea5fca0057241fc1af Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 13 Jan 2018 01:19:41 +0200 Subject: [PATCH 33/49] Cleanup tests --- Makefile | 2 +- platformio/exception.py | 7 +++-- tests/commands/test_ci.py | 4 +-- tests/commands/test_init.py | 46 ++++++++++++++------------------- tests/commands/test_lib.py | 4 +-- tests/commands/test_platform.py | 20 +++++++------- tests/commands/test_settings.py | 2 +- tests/commands/test_update.py | 6 +---- tests/test_maintenance.py | 16 +++++------- tests/test_managers.py | 2 +- tox.ini | 1 + 11 files changed, 47 insertions(+), 63 deletions(-) diff --git a/Makefile b/Makefile index 0031d316..6df42c42 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ yapf: yapf --recursive --in-place platformio/ test: - py.test -v -s tests --ignore tests/test_examples.py --ignore tests/test_pkgmanifest.py + py.test -v -s -n 3 --dist=loadscope tests --ignore tests/test_examples.py --ignore tests/test_pkgmanifest.py before-commit: isort yapf lint test diff --git a/platformio/exception.py b/platformio/exception.py index 891b994e..073ea4f7 100644 --- a/platformio/exception.py +++ b/platformio/exception.py @@ -97,10 +97,9 @@ class UndefinedPackageVersion(PlatformioException): class PackageInstallError(PlatformioException): - MESSAGE = ( - "Could not install '{0}' with version requirements '{1}' " - "for your system '{2}'.\n" - "More details: http://bit.ly/faq-package-manager") + MESSAGE = ("Could not install '{0}' with version requirements '{1}' " + "for your system '{2}'.\n" + "More details: http://bit.ly/faq-package-manager") class FDUnrecognizedStatusCode(PlatformioException): diff --git a/tests/commands/test_ci.py b/tests/commands/test_ci.py index 9c77582b..2ab76544 100644 --- a/tests/commands/test_ci.py +++ b/tests/commands/test_ci.py @@ -45,7 +45,7 @@ def test_ci_lib_and_board(clirunner, validate_cliresult): example_dir = join("examples", "atmelavr", "arduino-external-libs") result = clirunner.invoke(cmd_ci, [ join(example_dir, "lib", "OneWire", "examples", "DS2408_Switch", - "DS2408_Switch.pde"), "-l", join(example_dir, "lib", "OneWire"), - "-b", "uno" + "DS2408_Switch.pde"), "-l", + join(example_dir, "lib", "OneWire"), "-b", "uno" ]) validate_cliresult(result) diff --git a/tests/commands/test_init.py b/tests/commands/test_init.py index 4b7c0a94..eecb25f3 100644 --- a/tests/commands/test_init.py +++ b/tests/commands/test_init.py @@ -54,7 +54,7 @@ def test_init_duplicated_boards(clirunner, validate_cliresult, tmpdir): assert set(config.sections()) == set(["env:uno"]) -def test_init_ide_without_board(clirunner, validate_cliresult, tmpdir): +def test_init_ide_without_board(clirunner, tmpdir): with tmpdir.as_cwd(): result = clirunner.invoke(cmd_init, ["--ide", "atom"]) assert result.exit_code == -1 @@ -67,13 +67,15 @@ def test_init_ide_atom(clirunner, validate_cliresult, tmpdir): cmd_init, ["--ide", "atom", "-b", "uno", "-b", "teensy31"]) validate_cliresult(result) validate_pioproject(str(tmpdir)) - assert all([tmpdir.join(f).check() - for f in (".clang_complete", ".gcc-flags.json")]) + assert all([ + tmpdir.join(f).check() + for f in (".clang_complete", ".gcc-flags.json") + ]) assert "arduinoavr" in tmpdir.join(".clang_complete").read() # switch to NodeMCU - result = clirunner.invoke( - cmd_init, ["--ide", "atom", "-b", "nodemcuv2"]) + result = clirunner.invoke(cmd_init, + ["--ide", "atom", "-b", "nodemcuv2"]) validate_cliresult(result) validate_pioproject(str(tmpdir)) assert "arduinoespressif" in tmpdir.join(".clang_complete").read() @@ -104,15 +106,13 @@ def test_init_special_board(clirunner, validate_cliresult): boards = json.loads(result.output) config = util.load_project_config() - expected_result = [ - ("platform", str(boards[0]['platform'])), - ("framework", str(boards[0]['frameworks'][0])), ("board", "uno") - ] + expected_result = [("platform", str(boards[0]['platform'])), + ("framework", + str(boards[0]['frameworks'][0])), ("board", "uno")] assert config.has_section("env:uno") - assert len( - set(expected_result).symmetric_difference( - set(config.items("env:uno")))) == 0 + assert not set(expected_result).symmetric_difference( + set(config.items("env:uno"))) def test_init_enable_auto_uploading(clirunner, validate_cliresult): @@ -122,14 +122,11 @@ def test_init_enable_auto_uploading(clirunner, validate_cliresult): validate_cliresult(result) validate_pioproject(getcwd()) config = util.load_project_config() - expected_result = [ - ("platform", "atmelavr"), ("framework", "arduino"), - ("board", "uno"), ("targets", "upload") - ] + expected_result = [("platform", "atmelavr"), ("framework", "arduino"), + ("board", "uno"), ("targets", "upload")] assert config.has_section("env:uno") - assert len( - set(expected_result).symmetric_difference( - set(config.items("env:uno")))) == 0 + assert not set(expected_result).symmetric_difference( + set(config.items("env:uno"))) def test_init_custom_framework(clirunner, validate_cliresult): @@ -139,14 +136,11 @@ def test_init_custom_framework(clirunner, validate_cliresult): validate_cliresult(result) validate_pioproject(getcwd()) config = util.load_project_config() - expected_result = [ - ("platform", "teensy"), ("framework", "mbed"), - ("board", "teensy31") - ] + expected_result = [("platform", "teensy"), ("framework", "mbed"), + ("board", "teensy31")] assert config.has_section("env:teensy31") - assert len( - set(expected_result).symmetric_difference( - set(config.items("env:teensy31")))) == 0 + assert not set(expected_result).symmetric_difference( + set(config.items("env:teensy31"))) def test_init_incorrect_board(clirunner): diff --git a/tests/commands/test_lib.py b/tests/commands/test_lib.py index 657297a8..2aa1d0d4 100644 --- a/tests/commands/test_lib.py +++ b/tests/commands/test_lib.py @@ -148,8 +148,8 @@ def test_global_lib_list(clirunner, validate_cliresult): items2 = [ "OneWire", "DHT22", "PJON", "ESPAsyncTCP", "ArduinoJson", "PubSubClient", "rs485-nodeproto", "Adafruit ST7735 Library", - "RadioHead-1.62", "DallasTemperature", "NeoPixelBus", - "RFcontrol", "platformio-libmirror" + "RadioHead-1.62", "DallasTemperature", "NeoPixelBus", "RFcontrol", + "platformio-libmirror" ] assert set(items1) == set(items2) diff --git a/tests/commands/test_platform.py b/tests/commands/test_platform.py index 2bb747fd..5b3053fe 100644 --- a/tests/commands/test_platform.py +++ b/tests/commands/test_platform.py @@ -24,27 +24,25 @@ def test_search_json_output(clirunner, validate_cliresult, isolated_pio_home): validate_cliresult(result) search_result = json.loads(result.output) assert isinstance(search_result, list) - assert len(search_result) + assert search_result platforms = [item['name'] for item in search_result] assert "atmelsam" in platforms -def test_search_raw_output(clirunner, validate_cliresult, isolated_pio_home): +def test_search_raw_output(clirunner, validate_cliresult): result = clirunner.invoke(cli_platform.platform_search, ["arduino"]) validate_cliresult(result) assert "teensy" in result.output -def test_install_unknown_version(clirunner, validate_cliresult, - isolated_pio_home): +def test_install_unknown_version(clirunner): result = clirunner.invoke(cli_platform.platform_install, ["atmelavr@99.99.99"]) assert result.exit_code == -1 assert isinstance(result.exception, exception.UndefinedPackageVersion) -def test_install_unknown_from_registry(clirunner, validate_cliresult, - isolated_pio_home): +def test_install_unknown_from_registry(clirunner): result = clirunner.invoke(cli_platform.platform_install, ["unknown-platform"]) assert result.exit_code == -1 @@ -63,7 +61,7 @@ def test_install_known_version(clirunner, validate_cliresult, assert len(isolated_pio_home.join("packages").listdir()) == 1 -def test_install_from_vcs(clirunner, validate_cliresult, isolated_pio_home): +def test_install_from_vcs(clirunner, validate_cliresult): result = clirunner.invoke(cli_platform.platform_install, [ "https://github.com/platformio/" "platform-espressif8266.git#feature/stage", "--skip-default-package" @@ -72,17 +70,17 @@ def test_install_from_vcs(clirunner, validate_cliresult, isolated_pio_home): assert "espressif8266" in result.output -def test_list_json_output(clirunner, validate_cliresult, isolated_pio_home): +def test_list_json_output(clirunner, validate_cliresult): result = clirunner.invoke(cli_platform.platform_list, ["--json-output"]) validate_cliresult(result) list_result = json.loads(result.output) assert isinstance(list_result, list) - assert len(list_result) + assert list_result platforms = [item['name'] for item in list_result] assert set(["atmelavr", "espressif8266"]) == set(platforms) -def test_list_raw_output(clirunner, validate_cliresult, isolated_pio_home): +def test_list_raw_output(clirunner, validate_cliresult): result = clirunner.invoke(cli_platform.platform_list) validate_cliresult(result) assert all( @@ -111,4 +109,4 @@ def test_uninstall(clirunner, validate_cliresult, isolated_pio_home): result = clirunner.invoke(cli_platform.platform_uninstall, ["atmelavr", "espressif8266"]) validate_cliresult(result) - assert len(isolated_pio_home.join("platforms").listdir()) == 0 + assert not isolated_pio_home.join("platforms").listdir() diff --git a/tests/commands/test_settings.py b/tests/commands/test_settings.py index c6cd33da..e846ecc6 100644 --- a/tests/commands/test_settings.py +++ b/tests/commands/test_settings.py @@ -19,6 +19,6 @@ from platformio.commands.settings import cli def test_settings_check(clirunner, validate_cliresult): result = clirunner.invoke(cli, ["get"]) validate_cliresult(result) - assert len(result.output) + assert result.output for item in app.DEFAULT_SETTINGS.items(): assert item[0] in result.output diff --git a/tests/commands/test_update.py b/tests/commands/test_update.py index b8309fb8..9325e501 100644 --- a/tests/commands/test_update.py +++ b/tests/commands/test_update.py @@ -16,11 +16,7 @@ from platformio.commands.update import cli as cmd_update def test_update(clirunner, validate_cliresult): - matches = ( - "Platform Manager", - "Up-to-date", - "Library Manager" - ) + matches = ("Platform Manager", "Up-to-date", "Library Manager") result = clirunner.invoke(cmd_update, ["--only-check"]) validate_cliresult(result) assert all([m in result.output for m in matches]) diff --git a/tests/test_maintenance.py b/tests/test_maintenance.py index 9fd7fd6b..667c1563 100644 --- a/tests/test_maintenance.py +++ b/tests/test_maintenance.py @@ -57,8 +57,7 @@ def test_after_upgrade_2_to_3(clirunner, validate_cliresult, assert board_ids == set([b['id'] for b in json.loads(result.output)]) -def test_after_upgrade_silence(clirunner, validate_cliresult, - isolated_pio_home): +def test_after_upgrade_silence(clirunner, validate_cliresult): app.set_state_item("last_version", "2.11.2") result = clirunner.invoke(cli_pio, ["boards", "--json-output"]) validate_cliresult(result) @@ -66,7 +65,7 @@ def test_after_upgrade_silence(clirunner, validate_cliresult, assert any([b['id'] == "uno" for b in boards]) -def test_check_pio_upgrade(clirunner, validate_cliresult, isolated_pio_home): +def test_check_pio_upgrade(clirunner, validate_cliresult): def _patch_pio_version(version): maintenance.__version__ = version @@ -96,7 +95,7 @@ def test_check_pio_upgrade(clirunner, validate_cliresult, isolated_pio_home): _patch_pio_version(origin_version) -def test_check_lib_updates(clirunner, validate_cliresult, isolated_pio_home): +def test_check_lib_updates(clirunner, validate_cliresult): # install obsolete library result = clirunner.invoke(cli_pio, ["lib", "-g", "install", "ArduinoJson@<5.7"]) @@ -113,8 +112,7 @@ def test_check_lib_updates(clirunner, validate_cliresult, isolated_pio_home): result.output) -def test_check_and_update_libraries(clirunner, validate_cliresult, - isolated_pio_home): +def test_check_and_update_libraries(clirunner, validate_cliresult): # enable library auto-updates result = clirunner.invoke( cli_pio, ["settings", "set", "auto_update_libraries", "Yes"]) @@ -168,8 +166,7 @@ def test_check_platform_updates(clirunner, validate_cliresult, assert "There are the new updates for platforms (native)" in result.output -def test_check_and_update_platforms(clirunner, validate_cliresult, - isolated_pio_home): +def test_check_and_update_platforms(clirunner, validate_cliresult): # enable library auto-updates result = clirunner.invoke( cli_pio, ["settings", "set", "auto_update_platforms", "Yes"]) @@ -190,8 +187,7 @@ def test_check_and_update_platforms(clirunner, validate_cliresult, validate_cliresult(result) assert "There are the new updates for platforms (native)" in result.output assert "Please wait while updating platforms" in result.output - assert re.search(r"Updating native\s+@ 0.0.0\s+\[[\d\.]+\]", - result.output) + assert re.search(r"Updating native\s+@ 0.0.0\s+\[[\d\.]+\]", result.output) # check updated version result = clirunner.invoke(cli_pio, ["platform", "list", "--json-output"]) diff --git a/tests/test_managers.py b/tests/test_managers.py index 559c9d29..6fe2f273 100644 --- a/tests/test_managers.py +++ b/tests/test_managers.py @@ -186,7 +186,7 @@ def test_install_packages(isolated_pio_home, tmpdir): "packages").listdir()]) == set(pkg_dirnames) -def test_get_package(isolated_pio_home): +def test_get_package(): tests = [ [("unknown", ), None], [("1", ), None], diff --git a/tox.ini b/tox.ini index ad3288c7..f1196266 100644 --- a/tox.ini +++ b/tox.ini @@ -23,6 +23,7 @@ deps = yapf pylint pytest + pytest-xdist commands = python --version [testenv:docs] From a6c84da83ad4e73cd23877944ceb5c2590841df2 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 13 Jan 2018 01:21:53 +0200 Subject: [PATCH 34/49] Check cached API result before Internet --- platformio/util.py | 5 ++++- tests/test_misc.py | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/platformio/util.py b/platformio/util.py index aa3f58b5..49fd1264 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -621,7 +621,6 @@ def _get_api_result( def get_api_result(url, params=None, data=None, auth=None, cache_valid=None): - internet_on(raise_exception=True) from platformio.app import ContentCache total = 0 max_retries = 5 @@ -634,6 +633,10 @@ def get_api_result(url, params=None, data=None, auth=None, cache_valid=None): result = cc.get(cache_key) if result is not None: return result + + # check internet before and resolve issue with 60 seconds timeout + internet_on(raise_exception=True) + result = _get_api_result(url, params, data) if cache_valid: with ContentCache() as cc: diff --git a/tests/test_misc.py b/tests/test_misc.py index e8121c99..8d13c86b 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -12,11 +12,25 @@ # See the License for the specific language governing permissions and # limitations under the License. +import pytest import requests -from platformio import util +from platformio import exception, util def test_ping_internet_ips(): for ip in util.PING_INTERNET_IPS: requests.get("http://%s" % ip, allow_redirects=False, timeout=2) + + +def test_api_internet_offline(monkeypatch, isolated_pio_home): + monkeypatch.setattr(util, "_internet_on", lambda: False) + with pytest.raises(exception.InternetIsOffline): + util.get_api_result("/stats") + +def test_api_cache(monkeypatch, isolated_pio_home): + api_kwargs = {"url": "/stats", "cache_valid": "1m"} + result = util.get_api_result(**api_kwargs) + assert result and "boards" in result + monkeypatch.setattr(util, '_internet_on', lambda: False) + assert util.get_api_result(**api_kwargs) == result From ec419f3d0e79bf88c34e88718577cf8e40d4d7d7 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 13 Jan 2018 17:02:08 +0200 Subject: [PATCH 35/49] Refactor CMD:LIB tests --- tests/commands/test_lib.py | 127 ++++++++++++++++++++++--------------- tests/conftest.py | 16 +++-- tests/test_misc.py | 6 +- 3 files changed, 90 insertions(+), 59 deletions(-) diff --git a/tests/commands/test_lib.py b/tests/commands/test_lib.py index 2aa1d0d4..ed085dea 100644 --- a/tests/commands/test_lib.py +++ b/tests/commands/test_lib.py @@ -35,25 +35,11 @@ def test_search(clirunner, validate_cliresult): def test_global_install_registry(clirunner, validate_cliresult, isolated_pio_home): result = clirunner.invoke(cmd_lib, [ - "-g", "install", "58", "547@2.2.4", "DallasTemperature", - "http://dl.platformio.org/libraries/archives/3/5174.tar.gz", - "ArduinoJson@5.6.7", "ArduinoJson@~5.7.0", "999@77d4eb3f8a" + "-g", "install", "64", "ArduinoJson@~5.10.0", "547@2.2.4", + "AsyncMqttClient@<=0.8.2", "999@77d4eb3f8a" ]) validate_cliresult(result) - # check lib with duplicate URL - result = clirunner.invoke(cmd_lib, [ - "-g", "install", - "http://dl.platformio.org/libraries/archives/3/5174.tar.gz" - ]) - validate_cliresult(result) - assert "is already installed" in result.output - - # check lib with duplicate ID - result = clirunner.invoke(cmd_lib, ["-g", "install", "305"]) - validate_cliresult(result) - assert "is already installed" in result.output - # install unknown library result = clirunner.invoke(cmd_lib, ["-g", "install", "Unknown"]) assert result.exit_code != 0 @@ -61,8 +47,8 @@ def test_global_install_registry(clirunner, validate_cliresult, items1 = [d.basename for d in isolated_pio_home.join("lib").listdir()] items2 = [ - "ArduinoJson_ID64", "ArduinoJson_ID64@5.6.7", "DallasTemperature_ID54", - "DHT22_ID58", "ESPAsyncTCP_ID305", "NeoPixelBus_ID547", "OneWire_ID1", + "ArduinoJson_ID64", "ArduinoJson_ID64@5.10.1", "NeoPixelBus_ID547", + "AsyncMqttClient_ID346", "ESPAsyncTCP_ID305", "AsyncTCP_ID1826", "RFcontrol_ID999" ] assert set(items1) == set(items2) @@ -71,11 +57,12 @@ def test_global_install_registry(clirunner, validate_cliresult, def test_global_install_archive(clirunner, validate_cliresult, isolated_pio_home): result = clirunner.invoke(cmd_lib, [ - "-g", "install", "https://github.com/adafruit/Adafruit-ST7735-Library/" - "archive/master.zip", + "-g", "install", "http://www.airspayce.com/mikem/arduino/RadioHead/RadioHead-1.62.zip", "https://github.com/bblanchon/ArduinoJson/archive/v5.8.2.zip", - "https://github.com/bblanchon/ArduinoJson/archive/v5.8.2.zip@5.8.2" + "https://github.com/bblanchon/ArduinoJson/archive/v5.8.2.zip@5.8.2", + "http://dl.platformio.org/libraries/archives/0/9540.tar.gz", + "https://github.com/adafruit/Adafruit-ST7735-Library/archive/master.zip" ]) validate_cliresult(result) @@ -86,16 +73,11 @@ def test_global_install_archive(clirunner, validate_cliresult, ]) assert result.exit_code != 0 - # check lib with duplicate URL - result = clirunner.invoke(cmd_lib, [ - "-g", "install", - "http://www.airspayce.com/mikem/arduino/RadioHead/RadioHead-1.62.zip" - ]) - validate_cliresult(result) - assert "is already installed" in result.output - items1 = [d.basename for d in isolated_pio_home.join("lib").listdir()] - items2 = ["Adafruit ST7735 Library", "RadioHead-1.62"] + items2 = [ + "RadioHead-1.62", "ArduinoJson", "DallasTemperature_ID54", + "OneWire_ID1", "Adafruit ST7735 Library" + ] assert set(items1) >= set(items2) @@ -112,18 +94,41 @@ def test_global_install_repository(clirunner, validate_cliresult, "https://gitlab.com/ivankravets/rs485-nodeproto.git", "https://github.com/platformio/platformio-libmirror.git", # "https://developer.mbed.org/users/simon/code/TextLCD/", - "knolleary/pubsubclient" + "knolleary/pubsubclient#bef58148582f956dfa772687db80c44e2279a163" ]) validate_cliresult(result) items1 = [d.basename for d in isolated_pio_home.join("lib").listdir()] items2 = [ "PJON", "PJON@src-79de467ebe19de18287becff0a1fb42d", "ArduinoJson@src-69ebddd821f771debe7ee734d3c7fa81", "rs485-nodeproto", - "PubSubClient" + "platformio-libmirror", "PubSubClient" ] assert set(items1) >= set(items2) - # check lib with duplicate URL + +def test_install_duplicates(clirunner, validate_cliresult, without_internet): + # registry + result = clirunner.invoke(cmd_lib, [ + "-g", "install", + "http://dl.platformio.org/libraries/archives/0/9540.tar.gz" + ]) + validate_cliresult(result) + assert "is already installed" in result.output + + # by ID + result = clirunner.invoke(cmd_lib, ["-g", "install", "999"]) + validate_cliresult(result) + assert "is already installed" in result.output + + # archive + result = clirunner.invoke(cmd_lib, [ + "-g", "install", + "http://www.airspayce.com/mikem/arduino/RadioHead/RadioHead-1.62.zip" + ]) + validate_cliresult(result) + assert "is already installed" in result.output + + # repository result = clirunner.invoke(cmd_lib, [ "-g", "install", "https://github.com/platformio/platformio-libmirror.git" @@ -135,23 +140,44 @@ def test_global_install_repository(clirunner, validate_cliresult, def test_global_lib_list(clirunner, validate_cliresult): result = clirunner.invoke(cmd_lib, ["-g", "list"]) validate_cliresult(result) - assert all([n in result.output for n in ("OneWire", "DHT22", "64")]) + assert all([ + n in result.output + for n in + ("Source: https://github.com/adafruit/Adafruit-ST7735-Library/archive/master.zip", + "Version: 5.10.1", + "Source: git+https://github.com/gioblu/PJON.git#3.0", + "Version: 1fb26fd", "RadioHead-1.62") + ]) result = clirunner.invoke(cmd_lib, ["-g", "list", "--json-output"]) assert all([ n in result.output - for n in ( - "PJON", "git+https://github.com/knolleary/pubsubclient", - "https://github.com/bblanchon/ArduinoJson/archive/v5.8.2.zip") + for n in + ("__pkg_dir", + '"__src_url": "git+https://gitlab.com/ivankravets/rs485-nodeproto.git"', + '"version": "5.10.1"') ]) items1 = [i['name'] for i in json.loads(result.output)] items2 = [ - "OneWire", "DHT22", "PJON", "ESPAsyncTCP", "ArduinoJson", - "PubSubClient", "rs485-nodeproto", "Adafruit ST7735 Library", - "RadioHead-1.62", "DallasTemperature", "NeoPixelBus", "RFcontrol", - "platformio-libmirror" + "Adafruit ST7735 Library", "ArduinoJson", "ArduinoJson", "ArduinoJson", + "ArduinoJson", "AsyncMqttClient", "AsyncTCP", "DallasTemperature", + "ESPAsyncTCP", "NeoPixelBus", "OneWire", "PJON", "PJON", + "PubSubClient", "RFcontrol", "RadioHead-1.62", "platformio-libmirror", + "rs485-nodeproto" ] - assert set(items1) == set(items2) + assert sorted(items1) == sorted(items2) + + versions1 = [ + "{name}@{version}".format(**item) + for item in json.loads(result.output) + ] + versions2 = [ + 'ArduinoJson@5c33fd4', 'ArduinoJson@5.8.2', 'ArduinoJson@5.10.1', + 'AsyncMqttClient@0.8.2', 'AsyncTCP@1.0.1', 'ESPAsyncTCP@1.1.3', + 'NeoPixelBus@2.2.4', 'PJON@07fe9aa', 'PJON@1fb26fd', + 'PubSubClient@bef5814', 'RFcontrol@77d4eb3f8a', 'RadioHead-1.62@0.0.0' + ] + assert set(versions1) >= set(versions2) def test_global_lib_update_check(clirunner, validate_cliresult): @@ -159,7 +185,7 @@ def test_global_lib_update_check(clirunner, validate_cliresult): cmd_lib, ["-g", "update", "--only-check", "--json-output"]) validate_cliresult(result) output = json.loads(result.output) - assert set(["ArduinoJson", "RFcontrol", + assert set(["RFcontrol", "NeoPixelBus"]) == set([l['name'] for l in output]) @@ -180,10 +206,8 @@ def test_global_lib_update(clirunner, validate_cliresult): # update rest libraries result = clirunner.invoke(cmd_lib, ["-g", "update"]) validate_cliresult(result) - validate_cliresult(result) - assert result.output.count("[Fixed]") == 5 - assert result.output.count("[Up-to-date]") == 10 - assert "Uninstalling ArduinoJson @ 5.7.3" in result.output + assert result.output.count("[Fixed]") == 6 + assert result.output.count("[Up-to-date]") == 11 assert "Uninstalling RFcontrol @ 77d4eb3f8a" in result.output # update unknown library @@ -212,10 +236,11 @@ def test_global_lib_uninstall(clirunner, validate_cliresult, items1 = [d.basename for d in isolated_pio_home.join("lib").listdir()] items2 = [ - "ArduinoJson_ID64", "ArduinoJson_ID64@5.6.7", "DallasTemperature_ID54", - "DHT22_ID58", "ESPAsyncTCP_ID305", "NeoPixelBus_ID547", "PJON", - "PJON@src-79de467ebe19de18287becff0a1fb42d", "PubSubClient", - "RadioHead-1.62", "rs485-nodeproto", "platformio-libmirror" + "RadioHead-1.62", "rs485-nodeproto", "platformio-libmirror", + "PubSubClient", "ArduinoJson@src-69ebddd821f771debe7ee734d3c7fa81", + "ESPAsyncTCP_ID305", "DallasTemperature_ID54", "NeoPixelBus_ID547", + "PJON", "AsyncMqttClient_ID346", "ArduinoJson_ID64", + "PJON@src-79de467ebe19de18287becff0a1fb42d", "AsyncTCP_ID1826" ] assert set(items1) == set(items2) diff --git a/tests/conftest.py b/tests/conftest.py index b407b328..2ed8b41e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,14 +13,10 @@ # limitations under the License. import os - import pytest from click.testing import CliRunner - -@pytest.fixture(scope="module") -def clirunner(): - return CliRunner() +from platformio import util @pytest.fixture(scope="session") @@ -33,6 +29,11 @@ def validate_cliresult(): return decorator +@pytest.fixture(scope="module") +def clirunner(): + return CliRunner() + + @pytest.fixture(scope="module") def isolated_pio_home(request, tmpdir_factory): home_dir = tmpdir_factory.mktemp(".platformio") @@ -43,3 +44,8 @@ def isolated_pio_home(request, tmpdir_factory): request.addfinalizer(fin) return home_dir + + +@pytest.fixture(scope="function") +def without_internet(monkeypatch): + monkeypatch.setattr(util, "_internet_on", lambda: False) diff --git a/tests/test_misc.py b/tests/test_misc.py index 8d13c86b..b918767b 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -23,13 +23,13 @@ def test_ping_internet_ips(): requests.get("http://%s" % ip, allow_redirects=False, timeout=2) -def test_api_internet_offline(monkeypatch, isolated_pio_home): - monkeypatch.setattr(util, "_internet_on", lambda: False) +def test_api_internet_offline(without_internet, isolated_pio_home): with pytest.raises(exception.InternetIsOffline): util.get_api_result("/stats") + def test_api_cache(monkeypatch, isolated_pio_home): - api_kwargs = {"url": "/stats", "cache_valid": "1m"} + api_kwargs = {"url": "/stats", "cache_valid": "10s"} result = util.get_api_result(**api_kwargs) assert result and "boards" in result monkeypatch.setattr(util, '_internet_on', lambda: False) From 6cddaf9eb719d58a86643c00aa25f4a0c8af32c4 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 13 Jan 2018 19:01:27 +0200 Subject: [PATCH 36/49] Ignore VSCode launch.json for VCS --- platformio/ide/tpls/vscode/.gitignore.tpl | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio/ide/tpls/vscode/.gitignore.tpl b/platformio/ide/tpls/vscode/.gitignore.tpl index f39f7c9b..f92113ad 100644 --- a/platformio/ide/tpls/vscode/.gitignore.tpl +++ b/platformio/ide/tpls/vscode/.gitignore.tpl @@ -1,3 +1,4 @@ .pioenvs .piolibdeps .vscode/c_cpp_properties.json +.vscode/launch.json From 24f314d73dcad2c0de530f08ea2676f74824bfe1 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 13 Jan 2018 19:44:05 +0200 Subject: [PATCH 37/49] Improve a work in off-line mode --- HISTORY.rst | 1 + platformio/builder/tools/piolib.py | 25 +-- platformio/commands/lib.py | 33 ++-- platformio/commands/run.py | 14 +- platformio/managers/lib.py | 251 ++++++++++++++++++----------- platformio/util.py | 14 ++ tests/conftest.py | 1 + 7 files changed, 189 insertions(+), 150 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 488c0dc0..d34f9974 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -15,6 +15,7 @@ PlatformIO 3.0 * Renamed ``envs_dir`` option to ``build_dir`` in `Project Configuration File "platformio.ini" `__ * Improved support of PIO Unified Debugger for Eclipse Oxygen +* Improved work in off-line mode * Fixed project generator for CLion IDE * Fixed PIO Unified Debugger for mbed framework * Fixed library updates when a version is declared in VCS format (not SemVer) diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index a4bcd6ff..eb21d6c2 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -228,19 +228,6 @@ class LibBuilderBase(object): except (AssertionError, ValueError): return LibBuilderBase.COMPAT_MODE_DEFAULT - @staticmethod - def items_to_list(items): - if not isinstance(items, list): - items = [i.strip() for i in items.split(",")] - return [i.lower() for i in items if i] - - def items_in_list(self, items, ilist): - items = self.items_to_list(items) - ilist = self.items_to_list(ilist) - if "*" in items or "*" in ilist: - return True - return set(items) & set(ilist) - def is_platforms_compatible(self, platforms): return True @@ -273,7 +260,7 @@ class LibBuilderBase(object): if env_key not in self.env: continue if (key in item and - not self.items_in_list(self.env[env_key], item[key])): + not util.items_in_list(self.env[env_key], item[key])): if self.verbose: sys.stderr.write( "Skip %s incompatible dependency %s\n" % (key[:-1], @@ -496,7 +483,7 @@ class ArduinoLibBuilder(LibBuilderBase): return src_filter def is_frameworks_compatible(self, frameworks): - return self.items_in_list(frameworks, ["arduino", "energia"]) + return util.items_in_list(frameworks, ["arduino", "energia"]) class MbedLibBuilder(LibBuilderBase): @@ -527,7 +514,7 @@ class MbedLibBuilder(LibBuilderBase): return include_dirs def is_frameworks_compatible(self, frameworks): - return self.items_in_list(frameworks, ["mbed"]) + return util.items_in_list(frameworks, ["mbed"]) class PlatformIOLibBuilder(LibBuilderBase): @@ -541,7 +528,7 @@ class PlatformIOLibBuilder(LibBuilderBase): if "platforms" in manifest: manifest['platforms'] = [ "espressif8266" if p == "espressif" else p - for p in self.items_to_list(manifest['platforms']) + for p in util.items_to_list(manifest['platforms']) ] return manifest @@ -610,13 +597,13 @@ class PlatformIOLibBuilder(LibBuilderBase): items = self._manifest.get("platforms") if not items: return LibBuilderBase.is_platforms_compatible(self, platforms) - return self.items_in_list(platforms, items) + return util.items_in_list(platforms, items) def is_frameworks_compatible(self, frameworks): items = self._manifest.get("frameworks") if not items: return LibBuilderBase.is_frameworks_compatible(self, frameworks) - return self.items_in_list(frameworks, items) + return util.items_in_list(frameworks, items) def get_include_dirs(self): include_dirs = LibBuilderBase.get_include_dirs(self) diff --git a/platformio/commands/lib.py b/platformio/commands/lib.py index 051720c6..6a1f90d0 100644 --- a/platformio/commands/lib.py +++ b/platformio/commands/lib.py @@ -23,8 +23,7 @@ import arrow import click from platformio import exception, util -from platformio.managers.lib import LibraryManager -from platformio.managers.platform import PlatformFactory, PlatformManager +from platformio.managers.lib import LibraryManager, get_builtin_libs from platformio.util import get_api_result @@ -99,7 +98,7 @@ def cli(ctx, **options): help="Reinstall/redownload library if exists") @click.pass_obj def lib_install(lm, libraries, silent, interactive, force): - # @TODO "save" option + # @TODO: "save" option for library in libraries: lm.install( library, silent=silent, interactive=interactive, force=force) @@ -280,25 +279,6 @@ def lib_list(lm, json_output): return True -@util.memoized -def get_builtin_libs(storage_names=None): - items = [] - storage_names = storage_names or [] - pm = PlatformManager() - for manifest in pm.get_installed(): - p = PlatformFactory.newPlatform(manifest['__pkg_dir']) - for storage in p.get_lib_storages(): - if storage_names and storage['name'] not in storage_names: - continue - lm = LibraryManager(storage['path']) - items.append({ - "name": storage['name'], - "path": storage['path'], - "items": lm.get_installed() - }) - return items - - @cli.command("builtin", short_help="List built-in libraries") @click.option("--storage", multiple=True) @click.option("--json-output", is_flag=True) @@ -326,8 +306,13 @@ def lib_builtin(storage, json_output): def lib_show(library, json_output): lm = LibraryManager() name, requirements, _ = lm.parse_pkg_uri(library) - lib_id = lm.get_pkg_id_by_name( - name, requirements, silent=json_output, interactive=not json_output) + lib_id = lm.search_lib_id( + { + "name": name, + "requirements": requirements + }, + silent=json_output, + interactive=not json_output) lib = get_api_result("/lib/info/%d" % lib_id, cache_valid="1d") if json_output: return click.echo(json.dumps(lib)) diff --git a/platformio/commands/run.py b/platformio/commands/run.py index beba742e..f75a07c9 100644 --- a/platformio/commands/run.py +++ b/platformio/commands/run.py @@ -23,10 +23,9 @@ import click from platformio import __version__, exception, telemetry, util from platformio.commands.device import device_monitor as cmd_device_monitor from platformio.commands.lib import lib_install as cmd_lib_install -from platformio.commands.lib import get_builtin_libs from platformio.commands.platform import \ platform_install as cmd_platform_install -from platformio.managers.lib import LibraryManager +from platformio.managers.lib import LibraryManager, is_builtin_lib from platformio.managers.platform import PlatformFactory # pylint: disable=too-many-arguments,too-many-locals,too-many-branches @@ -309,15 +308,10 @@ def _autoinstall_libdeps(ctx, libraries, verbose=False): try: ctx.invoke(cmd_lib_install, libraries=[lib], silent=not verbose) except exception.LibNotFound as e: - if not _is_builtin_lib(lib): + if verbose or not is_builtin_lib(lib): click.secho("Warning! %s" % e, fg="yellow") - - -def _is_builtin_lib(lib_name): - for storage in get_builtin_libs(): - if any([l.get("name") == lib_name for l in storage['items']]): - return True - return False + except exception.InternetIsOffline as e: + click.secho(str(e), fg="yellow") def _clean_build_dir(build_dir): diff --git a/platformio/managers/lib.py b/platformio/managers/lib.py index ef00787b..c4159d08 100644 --- a/platformio/managers/lib.py +++ b/platformio/managers/lib.py @@ -13,6 +13,7 @@ # limitations under the License. # pylint: disable=too-many-arguments, too-many-locals, too-many-branches +# pylint: disable=too-many-return-statements import json import re @@ -24,6 +25,7 @@ import click from platformio import app, commands, exception, util from platformio.managers.package import BasePkgManager +from platformio.managers.platform import PlatformFactory, PlatformManager class LibraryManager(BasePkgManager): @@ -186,29 +188,15 @@ class LibraryManager(BasePkgManager): def get_latest_repo_version(self, name, requirements, silent=False): item = self.max_satisfying_repo_version( util.get_api_result( - "/lib/info/%d" % self.get_pkg_id_by_name( - name, requirements, silent=silent), + "/lib/info/%d" % self.search_lib_id( + { + "name": name, + "requirements": requirements + }, + silent=silent), cache_valid="1h")['versions'], requirements) return item['name'] if item else None - def get_pkg_id_by_name(self, - name, - requirements, - silent=False, - interactive=False): - if name.startswith("id="): - return int(name[3:]) - # try to find ID from installed packages - package_dir = self.get_package_dir(name, requirements) - if package_dir: - manifest = self.load_manifest(package_dir) - if "id" in manifest: - return int(manifest['id']) - return int( - self.search_for_library({ - "name": name - }, silent, interactive)['id']) - def _install_from_piorepo(self, name, requirements): assert name.startswith("id="), name version = self.get_latest_repo_version(name, requirements) @@ -225,88 +213,20 @@ class LibraryManager(BasePkgManager): "http://", "https://") if app.get_setting("enable_ssl") else dl_data['url'], requirements) - def install( # pylint: disable=arguments-differ + def search_lib_id( # pylint: disable=too-many-branches self, - name, - requirements=None, - silent=False, - trigger_event=True, - interactive=False, - force=False): - pkg_dir = None - try: - _name, _requirements, _url = self.parse_pkg_uri(name, requirements) - if not _url: - name = "id=%d" % self.get_pkg_id_by_name( - _name, - _requirements, - silent=silent, - interactive=interactive) - requirements = _requirements - pkg_dir = BasePkgManager.install( - self, - name, - requirements, - silent=silent, - trigger_event=trigger_event, - force=force) - except exception.InternetIsOffline as e: - if not silent: - click.secho(str(e), fg="yellow") - return None - - if not pkg_dir: - return None - - manifest = self.load_manifest(pkg_dir) - if "dependencies" not in manifest: - return pkg_dir - - if not silent: - click.secho("Installing dependencies", fg="yellow") - - for filters in self.normalize_dependencies(manifest['dependencies']): - assert "name" in filters - if any([s in filters.get("version", "") for s in ("\\", "/")]): - self.install( - "{name}={version}".format(**filters), - silent=silent, - trigger_event=trigger_event, - interactive=interactive, - force=force) - else: - try: - lib_info = self.search_for_library(filters, silent, - interactive) - except exception.LibNotFound as e: - if not silent: - click.secho("Warning! %s" % e, fg="yellow") - continue - - if filters.get("version"): - self.install( - lib_info['id'], - filters.get("version"), - silent=silent, - trigger_event=trigger_event, - interactive=interactive, - force=force) - else: - self.install( - lib_info['id'], - silent=silent, - trigger_event=trigger_event, - interactive=interactive, - force=force) - return pkg_dir - - @staticmethod - def search_for_library( # pylint: disable=too-many-branches filters, silent=False, interactive=False): assert isinstance(filters, dict) assert "name" in filters + + # try to find ID within installed packages + lib_id = self._get_lib_id_from_installed(filters) + if lib_id: + return lib_id + + # looking in PIO Library Registry if not silent: click.echo("Looking for %s library in registry" % click.style( filters['name'], fg="cyan")) @@ -366,4 +286,141 @@ class LibraryManager(BasePkgManager): "http://platformio.org/lib/show/{id}/{name}".format( **lib_info), fg="blue")) - return lib_info + return int(lib_info['id']) + + def _get_lib_id_from_installed(self, filters): + if filters['name'].startswith("id="): + return int(filters['name'][3:]) + package_dir = self.get_package_dir(filters['name'], + filters.get("requirements", + filters.get("version"))) + if not package_dir: + return None + manifest = self.load_manifest(package_dir) + if "id" not in manifest: + return None + + for key in ("frameworks", "platforms"): + if key not in filters: + continue + if key not in manifest: + return None + if not util.items_in_list( + util.items_to_list(filters[key]), + util.items_to_list(manifest[key])): + return None + + if "authors" in filters: + if "authors" not in manifest: + return None + manifest_authors = manifest['authors'] + if not isinstance(manifest_authors, list): + manifest_authors = [manifest_authors] + manifest_authors = [ + a['name'] for a in manifest_authors + if isinstance(a, dict) and "name" in a + ] + filter_authors = filters['authors'] + if not isinstance(filter_authors, list): + filter_authors = [filter_authors] + if not set(filter_authors) <= set(manifest_authors): + return None + + return int(manifest['id']) + + def install( # pylint: disable=arguments-differ + self, + name, + requirements=None, + silent=False, + trigger_event=True, + interactive=False, + force=False): + _name, _requirements, _url = self.parse_pkg_uri(name, requirements) + if not _url: + name = "id=%d" % self.search_lib_id( + { + "name": _name, + "requirements": _requirements + }, + silent=silent, + interactive=interactive) + requirements = _requirements + pkg_dir = BasePkgManager.install( + self, + name, + requirements, + silent=silent, + trigger_event=trigger_event, + force=force) + + if not pkg_dir: + return None + + manifest = self.load_manifest(pkg_dir) + if "dependencies" not in manifest: + return pkg_dir + + if not silent: + click.secho("Installing dependencies", fg="yellow") + + for filters in self.normalize_dependencies(manifest['dependencies']): + assert "name" in filters + if any([s in filters.get("version", "") for s in ("\\", "/")]): + self.install( + "{name}={version}".format(**filters), + silent=silent, + trigger_event=trigger_event, + interactive=interactive, + force=force) + else: + try: + lib_id = self.search_lib_id(filters, silent, interactive) + except exception.LibNotFound as e: + if not silent or is_builtin_lib(filters['name']): + click.secho("Warning! %s" % e, fg="yellow") + continue + + if filters.get("version"): + self.install( + lib_id, + filters.get("version"), + silent=silent, + trigger_event=trigger_event, + interactive=interactive, + force=force) + else: + self.install( + lib_id, + silent=silent, + trigger_event=trigger_event, + interactive=interactive, + force=force) + return pkg_dir + + +@util.memoized +def get_builtin_libs(storage_names=None): + items = [] + storage_names = storage_names or [] + pm = PlatformManager() + for manifest in pm.get_installed(): + p = PlatformFactory.newPlatform(manifest['__pkg_dir']) + for storage in p.get_lib_storages(): + if storage_names and storage['name'] not in storage_names: + continue + lm = LibraryManager(storage['path']) + items.append({ + "name": storage['name'], + "path": storage['path'], + "items": lm.get_installed() + }) + return items + + +@util.memoized +def is_builtin_lib(name): + for storage in get_builtin_libs(): + if any([l.get("name") == name for l in storage['items']]): + return True + return False diff --git a/platformio/util.py b/platformio/util.py index 49fd1264..270952af 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -723,6 +723,20 @@ def pepver_to_semver(pepver): return re.sub(r"(\.\d+)\.?(dev|a|b|rc|post)", r"\1-\2.", pepver, 1) +def items_to_list(items): + if not isinstance(items, list): + items = [i.strip() for i in items.split(",")] + return [i.lower() for i in items if i] + + +def items_in_list(needle, haystack): + needle = items_to_list(needle) + haystack = items_to_list(haystack) + if "*" in needle or "*" in haystack: + return True + return set(needle) & set(haystack) + + def rmtree_(path): def _onerror(_, name, __): diff --git a/tests/conftest.py b/tests/conftest.py index 2ed8b41e..5b8103c9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,6 +13,7 @@ # limitations under the License. import os + import pytest from click.testing import CliRunner From 6380d6c3eac8c145b2bc8f540e306d0033045e2b Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 13 Jan 2018 19:44:55 +0200 Subject: [PATCH 38/49] Bump version to 3.5.1a6 --- platformio/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index e56cfd25..ae9a8f88 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 5, "1a5") +VERSION = (3, 5, "1a6") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" From 06a6822173450c4e10c75fe50f019cf389ff2b8d Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 13 Jan 2018 19:45:54 +0200 Subject: [PATCH 39/49] Minor fix to history --- HISTORY.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index d34f9974..db2f72fe 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -15,7 +15,7 @@ PlatformIO 3.0 * Renamed ``envs_dir`` option to ``build_dir`` in `Project Configuration File "platformio.ini" `__ * Improved support of PIO Unified Debugger for Eclipse Oxygen -* Improved work in off-line mode +* Improved a work in off-line mode * Fixed project generator for CLion IDE * Fixed PIO Unified Debugger for mbed framework * Fixed library updates when a version is declared in VCS format (not SemVer) From affd53eb27797d7af6b4ac1d2a5577bdd5068106 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Mon, 15 Jan 2018 23:02:40 +0200 Subject: [PATCH 40/49] Use "python_requires" for setuptools and depend on Python 2.7+ <3 --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index df14dd1d..3fcdc806 100644 --- a/setup.py +++ b/setup.py @@ -37,6 +37,7 @@ setup( author_email=__email__, url=__url__, license=__license__, + python_requires='>=2.7, <3', install_requires=install_requires, packages=find_packages(), package_data={ From 3289b36450b9bc8f90b6f6d5da7ecfe69fc084b4 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 16 Jan 2018 00:06:24 +0200 Subject: [PATCH 41/49] Refactore code without "arrow" dependency (resolve issue with "ImportError: No module named backports.functools_lru_cache") --- .isort.cfg | 2 +- HISTORY.rst | 1 + docs | 2 +- platformio/builder/tools/piolib.py | 11 +++++------ platformio/commands/lib.py | 18 ++++++------------ platformio/managers/lib.py | 6 +++--- setup.py | 2 +- tests/commands/test_lib.py | 16 +++++++--------- 8 files changed, 25 insertions(+), 33 deletions(-) diff --git a/.isort.cfg b/.isort.cfg index d63487e9..d094cc19 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -1,3 +1,3 @@ [settings] line_length=79 -known_third_party=arrow,bottle,click,lockfile,pytest,requests,SCons,semantic_version,serial +known_third_party=bottle,click,lockfile,python-dateutil,pytest,requests,SCons,semantic_version,serial diff --git a/HISTORY.rst b/HISTORY.rst index db2f72fe..3e79b6e9 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -14,6 +14,7 @@ PlatformIO 3.0 * Configure a custom firmware/program name in build directory (`example `__) * Renamed ``envs_dir`` option to ``build_dir`` in `Project Configuration File "platformio.ini" `__ +* Refactored code without "arrow" dependency (resolve issue with "ImportError: No module named backports.functools_lru_cache") * Improved support of PIO Unified Debugger for Eclipse Oxygen * Improved a work in off-line mode * Fixed project generator for CLion IDE diff --git a/docs b/docs index 1d05a91d..8ad4e900 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 1d05a91d458f1572e9324982f7bd44557ceb8af9 +Subproject commit 8ad4e900ea212b98ad84f86031b5e478a6ce6fa6 diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index eb21d6c2..e290c551 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -291,9 +291,8 @@ class LibBuilderBase(object): def get_search_files(self): items = [ - join(self.src_dir, item) - for item in self.env.MatchSourceFiles(self.src_dir, - self.src_filter) + join(self.src_dir, item) for item in self.env.MatchSourceFiles( + self.src_dir, self.src_filter) ] include_dir = self.include_dir if include_dir: @@ -644,9 +643,9 @@ class ProjectAsLibBuilder(LibBuilderBase): # test files if "__test" in COMMAND_LINE_TARGETS: items.extend([ - join("$PROJECTTEST_DIR", item) - for item in self.env.MatchSourceFiles("$PROJECTTEST_DIR", - "$PIOTEST_SRC_FILTER") + join("$PROJECTTEST_DIR", + item) for item in self.env.MatchSourceFiles( + "$PROJECTTEST_DIR", "$PIOTEST_SRC_FILTER") ]) return items diff --git a/platformio/commands/lib.py b/platformio/commands/lib.py index 6a1f90d0..5f6e2271 100644 --- a/platformio/commands/lib.py +++ b/platformio/commands/lib.py @@ -19,7 +19,6 @@ from os.path import isdir, join from time import sleep from urllib import quote -import arrow import click from platformio import exception, util @@ -323,9 +322,7 @@ def lib_show(library, json_output): click.echo(lib['description']) click.echo() - click.echo("Version: %s, released %s" % - (lib['version']['name'], - arrow.get(lib['version']['released']).humanize())) + click.echo("Version: {name}, released {released}".format(**lib['version'])) click.echo("Manifest: %s" % lib['confurl']) for key in ("homepage", "repository", "license"): if key not in lib or not lib[key]: @@ -360,11 +357,10 @@ def lib_show(library, json_output): blocks.append(("Compatible %s" % key, [i['title'] for i in lib[key]])) blocks.append(("Headers", lib['headers'])) blocks.append(("Examples", lib['examples'])) - blocks.append(("Versions", [ - "%s, released %s" % (v['name'], arrow.get(v['released']).humanize()) - for v in lib['versions'] - ])) - blocks.append(("Unique Downloads", [ + blocks.append( + ("Versions", + ["{name}, released {released}".format(**v) for v in lib['versions']])) + blocks.append(("Downloads", [ "Today: %s" % lib['dlstats']['day'], "Week: %s" % lib['dlstats']['week'], "Month: %s" % lib['dlstats']['month'] @@ -423,9 +419,7 @@ def lib_stats(json_output): click.echo((printitemdate_tpl if "date" in item else printitem_tpl).format( name=click.style(item['name'], fg="cyan"), - date=str( - arrow.get(item['date']).humanize() - if "date" in item else ""), + date=item.get("date"), url=click.style( "http://platformio.org/lib/show/%s/%s" % (item['id'], quote(item['name'])), diff --git a/platformio/managers/lib.py b/platformio/managers/lib.py index c4159d08..f822fab9 100644 --- a/platformio/managers/lib.py +++ b/platformio/managers/lib.py @@ -20,8 +20,8 @@ import re from glob import glob from os.path import isdir, join -import arrow import click +from dateutil.parser import parse as parse_date from platformio import app, commands, exception, util from platformio.managers.package import BasePkgManager @@ -157,8 +157,8 @@ class LibraryManager(BasePkgManager): def max_satisfying_repo_version(self, versions, requirements=None): def _cmp_dates(datestr1, datestr2): - date1 = arrow.get(datestr1) - date2 = arrow.get(datestr2) + date1 = parse_date(datestr1) + date2 = parse_date(datestr2) if date1 == date2: return 0 return -1 if date1 < date2 else 1 diff --git a/setup.py b/setup.py index 3fcdc806..63df8dc9 100644 --- a/setup.py +++ b/setup.py @@ -18,11 +18,11 @@ from platformio import (__author__, __description__, __email__, __license__, __title__, __url__, __version__) install_requires = [ - "arrow>=0.10.0,!=0.11.0", "bottle<0.13", "click>=5,<6", "colorama", "lockfile>=0.9.1,<0.13", + "python-dateutil", "pyserial>=3,<4,!=3.3", "requests>=2.4.0,<3", "semantic_version>=2.5.0,<3" diff --git a/tests/commands/test_lib.py b/tests/commands/test_lib.py index ed085dea..8513d401 100644 --- a/tests/commands/test_lib.py +++ b/tests/commands/test_lib.py @@ -141,8 +141,7 @@ def test_global_lib_list(clirunner, validate_cliresult): result = clirunner.invoke(cmd_lib, ["-g", "list"]) validate_cliresult(result) assert all([ - n in result.output - for n in + n in result.output for n in ("Source: https://github.com/adafruit/Adafruit-ST7735-Library/archive/master.zip", "Version: 5.10.1", "Source: git+https://github.com/gioblu/PJON.git#3.0", @@ -151,8 +150,7 @@ def test_global_lib_list(clirunner, validate_cliresult): result = clirunner.invoke(cmd_lib, ["-g", "list", "--json-output"]) assert all([ - n in result.output - for n in + n in result.output for n in ("__pkg_dir", '"__src_url": "git+https://gitlab.com/ivankravets/rs485-nodeproto.git"', '"version": "5.10.1"') @@ -172,10 +170,10 @@ def test_global_lib_list(clirunner, validate_cliresult): for item in json.loads(result.output) ] versions2 = [ - 'ArduinoJson@5c33fd4', 'ArduinoJson@5.8.2', 'ArduinoJson@5.10.1', - 'AsyncMqttClient@0.8.2', 'AsyncTCP@1.0.1', 'ESPAsyncTCP@1.1.3', - 'NeoPixelBus@2.2.4', 'PJON@07fe9aa', 'PJON@1fb26fd', - 'PubSubClient@bef5814', 'RFcontrol@77d4eb3f8a', 'RadioHead-1.62@0.0.0' + 'ArduinoJson@5.8.2', 'ArduinoJson@5.10.1', 'AsyncMqttClient@0.8.2', + 'AsyncTCP@1.0.1', 'ESPAsyncTCP@1.1.3', 'NeoPixelBus@2.2.4', + 'PJON@07fe9aa', 'PJON@1fb26fd', 'PubSubClient@bef5814', + 'RFcontrol@77d4eb3f8a', 'RadioHead-1.62@0.0.0' ] assert set(versions1) >= set(versions2) @@ -272,7 +270,7 @@ def test_lib_stats(clirunner, validate_cliresult): validate_cliresult(result) assert all([ s in result.output - for s in ("UPDATED", "ago", "http://platformio.org/lib/show") + for s in ("UPDATED", "POPULAR", "http://platformio.org/lib/show") ]) result = clirunner.invoke(cmd_lib, ["stats", "--json-output"]) From d822334fddffabd81fb3b4b7670519c7bac31c74 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 16 Jan 2018 00:57:06 +0200 Subject: [PATCH 42/49] Drop "python-dateutil" dependency, implement light-weight "parse_date" --- platformio/commands/lib.py | 23 +++++++++++++++-------- platformio/managers/lib.py | 5 ++--- platformio/util.py | 18 ++++++++++++------ setup.py | 1 - 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/platformio/commands/lib.py b/platformio/commands/lib.py index 5f6e2271..87f87d7c 100644 --- a/platformio/commands/lib.py +++ b/platformio/commands/lib.py @@ -15,8 +15,8 @@ # pylint: disable=too-many-branches, too-many-locals import json +import time from os.path import isdir, join -from time import sleep from urllib import quote import click @@ -250,7 +250,7 @@ def lib_search(query, json_output, page, noninteractive, **filters): result['perpage'], fg="yellow") click.echo() - sleep(5) + time.sleep(5) elif not click.confirm("Show next libraries?"): break result = get_api_result( @@ -322,7 +322,10 @@ def lib_show(library, json_output): click.echo(lib['description']) click.echo() - click.echo("Version: {name}, released {released}".format(**lib['version'])) + click.echo( + "Version: %s, released %s" % + (lib['version']['name'], + time.strftime("%c", util.parse_date(lib['version']['released'])))) click.echo("Manifest: %s" % lib['confurl']) for key in ("homepage", "repository", "license"): if key not in lib or not lib[key]: @@ -357,10 +360,12 @@ def lib_show(library, json_output): blocks.append(("Compatible %s" % key, [i['title'] for i in lib[key]])) blocks.append(("Headers", lib['headers'])) blocks.append(("Examples", lib['examples'])) - blocks.append( - ("Versions", - ["{name}, released {released}".format(**v) for v in lib['versions']])) - blocks.append(("Downloads", [ + blocks.append(("Versions", [ + "%s, released %s" % + (v['name'], time.strftime("%c", util.parse_date(v['released']))) + for v in lib['versions'] + ])) + blocks.append(("Unique Downloads", [ "Today: %s" % lib['dlstats']['day'], "Week: %s" % lib['dlstats']['week'], "Month: %s" % lib['dlstats']['month'] @@ -419,7 +424,9 @@ def lib_stats(json_output): click.echo((printitemdate_tpl if "date" in item else printitem_tpl).format( name=click.style(item['name'], fg="cyan"), - date=item.get("date"), + date=str( + time.strftime("%c", util.parse_date(item['date'])) + if "date" in item else ""), url=click.style( "http://platformio.org/lib/show/%s/%s" % (item['id'], quote(item['name'])), diff --git a/platformio/managers/lib.py b/platformio/managers/lib.py index f822fab9..09c5ef12 100644 --- a/platformio/managers/lib.py +++ b/platformio/managers/lib.py @@ -21,7 +21,6 @@ from glob import glob from os.path import isdir, join import click -from dateutil.parser import parse as parse_date from platformio import app, commands, exception, util from platformio.managers.package import BasePkgManager @@ -157,8 +156,8 @@ class LibraryManager(BasePkgManager): def max_satisfying_repo_version(self, versions, requirements=None): def _cmp_dates(datestr1, datestr2): - date1 = parse_date(datestr1) - date2 = parse_date(datestr2) + date1 = util.parse_date(datestr1) + date2 = util.parse_date(datestr2) if date1 == date2: return 0 return -1 if date1 < date2 else 1 diff --git a/platformio/util.py b/platformio/util.py index 270952af..53c23918 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -22,13 +22,13 @@ import socket import stat import subprocess import sys +import time from functools import wraps from glob import glob from os.path import (abspath, basename, dirname, expanduser, isdir, isfile, join, normpath, splitdrive) from shutil import rmtree from threading import Thread -from time import sleep, time import click import requests @@ -159,10 +159,10 @@ class throttle(object): @wraps(fn) def wrapper(*args, **kwargs): - diff = int(round((time() - self.last) * 1000)) + diff = int(round((time.time() - self.last) * 1000)) if diff < self.threshhold: - sleep((self.threshhold - diff) * 0.001) - self.last = time() + time.sleep((self.threshhold - diff) * 0.001) + self.last = time.time() return fn(*args, **kwargs) return wrapper @@ -541,7 +541,7 @@ def get_mdns_services(): items = [] with mDNSListener() as mdns: - sleep(3) + time.sleep(3) for service in mdns.get_services(): items.append({ "type": @@ -651,7 +651,7 @@ def get_api_result(url, params=None, data=None, auth=None, cache_valid=None): "[API] ConnectionError: {0} (incremented retry: max={1}, " "total={2})".format(e, max_retries, total), fg="yellow") - sleep(2 * total) + time.sleep(2 * total) raise exception.APIRequestError( "Could not connect to PlatformIO API Service. " @@ -737,6 +737,12 @@ def items_in_list(needle, haystack): return set(needle) & set(haystack) +def parse_date(datestr): + if "T" in datestr and "Z" in datestr: + return time.strptime(datestr, "%Y-%m-%dT%H:%M:%SZ") + return time.strptime(datestr) + + def rmtree_(path): def _onerror(_, name, __): diff --git a/setup.py b/setup.py index 63df8dc9..b4b8b1aa 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,6 @@ install_requires = [ "click>=5,<6", "colorama", "lockfile>=0.9.1,<0.13", - "python-dateutil", "pyserial>=3,<4,!=3.3", "requests>=2.4.0,<3", "semantic_version>=2.5.0,<3" From 4b08dbd602915444c7f208ce58b82a85fe3c81ff Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Tue, 16 Jan 2018 13:40:59 +0200 Subject: [PATCH 43/49] Bump version to 3.5.1a7 --- platformio/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio/__init__.py b/platformio/__init__.py index ae9a8f88..7ca151fd 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (3, 5, "1a6") +VERSION = (3, 5, "1a7") __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" From cc646b19bf95b0228d94029f4232444744733954 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 17 Jan 2018 01:00:09 +0200 Subject: [PATCH 44/49] Extend example with a custom program name using extra scripting --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 8ad4e900..5e738969 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 8ad4e900ea212b98ad84f86031b5e478a6ce6fa6 +Subproject commit 5e738969e4b9f80df1d587b719c5b29d346927b4 From 23ecce297a86f90f85acab22c16feb017c6c4d02 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 17 Jan 2018 13:18:14 +0200 Subject: [PATCH 45/49] Update docs for custom slash size for ESP8266 --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 5e738969..61405e97 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 5e738969e4b9f80df1d587b719c5b29d346927b4 +Subproject commit 61405e97cd86083ee4d72ddd9aed61231ba58d38 From bc18941eb077b55827fc8b56aacfba4cc1b0e90c Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 18 Jan 2018 01:30:39 +0200 Subject: [PATCH 46/49] Fix project generator for Qt Creator IDE // Resolve #1299 Resolve #1290 --- HISTORY.rst | 3 ++- docs | 2 +- platformio/ide/tpls/qtcreator/platformio.pro.tpl | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 3e79b6e9..0552f745 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -17,7 +17,8 @@ PlatformIO 3.0 * Refactored code without "arrow" dependency (resolve issue with "ImportError: No module named backports.functools_lru_cache") * Improved support of PIO Unified Debugger for Eclipse Oxygen * Improved a work in off-line mode -* Fixed project generator for CLion IDE +* Fixed project generator for CLion and Qt Creator IDE + (`issue #1299 `_) * Fixed PIO Unified Debugger for mbed framework * Fixed library updates when a version is declared in VCS format (not SemVer) diff --git a/docs b/docs index 61405e97..776ccf73 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 61405e97cd86083ee4d72ddd9aed61231ba58d38 +Subproject commit 776ccf73d030cb5e9c253ce067637b7b29a6ac99 diff --git a/platformio/ide/tpls/qtcreator/platformio.pro.tpl b/platformio/ide/tpls/qtcreator/platformio.pro.tpl index 2ae9d49d..1ef5f8eb 100644 --- a/platformio/ide/tpls/qtcreator/platformio.pro.tpl +++ b/platformio/ide/tpls/qtcreator/platformio.pro.tpl @@ -14,7 +14,7 @@ INCLUDEPATH += "{{include}}" % end % for define in defines: -DEFINES += "{{define}}" +DEFINES += {{!define}} % end OTHER_FILES += platformio.ini From 2c79de971ea10e69975b58b9cee9e54dd6ae5db1 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 18 Jan 2018 14:49:01 +0200 Subject: [PATCH 47/49] Show full library version in "Library Dependency Graph" including VCS information // Issue #1274 --- HISTORY.rst | 6 +++++- platformio/builder/tools/piolib.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/HISTORY.rst b/HISTORY.rst index 0552f745..92bc0277 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -11,10 +11,14 @@ PlatformIO 3.0 `PIO Unit Testing `__ engine and a target device (`issue #1273 `_) +* Show full library version in "Library Dependency Graph" including VCS + information + (`issue #1274 `_) * Configure a custom firmware/program name in build directory (`example `__) * Renamed ``envs_dir`` option to ``build_dir`` in `Project Configuration File "platformio.ini" `__ -* Refactored code without "arrow" dependency (resolve issue with "ImportError: No module named backports.functools_lru_cache") +* Refactored code without "arrow" dependency (resolve issue with "ImportError: + No module named backports.functools_lru_cache") * Improved support of PIO Unified Debugger for Eclipse Oxygen * Improved a work in off-line mode * Fixed project generator for CLion and Qt Creator IDE diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index e290c551..f20b6b08 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -20,6 +20,7 @@ from __future__ import absolute_import import hashlib import os import sys +from glob import glob from os.path import (basename, commonprefix, dirname, isdir, isfile, join, realpath, sep) from platform import system @@ -30,6 +31,7 @@ from SCons.Script import ARGUMENTS, COMMAND_LINE_TARGETS, DefaultEnvironment from platformio import util from platformio.builder.tools import platformio as piotool from platformio.managers.lib import LibraryManager +from platformio.managers.package import PackageManager class LibBuilderFactory(object): @@ -131,6 +133,13 @@ class LibBuilderBase(object): def version(self): return self._manifest.get("version") + @property + def vcs_info(self): + items = glob(join(self.path, ".*", PackageManager.SRC_MANIFEST_NAME)) + if not items: + return None + return util.load_json(items[0]) + @property def dependencies(self): return LibraryManager.normalize_dependencies( @@ -791,10 +800,15 @@ def BuildProjectLibraries(env): margin = "| " * (level) for lb in root.depbuilders: title = "<%s>" % lb.name + vcs_info = lb.vcs_info if lb.version: title += " v%s" % lb.version + if vcs_info: + title += " #%s" % vcs_info.get("version") sys.stdout.write("%s|-- %s" % (margin, title)) if int(ARGUMENTS.get("PIOVERBOSE", 0)): + if vcs_info: + sys.stdout.write(" [%s]" % vcs_info.get("url")) sys.stdout.write(" (") sys.stdout.write(lb.path) sys.stdout.write(")") From 93d4e68378dd695ad5a41c6c1cef8fa61f86c133 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 18 Jan 2018 15:04:15 +0200 Subject: [PATCH 48/49] Bump docs to 3.5.1 --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 776ccf73..2e04299a 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 776ccf73d030cb5e9c253ce067637b7b29a6ac99 +Subproject commit 2e04299a170b3654d9f4ec3c78392fb9202e829b From 9b9b05439bf8afbbe278e98453dd96f5f085b383 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 18 Jan 2018 15:11:38 +0200 Subject: [PATCH 49/49] Bump version to 3.5.1 (issue #1273 issue #1280 issue #1286 issue #1247 issue #1284 issue #1299 issue #1290) --- HISTORY.rst | 2 +- platformio/__init__.py | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/HISTORY.rst b/HISTORY.rst index 92bc0277..c9416975 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -4,7 +4,7 @@ Release Notes PlatformIO 3.0 -------------- -3.5.1 (2018-??-??) +3.5.1 (2018-01-18) ~~~~~~~~~~~~~~~~~~ * New ``test_speed`` option to control a communication baudrate/speed between diff --git a/platformio/__init__.py b/platformio/__init__.py index 7ca151fd..db38e271 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,14 +14,16 @@ import sys -VERSION = (3, 5, "1a7") +VERSION = (3, 5, 1) __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" -__description__ = ("An open source ecosystem for IoT development. " - "Cross-platform build system and library manager. " - "Continuous and IDE integration. " - "Arduino, ESP8266 and ARM mbed compatible") +__description__ = ( + "An open source ecosystem for IoT development. " + "Cross-platform IDE and unified debugger. " + "Remote unit testing and firmware updates. " + "Arduino, ARM mbed, Espressif (ESP8266/ESP32), STM32, PIC32, nRF51/nRF52, " + "FPGA, CMSIS, SPL, AVR, Samsung ARTIK, libOpenCM3") __url__ = "http://platformio.org" __author__ = "Ivan Kravets"