From 9fa2bcc347ad7ce987f5fd9345011187915062d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Josefsen?= Date: Tue, 17 Sep 2024 12:33:26 +0200 Subject: [PATCH 1/7] Updated PICS Generator to match 1.4 PICS --- src/tools/PICS-generator/PICSGenerator.py | 55 +++++++++++++++-------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/src/tools/PICS-generator/PICSGenerator.py b/src/tools/PICS-generator/PICSGenerator.py index 4fd51033cc1eba..6e40ac19d0a03e 100644 --- a/src/tools/PICS-generator/PICSGenerator.py +++ b/src/tools/PICS-generator/PICSGenerator.py @@ -42,39 +42,54 @@ def GenerateDevicePicsXmlFiles(clusterName, clusterPicsCode, featurePicsList, at # Map clusters to common XML template if needed if "ICDManagement" == clusterName: - clusterName = "ICD Management" + picsFileName = "ICD Management" - elif "OTA Software Update Provider" in clusterName or "OTA Software Update Requestor" in clusterName: - clusterName = "OTA Software Update" + elif "OTA Software Update Provider" in clusterName or \ + "OTA Software Update Requestor" in clusterName: + picsFileName = "OTA Software Update" elif "On/Off" == clusterName: - clusterName = clusterName.replace("/", "-") + picsFileName = clusterName.replace("/", "-") elif "GroupKeyManagement" == clusterName: - clusterName = "Group Communication" - - elif "Wake On LAN" == clusterName or "Low Power" == clusterName: - clusterName = "Media Cluster" + picsFileName = "Group Communication" + + elif "Wake on LAN" == clusterName or \ + "Low Power" == clusterName or \ + "Keypad Input" == clusterName or \ + "Audio Output" == clusterName or \ + "Media Input" == clusterName or \ + "Target Navigator" == clusterName or \ + "Content Control" == clusterName or \ + "Channel" == clusterName or \ + "Media Playback" == clusterName or \ + "Account Login" == clusterName or \ + "Application Basic" == clusterName or \ + "Content Launcher" == clusterName or \ + "Content App Observer" == clusterName or \ + "Application Launcher" == clusterName: + + picsFileName = "Media Cluster" elif "Operational Credentials" == clusterName: - clusterName = "Node Operational Credentials" - - elif "Laundry Washer Controls" == clusterName: - clusterName = "Washer Controls" + picsFileName = "Node Operational Credentials" # Workaround for naming colisions with current logic elif "Thermostat" == clusterName: - clusterName = "Thermostat Cluster" + picsFileName = "Thermostat Cluster" elif "Boolean State" == clusterName: - clusterName = "Boolean State Cluster" + picsFileName = "Boolean State Cluster" + + elif "AccessControl" in clusterName: + picsFileName = "Access Control Cluster" - if "AccessControl" in clusterName: - clusterName = "Access Control cluster" + else: + picsFileName = clusterName # Determine if file has already been handled and use this file for outputFolderFileName in os.listdir(outputPathStr): - if clusterName in outputFolderFileName: + if picsFileName in outputFolderFileName: xmlPath = outputPathStr fileName = outputFolderFileName break @@ -82,7 +97,7 @@ def GenerateDevicePicsXmlFiles(clusterName, clusterPicsCode, featurePicsList, at # If no file is found in output folder, determine if there is a match for the cluster name in input folder if fileName == "": for file in xmlFileList: - if file.lower().startswith(clusterName.lower()): + if file.lower().startswith(picsFileName.lower()): fileName = file break else: @@ -421,9 +436,11 @@ def cleanDirectory(pathToClean): # Load PICS XML templates print("Capture list of PICS XML templates") xmlFileList = os.listdir(xmlTemplatePathStr) +for PICSXmlFile in xmlFileList: + print(f"{xmlTemplatePathStr}/{PICSXmlFile}") # Setup output path -print(outputPathStr) +print(f"Output path: {outputPathStr}") outputPath = pathlib.Path(outputPathStr) if not outputPath.exists(): From 293ea826f45362ca1d73b400252ae106b1504bd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Josefsen?= Date: Tue, 17 Sep 2024 12:33:49 +0200 Subject: [PATCH 2/7] Add script to validate PICS and cluster macthing --- src/tools/PICS-generator/XMLPICSValidator.py | 122 +++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/tools/PICS-generator/XMLPICSValidator.py diff --git a/src/tools/PICS-generator/XMLPICSValidator.py b/src/tools/PICS-generator/XMLPICSValidator.py new file mode 100644 index 00000000000000..0b03d513cde91d --- /dev/null +++ b/src/tools/PICS-generator/XMLPICSValidator.py @@ -0,0 +1,122 @@ +# +# Copyright (c) 2023 Project CHIP Authors +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import argparse +import os +import sys + +from rich.console import Console + +# Add the path to python_testing folder, in order to be able to import from matter_testing_support +sys.path.append(os.path.abspath(sys.path[0] + "/../../python_testing")) +from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main # noqa: E402 +from spec_parsing_support import build_xml_clusters # noqa: E402 + +console = None +xml_clusters = None + +parser = argparse.ArgumentParser() +parser.add_argument('--pics-template', required=True) +args, unknown = parser.parse_known_args() + +xmlTemplatePathStr = args.pics_template +if not xmlTemplatePathStr.endswith('/'): + xmlTemplatePathStr += '/' + +# Load PICS XML templates +print("Capture list of PICS XML templates") +xmlFileList = os.listdir(xmlTemplatePathStr) +for PICSXmlFile in xmlFileList: + print(f"{xmlTemplatePathStr}/{PICSXmlFile}") + + +class XMLPICSValidator(MatterBaseTest): + @async_test_body + async def test_xml_pics_validator(self): + + # Create console to print + global console + console = Console() + + global xml_clusters + xml_clusters, problems = build_xml_clusters() + + for cluster in xml_clusters: + + fileName = "" + clusterName = xml_clusters[cluster].name + + if "ICDManagement" == clusterName: + picsFileName = "ICD Management" + + elif "OTA Software Update Provider" in clusterName or \ + "OTA Software Update Requestor" in clusterName: + picsFileName = "OTA Software Update" + + elif "On/Off" == clusterName: + picsFileName = clusterName.replace("/", "-") + + elif "GroupKeyManagement" == clusterName: + picsFileName = "Group Communication" + + elif "Wake on LAN" == clusterName or \ + "Low Power" == clusterName or \ + "Keypad Input" == clusterName or \ + "Audio Output" == clusterName or \ + "Media Input" == clusterName or \ + "Target Navigator" == clusterName or \ + "Content Control" == clusterName or \ + "Channel" == clusterName or \ + "Media Playback" == clusterName or \ + "Account Login" == clusterName or \ + "Application Basic" == clusterName or \ + "Content Launcher" == clusterName or \ + "Content App Observer" == clusterName or \ + "Application Launcher" == clusterName: + + picsFileName = "Media Cluster" + + elif "Operational Credentials" == clusterName: + picsFileName = "Node Operational Credentials" + + # Workaround for naming colisions with current logic + elif "Thermostat" == clusterName: + picsFileName = "Thermostat Cluster" + + elif "Boolean State" == clusterName: + picsFileName = "Boolean State Cluster" + + elif "AccessControl" in clusterName: + picsFileName = "Access Control Cluster" + + else: + picsFileName = clusterName + + for file in xmlFileList: + if file.lower().startswith(picsFileName.lower()): + fileName = file + break + + if fileName: + console.print(f"[blue]\"{clusterName}\" - \"{fileName}\" ✅") + else: + console.print(f"[red]Could not find matching file for \"{clusterName}\" ❌") + continue + + +if __name__ == "__main__": + default_matter_test_main() From 2d48454fef8491190435bdbc6739178c776e37fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Josefsen?= Date: Thu, 19 Sep 2024 11:31:25 +0200 Subject: [PATCH 3/7] Updated based on review feedback --- src/tools/PICS-generator/PICSGenerator.py | 55 +-------- src/tools/PICS-generator/README.md | 21 ++++ src/tools/PICS-generator/XMLPICSValidator.py | 105 +++--------------- .../PICS-generator/pics_generator_support.py | 77 +++++++++++++ 4 files changed, 118 insertions(+), 140 deletions(-) create mode 100644 src/tools/PICS-generator/pics_generator_support.py diff --git a/src/tools/PICS-generator/PICSGenerator.py b/src/tools/PICS-generator/PICSGenerator.py index 6e40ac19d0a03e..6fb1858ef0e0a8 100644 --- a/src/tools/PICS-generator/PICSGenerator.py +++ b/src/tools/PICS-generator/PICSGenerator.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Project CHIP Authors +# Copyright (c) 2024 Project CHIP Authors # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +24,8 @@ import chip.clusters as Clusters from rich.console import Console +from pics_generator_support import pics_xml_file_list_loader, map_cluster_name_to_pics_xml + # Add the path to python_testing folder, in order to be able to import from matter_testing_support sys.path.append(os.path.abspath(sys.path[0] + "/../../python_testing")) from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main # noqa: E402 @@ -40,52 +42,7 @@ def GenerateDevicePicsXmlFiles(clusterName, clusterPicsCode, featurePicsList, at console.print(f"Handling PICS for {clusterName}") - # Map clusters to common XML template if needed - if "ICDManagement" == clusterName: - picsFileName = "ICD Management" - - elif "OTA Software Update Provider" in clusterName or \ - "OTA Software Update Requestor" in clusterName: - picsFileName = "OTA Software Update" - - elif "On/Off" == clusterName: - picsFileName = clusterName.replace("/", "-") - - elif "GroupKeyManagement" == clusterName: - picsFileName = "Group Communication" - - elif "Wake on LAN" == clusterName or \ - "Low Power" == clusterName or \ - "Keypad Input" == clusterName or \ - "Audio Output" == clusterName or \ - "Media Input" == clusterName or \ - "Target Navigator" == clusterName or \ - "Content Control" == clusterName or \ - "Channel" == clusterName or \ - "Media Playback" == clusterName or \ - "Account Login" == clusterName or \ - "Application Basic" == clusterName or \ - "Content Launcher" == clusterName or \ - "Content App Observer" == clusterName or \ - "Application Launcher" == clusterName: - - picsFileName = "Media Cluster" - - elif "Operational Credentials" == clusterName: - picsFileName = "Node Operational Credentials" - - # Workaround for naming colisions with current logic - elif "Thermostat" == clusterName: - picsFileName = "Thermostat Cluster" - - elif "Boolean State" == clusterName: - picsFileName = "Boolean State Cluster" - - elif "AccessControl" in clusterName: - picsFileName = "Access Control Cluster" - - else: - picsFileName = clusterName + picsFileName = map_cluster_name_to_pics_xml(clusterName, xmlFileList) # Determine if file has already been handled and use this file for outputFolderFileName in os.listdir(outputPathStr): @@ -435,9 +392,7 @@ def cleanDirectory(pathToClean): # Load PICS XML templates print("Capture list of PICS XML templates") -xmlFileList = os.listdir(xmlTemplatePathStr) -for PICSXmlFile in xmlFileList: - print(f"{xmlTemplatePathStr}/{PICSXmlFile}") +xmlFileList = pics_xml_file_list_loader(xmlTemplatePathStr, True) # Setup output path print(f"Output path: {outputPathStr}") diff --git a/src/tools/PICS-generator/README.md b/src/tools/PICS-generator/README.md index 9c20616bb5bc0a..78fc266a2976db 100644 --- a/src/tools/PICS-generator/README.md +++ b/src/tools/PICS-generator/README.md @@ -59,6 +59,12 @@ commissioning information: python3 PICSGenerator.py --pics-template --pics-output --commissioning-method ble-thread --discriminator --passcode --thread-dataset-hex ``` +or in case the device is e.g. an example running on a Linux/macOS system, use the on-network commissioning: + +``` +python3 PICSGenerator.py --pics-template --pics-output --commissioning-method on-network --discriminator --passcode +``` + In case the device uses a development PAA, the following parameter should be added. @@ -78,3 +84,18 @@ If a device has already been commissioned, the tool can be executed like this: ``` python3 PICSGenerator.py --pics-template --pics-output ``` + +# Updates for future releases + +Given each new release adds PICS files, to ensure the tool is able to map the cluster names to the PICS XML files, +the XMLPICSValidator script can be used to validate the mapping and will inform in case a cluster can not +be mapped to a PICS XML file. + +The purpose of this script is mainly to make the update of this tool to future versions of Matter easier +and is not intended as a script for generating the PICS. + +To run the XMLPICSValidator, the following command can be used: + +``` +python3 XMLPICSValidator.py --pics-template +``` diff --git a/src/tools/PICS-generator/XMLPICSValidator.py b/src/tools/PICS-generator/XMLPICSValidator.py index 0b03d513cde91d..720c8b51a0c50b 100644 --- a/src/tools/PICS-generator/XMLPICSValidator.py +++ b/src/tools/PICS-generator/XMLPICSValidator.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2023 Project CHIP Authors +# Copyright (c) 2024 Project CHIP Authors # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,107 +16,32 @@ # import argparse -import os import sys - -from rich.console import Console +import os +from pics_generator_support import pics_xml_file_list_loader, map_cluster_name_to_pics_xml # Add the path to python_testing folder, in order to be able to import from matter_testing_support sys.path.append(os.path.abspath(sys.path[0] + "/../../python_testing")) -from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main # noqa: E402 from spec_parsing_support import build_xml_clusters # noqa: E402 -console = None -xml_clusters = None parser = argparse.ArgumentParser() parser.add_argument('--pics-template', required=True) args, unknown = parser.parse_known_args() -xmlTemplatePathStr = args.pics_template -if not xmlTemplatePathStr.endswith('/'): - xmlTemplatePathStr += '/' - -# Load PICS XML templates -print("Capture list of PICS XML templates") -xmlFileList = os.listdir(xmlTemplatePathStr) -for PICSXmlFile in xmlFileList: - print(f"{xmlTemplatePathStr}/{PICSXmlFile}") - - -class XMLPICSValidator(MatterBaseTest): - @async_test_body - async def test_xml_pics_validator(self): - - # Create console to print - global console - console = Console() - - global xml_clusters - xml_clusters, problems = build_xml_clusters() - - for cluster in xml_clusters: - - fileName = "" - clusterName = xml_clusters[cluster].name - - if "ICDManagement" == clusterName: - picsFileName = "ICD Management" - - elif "OTA Software Update Provider" in clusterName or \ - "OTA Software Update Requestor" in clusterName: - picsFileName = "OTA Software Update" - - elif "On/Off" == clusterName: - picsFileName = clusterName.replace("/", "-") - - elif "GroupKeyManagement" == clusterName: - picsFileName = "Group Communication" - - elif "Wake on LAN" == clusterName or \ - "Low Power" == clusterName or \ - "Keypad Input" == clusterName or \ - "Audio Output" == clusterName or \ - "Media Input" == clusterName or \ - "Target Navigator" == clusterName or \ - "Content Control" == clusterName or \ - "Channel" == clusterName or \ - "Media Playback" == clusterName or \ - "Account Login" == clusterName or \ - "Application Basic" == clusterName or \ - "Content Launcher" == clusterName or \ - "Content App Observer" == clusterName or \ - "Application Launcher" == clusterName: - - picsFileName = "Media Cluster" - - elif "Operational Credentials" == clusterName: - picsFileName = "Node Operational Credentials" - - # Workaround for naming colisions with current logic - elif "Thermostat" == clusterName: - picsFileName = "Thermostat Cluster" - - elif "Boolean State" == clusterName: - picsFileName = "Boolean State Cluster" - - elif "AccessControl" in clusterName: - picsFileName = "Access Control Cluster" - - else: - picsFileName = clusterName +xml_template_path_str = args.pics_template - for file in xmlFileList: - if file.lower().startswith(picsFileName.lower()): - fileName = file - break +print("Build list of PICS XML") +pics_xml_file_list = pics_xml_file_list_loader(xml_template_path_str, True) - if fileName: - console.print(f"[blue]\"{clusterName}\" - \"{fileName}\" ✅") - else: - console.print(f"[red]Could not find matching file for \"{clusterName}\" ❌") - continue +print("Build list of spec XML") +xml_clusters, problems = build_xml_clusters() +for cluster in xml_clusters: + pics_xml_file_name = map_cluster_name_to_pics_xml(xml_clusters[cluster].name, pics_xml_file_list) -if __name__ == "__main__": - default_matter_test_main() + if pics_xml_file_name: + print(f"{xml_clusters[cluster].name} - {pics_xml_file_name} ✅") + else: + print( + f"Could not find matching PICS XML file for {xml_clusters[cluster].name} - {xml_clusters[cluster].pics} (Provisional: {xml_clusters[cluster].is_provisional}) ❌") diff --git a/src/tools/PICS-generator/pics_generator_support.py b/src/tools/PICS-generator/pics_generator_support.py new file mode 100644 index 00000000000000..4be5421201361f --- /dev/null +++ b/src/tools/PICS-generator/pics_generator_support.py @@ -0,0 +1,77 @@ +# +# Copyright (c) 2024 Project CHIP Authors +# All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os + +cluster_to_pics_dict = { + # Name mapping due to inconsistent naming of PICS files + "ICDManagement": "ICD Management", + "OTA Software Update Provider": "OTA Software Update", + "OTA Software Update Requestor": "OTA Software Update", + "On/Off": "On-Off", + "GroupKeyManagement": "Group Communication", + "Wake on LAN": "Media Cluster", + "Low Power": "Media Cluster", + "Keypad Input": "Media Cluster", + "Audio Output": "Media Cluster", + "Media Input": "Media Cluster", + "Target Navigator": "Media Cluster", + "Content Control": "Media Cluster", + "Channel": "Media Cluster", + "Media Playback": "Media Cluster", + "Account Login": "Media Cluster", + "Application Basic": "Media Cluster", + "Content Launcher": "Media Cluster", + "Content App Observer": "Media Cluster", + "Application Launch": "Media Cluster", + "Operational Credentials": "Node Operational Credentials", + + # Workaround for naming colisions with current logic + "Thermostat": "Thermostat Cluster", + "Boolean State": "Boolean State Cluster", + "AccessControl": "Access Control Cluster", +} + + +def pics_xml_file_list_loader(pics_xml_path: str, log_loaded_pics_files: bool) -> list: + + pics_xml_file_list = os.listdir(pics_xml_path) + + if log_loaded_pics_files: + if not pics_xml_path.endswith('/'): + pics_xml_path += '/' + + for pics_xml_file in pics_xml_file_list: + print(f"{pics_xml_path}/{pics_xml_file}") + + return pics_xml_file_list + + +def map_cluster_name_to_pics_xml(cluster_name, pics_xml_file_list) -> str: + file_name = "" + + try: + pics_file_name = cluster_to_pics_dict[cluster_name] + except KeyError: + pics_file_name = cluster_name + + for file in pics_xml_file_list: + if file.lower().startswith(pics_file_name.lower()): + file_name = file + break + + return file_name From d597921dc362f2dd9c3333d665e47b6a35277b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Josefsen?= <69624991+ReneJosefsen@users.noreply.github.com> Date: Tue, 1 Oct 2024 22:22:25 +0200 Subject: [PATCH 4/7] Apply suggestions from code review Co-authored-by: C Freeman Co-authored-by: Andrei Litvin --- src/tools/PICS-generator/PICSGenerator.py | 2 +- src/tools/PICS-generator/pics_generator_support.py | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/tools/PICS-generator/PICSGenerator.py b/src/tools/PICS-generator/PICSGenerator.py index 6fb1858ef0e0a8..a1d9befff67ae0 100644 --- a/src/tools/PICS-generator/PICSGenerator.py +++ b/src/tools/PICS-generator/PICSGenerator.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2024 Project CHIP Authors +# Copyright (c) 2023-2024 Project CHIP Authors # All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/tools/PICS-generator/pics_generator_support.py b/src/tools/PICS-generator/pics_generator_support.py index 4be5421201361f..53e0248842ff64 100644 --- a/src/tools/PICS-generator/pics_generator_support.py +++ b/src/tools/PICS-generator/pics_generator_support.py @@ -64,10 +64,7 @@ def pics_xml_file_list_loader(pics_xml_path: str, log_loaded_pics_files: bool) - def map_cluster_name_to_pics_xml(cluster_name, pics_xml_file_list) -> str: file_name = "" - try: - pics_file_name = cluster_to_pics_dict[cluster_name] - except KeyError: - pics_file_name = cluster_name + pics_file_name = cluster_to_pics_dict.get(cluster_name, cluster_name) for file in pics_xml_file_list: if file.lower().startswith(pics_file_name.lower()): From 4fdbd109516ff1ea7ca5aba13a72e9ff43f1d6c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Josefsen?= Date: Tue, 1 Oct 2024 22:26:26 +0200 Subject: [PATCH 5/7] Add XMLPICSValidator to wordlist --- .github/.wordlist.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt index f317901e450aa6..0d8682154c7e79 100644 --- a/.github/.wordlist.txt +++ b/.github/.wordlist.txt @@ -1600,6 +1600,7 @@ xFFF xFFFF xfffff xFFFFFFEFFFFFFFFF +XMLPICSValidator xtensa xvzf xwayland From a345b95eeb3daa4b92b03eecd3360219b3e834b4 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Tue, 1 Oct 2024 20:26:45 +0000 Subject: [PATCH 6/7] Restyled by prettier-markdown --- src/tools/PICS-generator/README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/tools/PICS-generator/README.md b/src/tools/PICS-generator/README.md index 78fc266a2976db..312d790ca3109b 100644 --- a/src/tools/PICS-generator/README.md +++ b/src/tools/PICS-generator/README.md @@ -59,7 +59,8 @@ commissioning information: python3 PICSGenerator.py --pics-template --pics-output --commissioning-method ble-thread --discriminator --passcode --thread-dataset-hex ``` -or in case the device is e.g. an example running on a Linux/macOS system, use the on-network commissioning: +or in case the device is e.g. an example running on a Linux/macOS system, use +the on-network commissioning: ``` python3 PICSGenerator.py --pics-template --pics-output --commissioning-method on-network --discriminator --passcode @@ -87,12 +88,14 @@ python3 PICSGenerator.py --pics-template --pics-outpu # Updates for future releases -Given each new release adds PICS files, to ensure the tool is able to map the cluster names to the PICS XML files, -the XMLPICSValidator script can be used to validate the mapping and will inform in case a cluster can not -be mapped to a PICS XML file. +Given each new release adds PICS files, to ensure the tool is able to map the +cluster names to the PICS XML files, the XMLPICSValidator script can be used to +validate the mapping and will inform in case a cluster can not be mapped to a +PICS XML file. -The purpose of this script is mainly to make the update of this tool to future versions of Matter easier -and is not intended as a script for generating the PICS. +The purpose of this script is mainly to make the update of this tool to future +versions of Matter easier and is not intended as a script for generating the +PICS. To run the XMLPICSValidator, the following command can be used: From ab9a0fcaa54065032f3564b1a34ac60cc5c397cb Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Tue, 1 Oct 2024 20:26:46 +0000 Subject: [PATCH 7/7] Restyled by isort --- src/tools/PICS-generator/PICSGenerator.py | 3 +-- src/tools/PICS-generator/XMLPICSValidator.py | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/tools/PICS-generator/PICSGenerator.py b/src/tools/PICS-generator/PICSGenerator.py index a1d9befff67ae0..acdeb676ed8aa5 100644 --- a/src/tools/PICS-generator/PICSGenerator.py +++ b/src/tools/PICS-generator/PICSGenerator.py @@ -22,10 +22,9 @@ import xml.etree.ElementTree as ET import chip.clusters as Clusters +from pics_generator_support import map_cluster_name_to_pics_xml, pics_xml_file_list_loader from rich.console import Console -from pics_generator_support import pics_xml_file_list_loader, map_cluster_name_to_pics_xml - # Add the path to python_testing folder, in order to be able to import from matter_testing_support sys.path.append(os.path.abspath(sys.path[0] + "/../../python_testing")) from matter_testing_support import MatterBaseTest, async_test_body, default_matter_test_main # noqa: E402 diff --git a/src/tools/PICS-generator/XMLPICSValidator.py b/src/tools/PICS-generator/XMLPICSValidator.py index 720c8b51a0c50b..d728a61991edf0 100644 --- a/src/tools/PICS-generator/XMLPICSValidator.py +++ b/src/tools/PICS-generator/XMLPICSValidator.py @@ -16,15 +16,15 @@ # import argparse -import sys import os -from pics_generator_support import pics_xml_file_list_loader, map_cluster_name_to_pics_xml +import sys + +from pics_generator_support import map_cluster_name_to_pics_xml, pics_xml_file_list_loader # Add the path to python_testing folder, in order to be able to import from matter_testing_support sys.path.append(os.path.abspath(sys.path[0] + "/../../python_testing")) from spec_parsing_support import build_xml_clusters # noqa: E402 - parser = argparse.ArgumentParser() parser.add_argument('--pics-template', required=True) args, unknown = parser.parse_known_args()