From f65eb6fac316eed943d3c0d2ea3364707feb1cfb Mon Sep 17 00:00:00 2001 From: LucasG0 Date: Wed, 4 Jun 2025 17:23:39 +0200 Subject: [PATCH] Loading objects keeps subfolders order --- infrahub_sdk/utils.py | 15 --------------- infrahub_sdk/yaml.py | 11 ++++++----- .../nested_spec_objects/0_folder/3_file.yml | 0 .../0_folder/4_subfolder/5_file.yml | 0 .../0_folder/4_subfolder/6_file.yml | 0 .../nested_spec_objects/2_folder/0_file.yml | 0 .../nested_spec_objects/2_folder/1_file.yml | 0 tests/fixtures/nested_spec_objects/4_file.yml | 0 tests/integration/test_spec_object.py | 12 ++++++++++++ 9 files changed, 18 insertions(+), 20 deletions(-) create mode 100644 tests/fixtures/nested_spec_objects/0_folder/3_file.yml create mode 100644 tests/fixtures/nested_spec_objects/0_folder/4_subfolder/5_file.yml create mode 100644 tests/fixtures/nested_spec_objects/0_folder/4_subfolder/6_file.yml create mode 100644 tests/fixtures/nested_spec_objects/2_folder/0_file.yml create mode 100644 tests/fixtures/nested_spec_objects/2_folder/1_file.yml create mode 100644 tests/fixtures/nested_spec_objects/4_file.yml diff --git a/infrahub_sdk/utils.py b/infrahub_sdk/utils.py index a5d6f28d..7c6f3a28 100644 --- a/infrahub_sdk/utils.py +++ b/infrahub_sdk/utils.py @@ -240,21 +240,6 @@ def is_valid_url(url: str) -> bool: return False -def find_files(extension: str | list[str], directory: str | Path = ".") -> list[Path]: - files: list[Path] = [] - - if isinstance(extension, str): - extension = [extension] - if isinstance(directory, str): - directory = Path(directory) - - for ext in extension: - files.extend(list(directory.glob(f"**/*.{ext}"))) - files.extend(list(directory.glob(f"**/.*.{ext}"))) - - return files - - def get_branch(branch: str | None = None, directory: str | Path = ".") -> str: """If branch isn't provide, return the name of the local Git branch.""" if branch: diff --git a/infrahub_sdk/yaml.py b/infrahub_sdk/yaml.py index 7a0a3334..8e3f2f73 100644 --- a/infrahub_sdk/yaml.py +++ b/infrahub_sdk/yaml.py @@ -10,7 +10,7 @@ from yaml.parser import ParserError from .exceptions import FileNotValidError -from .utils import find_files, read_file +from .utils import read_file class InfrahubFileApiVersion(str, Enum): @@ -121,12 +121,13 @@ def load_file_from_disk(cls, path: Path) -> list[Self]: def load_from_disk(cls, paths: list[Path]) -> list[Self]: yaml_files: list[Self] = [] for file_path in paths: - if file_path.is_file(): + if file_path.is_file() and file_path.suffix in [".yaml", ".yml", ".json"]: yaml_files.extend(cls.load_file_from_disk(path=file_path)) elif file_path.is_dir(): - files = find_files(extension=["yaml", "yml", "json"], directory=file_path) - for item in files: - yaml_files.extend(cls.load_file_from_disk(path=item)) + sub_paths = [Path(sub_file_path) for sub_file_path in file_path.glob("*")] + sub_files = cls.load_from_disk(paths=sub_paths) + sorted_sub_files = sorted(sub_files, key=lambda x: x.location) + yaml_files.extend(sorted_sub_files) else: raise FileNotValidError(name=str(file_path), message=f"{file_path} does not exist!") diff --git a/tests/fixtures/nested_spec_objects/0_folder/3_file.yml b/tests/fixtures/nested_spec_objects/0_folder/3_file.yml new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/nested_spec_objects/0_folder/4_subfolder/5_file.yml b/tests/fixtures/nested_spec_objects/0_folder/4_subfolder/5_file.yml new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/nested_spec_objects/0_folder/4_subfolder/6_file.yml b/tests/fixtures/nested_spec_objects/0_folder/4_subfolder/6_file.yml new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/nested_spec_objects/2_folder/0_file.yml b/tests/fixtures/nested_spec_objects/2_folder/0_file.yml new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/nested_spec_objects/2_folder/1_file.yml b/tests/fixtures/nested_spec_objects/2_folder/1_file.yml new file mode 100644 index 00000000..e69de29b diff --git a/tests/fixtures/nested_spec_objects/4_file.yml b/tests/fixtures/nested_spec_objects/4_file.yml new file mode 100644 index 00000000..e69de29b diff --git a/tests/integration/test_spec_object.py b/tests/integration/test_spec_object.py index 6b0c7b15..26ed8974 100644 --- a/tests/integration/test_spec_object.py +++ b/tests/integration/test_spec_object.py @@ -9,6 +9,7 @@ from infrahub_sdk.testing.docker import TestInfrahubDockerClient from infrahub_sdk.testing.schemas.animal import SchemaAnimal from infrahub_sdk.utils import get_fixtures_dir +from infrahub_sdk.yaml import YamlFile def load_object_file(name: str) -> ObjectFile: @@ -23,6 +24,17 @@ def load_menu_file(name: str) -> MenuFile: return files[0] +def test_load_nested_folders_order(): + files = YamlFile.load_from_disk(paths=[get_fixtures_dir() / "nested_spec_objects"]) + assert len(files) == 6 + assert Path(files[0].location).name == "3_file.yml" + assert Path(files[1].location).name == "5_file.yml" + assert Path(files[2].location).name == "6_file.yml" + assert Path(files[3].location).name == "0_file.yml" + assert Path(files[4].location).name == "1_file.yml" + assert Path(files[5].location).name == "4_file.yml" + + class TestSpecObject(TestInfrahubDockerClient, SchemaAnimal): @pytest.fixture(scope="class") def branch_name(self) -> str: