diff --git a/HISTORY.rst b/HISTORY.rst index 75db03f0..db6444eb 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -13,6 +13,15 @@ PlatformIO Core 6 **A professional collaborative platform for declarative, safety-critical, and test-driven embedded development.** +6.1.2 (2022-07-18) +~~~~~~~~~~~~~~~~~~ + +* Export a ``PIO_UNIT_TESTING`` macro to the project source files and dependent libraries in the |UNITTESTING| mode +* Improved detection of Windows architecture (`issue #4353 `_) +* Warn about unknown `device monitor filters `__ (`issue #4362 `_) +* Fixed a regression bug when `libArchive `__ option declared in the `library.json `__ manifest was ignored (`issue #4351 `_) +* Fixed an issue when the `pio pkg publish `__ command didn't work with Python 3.6 (`issue #4352 `_) + 6.1.1 (2022-07-11) ~~~~~~~~~~~~~~~~~~ diff --git a/docs b/docs index f4accb77..0a58185b 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit f4accb77c85da86b6bd60670f6e02719db22235c +Subproject commit 0a58185b4a983db4478cfba41307b02f22461543 diff --git a/platformio/__init__.py b/platformio/__init__.py index 0e360ce3..594635e6 100644 --- a/platformio/__init__.py +++ b/platformio/__init__.py @@ -14,7 +14,7 @@ import sys -VERSION = (6, 1, 1) +VERSION = (6, 1, 2) __version__ = ".".join([str(s) for s in VERSION]) __title__ = "platformio" diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index bd9e319a..d375347f 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -30,7 +30,7 @@ from SCons.Script import DefaultEnvironment # pylint: disable=import-error from platformio import exception, fs from platformio.builder.tools import platformio as piotool -from platformio.compat import IS_WINDOWS, MISSING, hashlib_encode_data, string_types +from platformio.compat import IS_WINDOWS, hashlib_encode_data, string_types from platformio.http import HTTPClientError, InternetIsOffline from platformio.package.exception import ( MissingPackageManifestError, @@ -145,6 +145,10 @@ class LibBuilderBase: self._circular_deps = [] self._processed_search_files = [] + # pass a macro to the projenv + libs + if "test" in env.GetBuildType(): + self.env.Append(CPPDEFINES=["PIO_UNIT_TESTING"]) + # reset source filter, could be overridden with extra script self.env["SRC_FILTER"] = "" @@ -576,10 +580,11 @@ class ArduinoLibBuilder(LibBuilderBase): # pylint: disable=no-member if not self._manifest.get("dependencies"): return LibBuilderBase.lib_ldf_mode.fget(self) + missing = object() global_value = self.env.GetProjectConfig().getraw( - "env:" + self.env["PIOENV"], "lib_ldf_mode", MISSING + "env:" + self.env["PIOENV"], "lib_ldf_mode", missing ) - if global_value != MISSING: + if global_value != missing: return LibBuilderBase.lib_ldf_mode.fget(self) # automatically enable C++ Preprocessing in runtime # (Arduino IDE has this behavior) @@ -831,10 +836,11 @@ class PlatformIOLibBuilder(LibBuilderBase): @property def lib_archive(self): + missing = object() global_value = self.env.GetProjectConfig().getraw( - "env:" + self.env["PIOENV"], "lib_archive", MISSING + "env:" + self.env["PIOENV"], "lib_archive", missing ) - if global_value != MISSING: + if global_value != missing: return self.env.GetProjectConfig().get( "env:" + self.env["PIOENV"], "lib_archive" ) diff --git a/platformio/builder/tools/piotest.py b/platformio/builder/tools/piotest.py index 08d475d2..07886efb 100644 --- a/platformio/builder/tools/piotest.py +++ b/platformio/builder/tools/piotest.py @@ -23,7 +23,7 @@ from platformio.test.runners.factory import TestRunnerFactory def ConfigureTestTarget(env): env.Append( - CPPDEFINES=["UNIT_TEST", "PIO_UNIT_TESTING"], + CPPDEFINES=["UNIT_TEST"], # deprecated, use PIO_UNIT_TESTING PIOTEST_SRC_FILTER=[f"+<*.{ext}>" for ext in piotool.SRC_BUILD_EXT], ) env.Prepend(CPPPATH=["$PROJECT_TEST_DIR"]) diff --git a/platformio/compat.py b/platformio/compat.py index 43eb98dd..cdce3939 100644 --- a/platformio/compat.py +++ b/platformio/compat.py @@ -41,6 +41,15 @@ def is_bytes(x): return isinstance(x, (bytes, memoryview, bytearray)) +def isascii(text): + if sys.version_info >= (3, 7): + return text.isascii() + for c in text or "": + if ord(c) > 127: + return False + return True + + def ci_strings_are_equal(a, b): if a == b: return True diff --git a/platformio/debug/config/base.py b/platformio/debug/config/base.py index 7e966cc5..a5867340 100644 --- a/platformio/debug/config/base.py +++ b/platformio/debug/config/base.py @@ -16,7 +16,7 @@ import json import os from platformio import fs, proc, util -from platformio.compat import MISSING, string_types +from platformio.compat import string_types from platformio.debug.exception import DebugInvalidOptionsError from platformio.project.config import ProjectConfig from platformio.project.helpers import load_build_metadata @@ -96,8 +96,9 @@ class DebugConfigBase: # pylint: disable=too-many-instance-attributes @property def init_break(self): - result = self.env_options.get("debug_init_break", MISSING) - if result != MISSING: + missed = object() + result = self.env_options.get("debug_init_break", missed) + if result != missed: return result result = None if not result: diff --git a/platformio/device/monitor/command.py b/platformio/device/monitor/command.py index 0a484eee..11a1afdf 100644 --- a/platformio/device/monitor/command.py +++ b/platformio/device/monitor/command.py @@ -20,7 +20,7 @@ import click from platformio import exception, fs from platformio.device.finder import find_serial_port from platformio.device.monitor.filters.base import register_filters -from platformio.device.monitor.terminal import start_terminal +from platformio.device.monitor.terminal import get_available_filters, start_terminal from platformio.platform.factory import PlatformFactory from platformio.project.config import ProjectConfig from platformio.project.exception import NotPlatformIOProjectError @@ -138,6 +138,17 @@ def device_monitor_cmd(**options): "--exit-char can not be the same as --menu-char" ) + # check for unknown filters + known_filters = set(get_available_filters()) + unknown_filters = set(options["filters"]) - known_filters + if unknown_filters: + options["filters"] = list(known_filters & set(options["filters"])) + click.secho( + ("Warning! Skipping unknown filters `%s`. Known filters are `%s`") + % (", ".join(unknown_filters), ", ".join(sorted(known_filters))), + fg="yellow", + ) + start_terminal(options) diff --git a/platformio/device/monitor/terminal.py b/platformio/device/monitor/terminal.py index 38c18390..bec825e9 100644 --- a/platformio/device/monitor/terminal.py +++ b/platformio/device/monitor/terminal.py @@ -41,6 +41,10 @@ class Terminal(miniterm.Miniterm): self.pio_unexpected_exception = exc +def get_available_filters(): + return sorted(miniterm.TRANSFORMATIONS.keys()) + + def start_terminal(options): retries = 0 is_port_valid = False @@ -116,7 +120,7 @@ def print_terminal_settings(terminal): ) click.echo( "--- Available filters and text transformations: %s" - % ", ".join(sorted(miniterm.TRANSFORMATIONS.keys())) + % ", ".join(get_available_filters()) ) click.echo("--- More details at https://bit.ly/pio-monitor-filters") click.echo( diff --git a/platformio/http.py b/platformio/http.py index ff88a85b..cf686070 100644 --- a/platformio/http.py +++ b/platformio/http.py @@ -13,7 +13,6 @@ # limitations under the License. import json -import math import os import socket from urllib.parse import urljoin @@ -63,9 +62,10 @@ class EndpointSessionIterator: endpoints = [endpoints] self.endpoints = endpoints self.endpoints_iter = iter(endpoints) + # https://urllib3.readthedocs.io/en/stable/reference/urllib3.util.html self.retry = Retry( - total=math.ceil(6 / len(self.endpoints)), - backoff_factor=1, + total=5, + backoff_factor=1, # [0, 2, 4, 8, 16] secs # method_whitelist=list(Retry.DEFAULT_METHOD_WHITELIST) + ["POST"], status_forcelist=[413, 429, 500, 502, 503, 504], ) @@ -129,10 +129,7 @@ class HTTPClient: while True: try: return getattr(self._session, method)(path, **kwargs) - except ( - requests.exceptions.ConnectionError, - requests.exceptions.Timeout, - ) as exc: + except requests.exceptions.RequestException as exc: try: self._next_session() except Exception as exc2: diff --git a/platformio/package/commands/publish.py b/platformio/package/commands/publish.py index 8d282fa0..58230eef 100644 --- a/platformio/package/commands/publish.py +++ b/platformio/package/commands/publish.py @@ -22,6 +22,7 @@ from tabulate import tabulate from platformio import fs from platformio.account.client import AccountClient +from platformio.compat import isascii from platformio.exception import UserSideException from platformio.package.manifest.parser import ManifestParserFactory from platformio.package.manifest.schema import ManifestSchema @@ -155,7 +156,7 @@ def package_publish_cmd( # pylint: disable=too-many-arguments, too-many-locals def check_archive_file_names(archive_path): with tarfile.open(archive_path, mode="r:gz") as tf: for name in tf.getnames(): - if not name.isascii(): + if not isascii(name) or not name.isprintable(): click.secho( f"Warning! The `{name}` file contains non-ASCII chars and can " "lead to the unpacking issues on a user machine", diff --git a/platformio/util.py b/platformio/util.py index f235c2ee..f6800b4f 100644 --- a/platformio/util.py +++ b/platformio/util.py @@ -139,11 +139,14 @@ def singleton(cls): def get_systype(): - type_ = platform.system().lower() + system = platform.system().lower() arch = platform.machine().lower() - if type_ == "windows" and "x86" in arch: - arch = "amd64" if "64" in arch else "x86" - return "%s_%s" % (type_, arch) if arch else type_ + if system == "windows": + if not arch: # issue #4353 + arch = "x86_" + platform.architecture()[0] + if "x86" in arch: + arch = "amd64" if "64" in arch else "x86" + return "%s_%s" % (system, arch) if arch else system def pioversion_to_intstr():