From 8febdc19eac39cb501c76a4d9f81fb0606793769 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 3 Oct 2019 12:47:41 +0300 Subject: [PATCH] ManifestParser: normalize example names --- platformio/package/manifest/model.py | 2 +- platformio/package/manifest/parser.py | 12 ++++++++++-- tests/test_pkgmanifest.py | 26 ++++++++++++++++++-------- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/platformio/package/manifest/model.py b/platformio/package/manifest/model.py index 08e7001b..27684eb1 100644 --- a/platformio/package/manifest/model.py +++ b/platformio/package/manifest/model.py @@ -42,7 +42,7 @@ class ExportModel(DataModel): class ExampleModel(DataModel): - name = DataField(max_length=100, regex=r"^[a-zA-Z\d\-\_/\. ]+$", required=True) + name = DataField(max_length=100, regex=r"^[a-zA-Z\d\-\_/]+$", required=True) base = DataField(required=True) files = DataField(type=ListOfType(DataField())) diff --git a/platformio/package/manifest/parser.py b/platformio/package/manifest/parser.py index ad364963..799e1a58 100644 --- a/platformio/package/manifest/parser.py +++ b/platformio/package/manifest/parser.py @@ -208,12 +208,20 @@ class BaseManifestParser(object): if not matched_files: continue result[root] = dict( - name=os.path.relpath(root, examples_dir), + name="Examples" + if root == examples_dir + else os.path.relpath(root, examples_dir), base=os.path.relpath(root, package_dir), files=matched_files, ) - return list(result.values()) or None + result = list(result.values()) + + # normalize example names + for item in result: + item["name"] = re.sub(r"[^a-z\d\d\-\_/]+", "_", item["name"], flags=re.I) + + return result or None class LibraryJsonManifestParser(BaseManifestParser): diff --git a/tests/test_pkgmanifest.py b/tests/test_pkgmanifest.py index d5dabb91..0b2fa58d 100644 --- a/tests/test_pkgmanifest.py +++ b/tests/test_pkgmanifest.py @@ -438,8 +438,9 @@ def test_examples_from_dir(tmpdir_factory): pio_dir.mkdir("src").join("main.cpp").write("") # wiring examples - examples_dir.mkdir("SomeSketchIno").join("SomeSketchIno.ino").write("") - examples_dir.mkdir("SomeSketchPde").join("SomeSketchPde.pde").write("") + arduino_dir = examples_dir.mkdir("1. General") + arduino_dir.mkdir("SomeSketchIno").join("SomeSketchIno.ino").write("") + arduino_dir.mkdir("SomeSketchPde").join("SomeSketchPde.pde").write("") # custom examples demo_dir = examples_dir.mkdir("demo") @@ -455,6 +456,10 @@ def test_examples_from_dir(tmpdir_factory): pio_dir.mkdir("include").join("world.h").write("") pio_dir.mkdir("src").join("world.c").write("") + # example files in root + examples_dir.join("root.c").write("") + examples_dir.join("root.h").write("") + # invalid example examples_dir.mkdir("invalid-example").join("hello.json") @@ -462,7 +467,7 @@ def test_examples_from_dir(tmpdir_factory): data = parser.ManifestParserFactory.new_from_dir(str(package_dir)).as_dict() assert isinstance(data["examples"], list) - assert len(data["examples"]) == 5 + assert len(data["examples"]) == 6 def _sort_examples(items): for i, item in enumerate(items): @@ -471,7 +476,7 @@ def test_examples_from_dir(tmpdir_factory): data["examples"] = _sort_examples(data["examples"]) model = ManifestModel(**data) - assert model.examples[0].name == "PlatformIO/hello" + assert model.examples[3].name == "PlatformIO/hello" assert model == ManifestModel( **{ "version": "1.0.0", @@ -484,13 +489,13 @@ def test_examples_from_dir(tmpdir_factory): "files": ["platformio.ini", "include/main.h", "src/main.cpp"], }, { - "name": "SomeSketchIno", - "base": "examples/SomeSketchIno", + "name": "1_General/SomeSketchIno", + "base": "examples/1. General/SomeSketchIno", "files": ["SomeSketchIno.ino"], }, { - "name": "SomeSketchPde", - "base": "examples/SomeSketchPde", + "name": "1_General/SomeSketchPde", + "base": "examples/1. General/SomeSketchPde", "files": ["SomeSketchPde.pde"], }, { @@ -509,6 +514,11 @@ def test_examples_from_dir(tmpdir_factory): "extra.py", ], }, + { + "name": "Examples", + "base": "examples", + "files": ["root.c", "root.h"], + }, ] ), }