diff --git a/platformio/device/finder.py b/platformio/device/finder.py index fc6ad3c4..621adaec 100644 --- a/platformio/device/finder.py +++ b/platformio/device/finder.py @@ -163,7 +163,7 @@ class SerialPortFinder: for item in list_serial_ports(as_objects=True): if item.vid == device.vid and item.pid == device.pid: candidates.append(item) - if len(candidates) == 1: + if len(candidates) <= 1: return device.device for item in candidates: if ("GDB" if self.prefer_gdb_port else "UART") in item.description: diff --git a/platformio/exception.py b/platformio/exception.py index bf2cec8c..80ffb496 100644 --- a/platformio/exception.py +++ b/platformio/exception.py @@ -81,7 +81,7 @@ class InvalidSettingValue(UserSideException): MESSAGE = "Invalid value '{0}' for the setting '{1}'" -class InvalidJSONFile(PlatformioException): +class InvalidJSONFile(ValueError, UserSideException): MESSAGE = "Could not load broken JSON: {0}" diff --git a/platformio/http.py b/platformio/http.py index da6abb40..ee67b631 100644 --- a/platformio/http.py +++ b/platformio/http.py @@ -157,7 +157,10 @@ class HTTPClient: with ContentCache("http") as cc: result = cc.get(cache_key) if result is not None: - return json.loads(result) + try: + return json.loads(result) + except json.JSONDecodeError: + pass response = self.send_request(method, path, **kwargs) data = self._parse_json_response(response) cc.set(cache_key, response.text, cache_valid) diff --git a/platformio/package/lockfile.py b/platformio/package/lockfile.py index 3c6b2047..bc2a4347 100644 --- a/platformio/package/lockfile.py +++ b/platformio/package/lockfile.py @@ -15,7 +15,7 @@ import os from time import sleep, time -from platformio.exception import PlatformioException +from platformio.exception import UserSideException LOCKFILE_TIMEOUT = 3600 # in seconds, 1 hour LOCKFILE_DELAY = 0.2 @@ -36,11 +36,11 @@ except ImportError: LOCKFILE_CURRENT_INTERFACE = None -class LockFileExists(PlatformioException): +class LockFileExists(UserSideException): pass -class LockFileTimeoutError(PlatformioException): +class LockFileTimeoutError(UserSideException): pass diff --git a/platformio/package/manager/_registry.py b/platformio/package/manager/_registry.py index 494e2d24..4c339be8 100644 --- a/platformio/package/manager/_registry.py +++ b/platformio/package/manager/_registry.py @@ -25,12 +25,13 @@ from platformio.registry.mirror import RegistryFileMirrorIterator class PackageManagerRegistryMixin: def install_from_registry(self, spec, search_qualifiers=None): + package = version = None if spec.owner and spec.name and not search_qualifiers: package = self.fetch_registry_package(spec) if not package: raise UnknownPackageError(spec.humanize()) version = self.pick_best_registry_version(package["versions"], spec) - else: + elif spec.id or spec.name: packages = self.search_registry_packages(spec, search_qualifiers) if not packages: raise UnknownPackageError(spec.humanize()) diff --git a/platformio/platform/board.py b/platformio/platform/board.py index 4cd102d1..78d48943 100644 --- a/platformio/platform/board.py +++ b/platformio/platform/board.py @@ -17,7 +17,7 @@ import os from platformio import fs, util from platformio.compat import MISSING from platformio.debug.exception import DebugInvalidOptionsError, DebugSupportError -from platformio.exception import UserSideException +from platformio.exception import InvalidJSONFile, UserSideException from platformio.platform.exception import InvalidBoardManifest @@ -28,7 +28,7 @@ class PlatformBoardConfig: self.manifest_path = manifest_path try: self._manifest = fs.load_json(manifest_path) - except ValueError as exc: + except InvalidJSONFile as exc: raise InvalidBoardManifest(manifest_path) from exc if not set(["name", "url", "vendor"]) <= set(self._manifest): raise UserSideException(