From 390f1935d682cd942c97f6d7211055987d7e983f Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 5 Feb 2020 15:43:39 +0200 Subject: [PATCH] Fix parsing dependency in a legacy format --- platformio/package/manifest/parser.py | 6 ++-- tests/package/test_manifest.py | 52 ++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/platformio/package/manifest/parser.py b/platformio/package/manifest/parser.py index 2391a84d..e32617fc 100644 --- a/platformio/package/manifest/parser.py +++ b/platformio/package/manifest/parser.py @@ -355,9 +355,11 @@ class LibraryJsonManifestParser(BaseManifestParser): @staticmethod def _parse_dependencies(raw): + # compatibility with legacy dependency format + if isinstance(raw, dict) and "name" in raw: + raw = [raw] + if isinstance(raw, dict): - if "name" in raw: # compatibility with dep as dict - return [raw] return [dict(name=name, version=version) for name, version in raw.items()] if isinstance(raw, list): for i, dependency in enumerate(raw): diff --git a/tests/package/test_manifest.py b/tests/package/test_manifest.py index 54b16c2f..22f9691d 100644 --- a/tests/package/test_manifest.py +++ b/tests/package/test_manifest.py @@ -87,21 +87,22 @@ def test_library_json_parser(): ] } """ - mp = parser.LibraryJsonManifestParser(contents) + raw_data = parser.LibraryJsonManifestParser(contents).as_dict() + raw_data["dependencies"] = sorted(raw_data["dependencies"], key=lambda a: a["name"]) assert not jsondiff.diff( - mp.as_dict(), + raw_data, { "keywords": ["sound", "audio", "music", "sd", "card", "playback"], "frameworks": ["arduino"], "export": {"exclude": ["audio_samples"]}, "platforms": ["atmelavr"], "dependencies": [ - {"name": "deps1", "version": "1.0.0"}, { "name": "@owner/deps2", "version": "1.0.0", "frameworks": ["arduino", "espidf"], }, + {"name": "deps1", "version": "1.0.0"}, { "name": "deps3", "version": "1.0.0", @@ -113,7 +114,7 @@ def test_library_json_parser(): # broken dependencies with pytest.raises(parser.ManifestParserError): - mp = parser.LibraryJsonManifestParser({"dependencies": ["deps1", "deps2"]}) + parser.LibraryJsonManifestParser({"dependencies": ["deps1", "deps2"]}) def test_module_json_parser(): @@ -172,9 +173,10 @@ sentence=This is Arduino library customField=Custom Value depends=First Library (=2.0.0), Second Library (>=1.2.0), Third """ - mp = parser.LibraryPropertiesManifestParser(contents) + raw_data = parser.LibraryPropertiesManifestParser(contents).as_dict() + raw_data["dependencies"] = sorted(raw_data["dependencies"], key=lambda a: a["name"]) assert not jsondiff.diff( - mp.as_dict(), + raw_data, { "name": "TestPackage", "version": "1.2.3", @@ -303,6 +305,7 @@ def test_library_json_schema(): raw_data = parser.ManifestParserFactory.new( contents, parser.ManifestFileType.LIBRARY_JSON ).as_dict() + raw_data["dependencies"] = sorted(raw_data["dependencies"], key=lambda a: a["name"]) data = ManifestSchema().load_manifest(raw_data) @@ -343,8 +346,8 @@ def test_library_json_schema(): }, ], "dependencies": [ - {"name": "deps1", "version": "1.0.0"}, {"name": "@owner/deps2", "version": "1.0.0", "frameworks": ["arduino"]}, + {"name": "deps1", "version": "1.0.0"}, { "name": "deps3", "version": "1.0.0", @@ -354,6 +357,36 @@ def test_library_json_schema(): }, ) + # legacy dependencies format + contents = """ +{ + "name": "DallasTemperature", + "version": "3.8.0", + "dependencies": + { + "name": "OneWire", + "authors": "Paul Stoffregen", + "frameworks": "arduino" + } +} +""" + raw_data = parser.LibraryJsonManifestParser(contents).as_dict() + data = ManifestSchema().load_manifest(raw_data) + assert not jsondiff.diff( + data, + { + "name": "DallasTemperature", + "version": "3.8.0", + "dependencies": [ + { + "name": "OneWire", + "authors": ["Paul Stoffregen"], + "frameworks": ["arduino"], + } + ], + }, + ) + def test_library_properties_schema(): contents = """ @@ -371,6 +404,7 @@ depends=First Library (=2.0.0), Second Library (>=1.2.0), Third raw_data = parser.ManifestParserFactory.new( contents, parser.ManifestFileType.LIBRARY_PROPERTIES ).as_dict() + raw_data["dependencies"] = sorted(raw_data["dependencies"], key=lambda a: a["name"]) data = ManifestSchema().load_manifest(raw_data) @@ -524,6 +558,8 @@ def test_platform_json_schema(): contents, parser.ManifestFileType.PLATFORM_JSON ).as_dict() raw_data["frameworks"] = sorted(raw_data["frameworks"]) + raw_data["dependencies"] = sorted(raw_data["dependencies"], key=lambda a: a["name"]) + data = ManifestSchema().load_manifest(raw_data) assert not jsondiff.diff( @@ -547,9 +583,9 @@ def test_platform_json_schema(): "frameworks": sorted(["arduino", "simba"]), "version": "1.15.0", "dependencies": [ - {"name": "toolchain-atmelavr", "version": "~1.50400.0"}, {"name": "framework-arduinoavr", "version": "~4.2.0"}, {"name": "tool-avrdude", "version": "~1.60300.0"}, + {"name": "toolchain-atmelavr", "version": "~1.50400.0"}, ], }, )