From 533430923dbaa23f76512ccc8bc19d62bcb3e797 Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:03:09 +0100 Subject: [PATCH 01/18] feat: Add lib dependencies from library.properties --- compilesketches/compilesketches.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index 23467799..61e29146 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -762,6 +762,24 @@ def install_libraries(self): if len(library_list.download) > 0: self.install_libraries_from_download(library_list=library_list.download) + def get_dependencies_from_properties_file(properties_file_path): + """extract library names from `depends` key""" + dependencies = [] + with open(properties_file_path, 'r') as file: + content = file.read() + match = re.search(r'depends=(.*)', content) + if match: + # only works with ',' (comma) deliminator + dependencies = match.group(1).split(',') + return dependencies + + def get_library_dependencies(library_path): + """if library.properties is present, extract dependancies""" + properties_file_path = os.path.join(library_path, 'library.properties') + if os.path.exists(properties_file_path): + return get_dependencies_from_properties_file(properties_file_path) + return [] + def install_libraries_from_library_manager(self, library_list): """Install libraries using the Arduino Library Manager @@ -778,6 +796,10 @@ def install_libraries_from_library_manager(self, library_list): lib_install_command.append(self.get_manager_dependency_name(library)) self.run_arduino_cli_command(command=lib_install_command, enable_output=self.get_run_command_output_level()) + dependencies = get_library_dependencies(library[self.dependency_source_path_key]) + for dependsLibrary in dependencies + lib_install_command.extend(dependsLibrary) + def install_libraries_from_path(self, library_list): """Install libraries from local paths From 0119c700accf8d5f16fcbcf38120efd61f12fd83 Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:30:12 +0100 Subject: [PATCH 02/18] fix: add missing `:` --- compilesketches/compilesketches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index 61e29146..02c4c4c4 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -797,7 +797,7 @@ def install_libraries_from_library_manager(self, library_list): self.run_arduino_cli_command(command=lib_install_command, enable_output=self.get_run_command_output_level()) dependencies = get_library_dependencies(library[self.dependency_source_path_key]) - for dependsLibrary in dependencies + for dependsLibrary in dependencies: lib_install_command.extend(dependsLibrary) def install_libraries_from_path(self, library_list): From aad9e2348c568de8d0245fbe2f406afc4f3f285a Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:32:18 +0100 Subject: [PATCH 03/18] chore: use " instead of ' --- compilesketches/compilesketches.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index 02c4c4c4..e1befed9 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -767,15 +767,15 @@ def get_dependencies_from_properties_file(properties_file_path): dependencies = [] with open(properties_file_path, 'r') as file: content = file.read() - match = re.search(r'depends=(.*)', content) + match = re.search(r"depends=(.*)", content) if match: - # only works with ',' (comma) deliminator - dependencies = match.group(1).split(',') + # only works with "," (comma) deliminator + dependencies = match.group(1).split(",") return dependencies def get_library_dependencies(library_path): """if library.properties is present, extract dependancies""" - properties_file_path = os.path.join(library_path, 'library.properties') + properties_file_path = os.path.join(library_path, "library.properties") if os.path.exists(properties_file_path): return get_dependencies_from_properties_file(properties_file_path) return [] From 05f82d8dfe0bb5a3fce7090e5be8b2b76df3d9d3 Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:34:36 +0100 Subject: [PATCH 04/18] docs: correct dependencies spelling --- compilesketches/compilesketches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index e1befed9..bb4e4e58 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -774,7 +774,7 @@ def get_dependencies_from_properties_file(properties_file_path): return dependencies def get_library_dependencies(library_path): - """if library.properties is present, extract dependancies""" + """if library.properties is present, extract dependencies""" properties_file_path = os.path.join(library_path, "library.properties") if os.path.exists(properties_file_path): return get_dependencies_from_properties_file(properties_file_path) From cb8bb24bda58d6486e98e102ccbd4ce1f45d545d Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:37:49 +0100 Subject: [PATCH 05/18] fix: add `self` to access shared attributes --- compilesketches/compilesketches.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index bb4e4e58..37cce109 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -762,7 +762,7 @@ def install_libraries(self): if len(library_list.download) > 0: self.install_libraries_from_download(library_list=library_list.download) - def get_dependencies_from_properties_file(properties_file_path): + def get_dependencies_from_properties_file(self, properties_file_path): """extract library names from `depends` key""" dependencies = [] with open(properties_file_path, 'r') as file: @@ -773,7 +773,7 @@ def get_dependencies_from_properties_file(properties_file_path): dependencies = match.group(1).split(",") return dependencies - def get_library_dependencies(library_path): + def get_library_dependencies(self, library_path): """if library.properties is present, extract dependencies""" properties_file_path = os.path.join(library_path, "library.properties") if os.path.exists(properties_file_path): From dea4a23f4b8b546d63966bdc13d8d19b6d3a1beb Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:41:57 +0100 Subject: [PATCH 06/18] style: dependsLibrary -> depends_library --- compilesketches/compilesketches.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index 37cce109..d1e45faa 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -797,8 +797,8 @@ def install_libraries_from_library_manager(self, library_list): self.run_arduino_cli_command(command=lib_install_command, enable_output=self.get_run_command_output_level()) dependencies = get_library_dependencies(library[self.dependency_source_path_key]) - for dependsLibrary in dependencies: - lib_install_command.extend(dependsLibrary) + for depends_library in dependencies: + lib_install_command.extend(depends_library) def install_libraries_from_path(self, library_list): """Install libraries from local paths From 8e9414e8930f7c4bc6310d27a18c8b79d824d68b Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:45:29 +0100 Subject: [PATCH 07/18] fix: correct definition with `self` --- compilesketches/compilesketches.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index d1e45faa..410e7bc6 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -777,7 +777,7 @@ def get_library_dependencies(self, library_path): """if library.properties is present, extract dependencies""" properties_file_path = os.path.join(library_path, "library.properties") if os.path.exists(properties_file_path): - return get_dependencies_from_properties_file(properties_file_path) + return self.get_dependencies_from_properties_file(properties_file_path) return [] def install_libraries_from_library_manager(self, library_list): @@ -796,7 +796,7 @@ def install_libraries_from_library_manager(self, library_list): lib_install_command.append(self.get_manager_dependency_name(library)) self.run_arduino_cli_command(command=lib_install_command, enable_output=self.get_run_command_output_level()) - dependencies = get_library_dependencies(library[self.dependency_source_path_key]) + dependencies = self.get_library_dependencies(library[self.dependency_source_path_key]) for depends_library in dependencies: lib_install_command.extend(depends_library) From 1820c94360650844c372dcd4f18850e212358d4f Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:51:37 +0100 Subject: [PATCH 08/18] style: change `'` to `"` --- compilesketches/compilesketches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index 410e7bc6..49f60b00 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -765,7 +765,7 @@ def install_libraries(self): def get_dependencies_from_properties_file(self, properties_file_path): """extract library names from `depends` key""" dependencies = [] - with open(properties_file_path, 'r') as file: + with open(properties_file_path, "r") as file: content = file.read() match = re.search(r"depends=(.*)", content) if match: From 1a8131dde19bab1ad228cf600fdef882a965b750 Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Sat, 18 Nov 2023 13:51:55 +0100 Subject: [PATCH 09/18] fix: use os.environ["GITHUB_REPOSITORY"] --- compilesketches/compilesketches.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index 49f60b00..10104b61 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -796,7 +796,7 @@ def install_libraries_from_library_manager(self, library_list): lib_install_command.append(self.get_manager_dependency_name(library)) self.run_arduino_cli_command(command=lib_install_command, enable_output=self.get_run_command_output_level()) - dependencies = self.get_library_dependencies(library[self.dependency_source_path_key]) + dependencies = self.get_library_dependencies(os.environ["GITHUB_REPOSITORY"]) for depends_library in dependencies: lib_install_command.extend(depends_library) From 291340c1513e005e0bf2157dc940f0f0a43f8a6a Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Tue, 6 Feb 2024 13:50:20 +0100 Subject: [PATCH 10/18] Add tests for `get_dependancies_from_properties_file` --- compilesketches/tests/test_compilesketches.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 8604ecb3..8a40abdc 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -3182,3 +3182,36 @@ def rev_parse(self): mocker.patch.object(Repo, "rev_parse", return_value="push-head-sha") assert compilesketches.get_head_commit_hash() == expected_hash + +# Automated library parsing from the library.properties file +def test_get_dependencies_from_properties_file_with_dependencies(): + properties_file = os.path.join(os.environ["GITHUB_WORKSPACE"], "library.properties") + with open(properties_file, "w") as file: + file.write("depends=Library1,Library2,Library3") + + compilesketches_object = get_compilesketches_object() + dependencies = compilesketches_object.get_dependencies_from_properties_file(properties_file) + + assert dependencies == ["Library1", "Library2", "Library3"] + +# Empty library.properties file should not return any dependencies +def test_get_dependencies_from_properties_file_without_dependencies(): + properties_file = os.path.join(os.environ["GITHUB_WORKSPACE"], "library.properties") + with open(properties_file, "w") as file: + file.write("depends=") + + compilesketches_object = get_compilesketches_object() + dependencies = compilesketches_object.get_dependencies_from_properties_file(properties_file) + + assert dependencies == [] + +# No depends key inside library.properties, should not return any dependencies +def test_get_dependencies_from_properties_file_no_depends_key(): + properties_file = os.path.join(os.environ["GITHUB_WORKSPACE"], "library.properties") + with open(properties_file, "w") as file: + file.write("key=value") + + compilesketches_object = get_compilesketches_object() + dependencies = compilesketches_object.get_dependencies_from_properties_file(properties_file) + + assert dependencies == [] \ No newline at end of file From 9266584fe96b663d2becc22c1426d65d0b08593b Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:07:59 +0100 Subject: [PATCH 11/18] check director exists --- compilesketches/tests/test_compilesketches.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 8a40abdc..3e6ea616 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -3185,7 +3185,9 @@ def rev_parse(self): # Automated library parsing from the library.properties file def test_get_dependencies_from_properties_file_with_dependencies(): - properties_file = os.path.join(os.environ["GITHUB_WORKSPACE"], "library.properties") + directory = os.environ["GITHUB_WORKSPACE"] + os.makedirs(directory, exist_ok=True) # check directory exists + properties_file = os.path.join(directory, "library.properties") with open(properties_file, "w") as file: file.write("depends=Library1,Library2,Library3") From 2fb2193b4ee080e9fb33ed09073c681ff623592f Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:10:48 +0100 Subject: [PATCH 12/18] Add os.getcwd() --- compilesketches/tests/test_compilesketches.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 3e6ea616..8a2c125a 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -3185,9 +3185,7 @@ def rev_parse(self): # Automated library parsing from the library.properties file def test_get_dependencies_from_properties_file_with_dependencies(): - directory = os.environ["GITHUB_WORKSPACE"] - os.makedirs(directory, exist_ok=True) # check directory exists - properties_file = os.path.join(directory, "library.properties") + properties_file = os.path.join(os.getcwd(), "library.properties") with open(properties_file, "w") as file: file.write("depends=Library1,Library2,Library3") From 647369d92ca6cfed3ac2100d8a61ec78f0610791 Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:12:32 +0100 Subject: [PATCH 13/18] Add os.getcwd() for all three mock locations --- compilesketches/tests/test_compilesketches.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 8a2c125a..a1f34bb8 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -3196,7 +3196,7 @@ def test_get_dependencies_from_properties_file_with_dependencies(): # Empty library.properties file should not return any dependencies def test_get_dependencies_from_properties_file_without_dependencies(): - properties_file = os.path.join(os.environ["GITHUB_WORKSPACE"], "library.properties") + properties_file = os.path.join(os.getcwd(), "library.properties") with open(properties_file, "w") as file: file.write("depends=") @@ -3207,7 +3207,7 @@ def test_get_dependencies_from_properties_file_without_dependencies(): # No depends key inside library.properties, should not return any dependencies def test_get_dependencies_from_properties_file_no_depends_key(): - properties_file = os.path.join(os.environ["GITHUB_WORKSPACE"], "library.properties") + properties_file = os.path.join(os.getcwd(), "library.properties") with open(properties_file, "w") as file: file.write("key=value") From 8e02abc06d512c1a14fee987ff8dfb68231ce8ba Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:21:31 +0100 Subject: [PATCH 14/18] Fix mock assert for get_dependencies_from_properties_file --- compilesketches/compilesketches.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index 10104b61..2c2da1f3 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -770,7 +770,9 @@ def get_dependencies_from_properties_file(self, properties_file_path): match = re.search(r"depends=(.*)", content) if match: # only works with "," (comma) deliminator - dependencies = match.group(1).split(",") + depends = match.group(1) + if depends: + dependencies = depends.split(",") return dependencies def get_library_dependencies(self, library_path): From dc0e8eeca0aadb82e128c5d8a1e54752ca35c9a3 Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:28:17 +0100 Subject: [PATCH 15/18] Add tests for `get_library_dependencies` --- compilesketches/tests/test_compilesketches.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index a1f34bb8..f95ff39f 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -3214,4 +3214,27 @@ def test_get_dependencies_from_properties_file_no_depends_key(): compilesketches_object = get_compilesketches_object() dependencies = compilesketches_object.get_dependencies_from_properties_file(properties_file) + assert dependencies == [] + +# dependencies correctly extracted from a properties file within a library +def test_get_library_dependencies_with_properties_file(): + library_path = os.path.join(os.getcwd(), "library") + os.makedirs(library_path, exist_ok=True) + properties_file = os.path.join(library_path, "library.properties") + with open(properties_file, "w") as file: + file.write("depends=Library1,Library2,Library3") + + compilesketches_object = get_compilesketches_object() + dependencies = compilesketches_object.get_library_dependencies(library_path) + + assert dependencies == ["Library1", "Library2", "Library3"] + +# no dependencies when the library does not contain a properties file +def test_get_library_dependencies_without_properties_file(): + library_path = os.path.join(os.getcwd(), "library") + os.makedirs(library_path, exist_ok=True) + + compilesketches_object = get_compilesketches_object() + dependencies = compilesketches_object.get_library_dependencies(library_path) + assert dependencies == [] \ No newline at end of file From 6ed3f239ed5d91f05f6912e1cfb7283d3e200e27 Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:32:25 +0100 Subject: [PATCH 16/18] Cleanup library.properties from previous test --- compilesketches/tests/test_compilesketches.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index f95ff39f..9ec00944 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -3233,6 +3233,9 @@ def test_get_library_dependencies_with_properties_file(): def test_get_library_dependencies_without_properties_file(): library_path = os.path.join(os.getcwd(), "library") os.makedirs(library_path, exist_ok=True) + properties_file = os.path.join(library_path, "library.properties") + if os.path.exists(properties_file): + os.remove(properties_file) # properties file is removed compilesketches_object = get_compilesketches_object() dependencies = compilesketches_object.get_library_dependencies(library_path) From 9f6cf87eebdc7ece0aaf98370ecbb09e7e9ff1ee Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:35:43 +0100 Subject: [PATCH 17/18] Add blank lines for linter --- compilesketches/tests/test_compilesketches.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index 9ec00944..c6b322d9 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -3229,6 +3229,7 @@ def test_get_library_dependencies_with_properties_file(): assert dependencies == ["Library1", "Library2", "Library3"] + # no dependencies when the library does not contain a properties file def test_get_library_dependencies_without_properties_file(): library_path = os.path.join(os.getcwd(), "library") @@ -3240,4 +3241,4 @@ def test_get_library_dependencies_without_properties_file(): compilesketches_object = get_compilesketches_object() dependencies = compilesketches_object.get_library_dependencies(library_path) - assert dependencies == [] \ No newline at end of file + assert dependencies == [] From 5275f33163de33f772a74a528d8ab737d754863f Mon Sep 17 00:00:00 2001 From: Ali Jahangiri <75624145+aliphys@users.noreply.github.com> Date: Tue, 6 Feb 2024 14:40:07 +0100 Subject: [PATCH 18/18] Add blank lines --- compilesketches/tests/test_compilesketches.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index c6b322d9..2a07dae0 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -3183,6 +3183,7 @@ def rev_parse(self): assert compilesketches.get_head_commit_hash() == expected_hash + # Automated library parsing from the library.properties file def test_get_dependencies_from_properties_file_with_dependencies(): properties_file = os.path.join(os.getcwd(), "library.properties") @@ -3194,6 +3195,7 @@ def test_get_dependencies_from_properties_file_with_dependencies(): assert dependencies == ["Library1", "Library2", "Library3"] + # Empty library.properties file should not return any dependencies def test_get_dependencies_from_properties_file_without_dependencies(): properties_file = os.path.join(os.getcwd(), "library.properties") @@ -3205,6 +3207,7 @@ def test_get_dependencies_from_properties_file_without_dependencies(): assert dependencies == [] + # No depends key inside library.properties, should not return any dependencies def test_get_dependencies_from_properties_file_no_depends_key(): properties_file = os.path.join(os.getcwd(), "library.properties") @@ -3216,6 +3219,7 @@ def test_get_dependencies_from_properties_file_no_depends_key(): assert dependencies == [] + # dependencies correctly extracted from a properties file within a library def test_get_library_dependencies_with_properties_file(): library_path = os.path.join(os.getcwd(), "library")