Source code for nwb2bids.testing._assert_subdirectory_structure

import os
import pathlib

import pydantic


[docs] @pydantic.validate_call def assert_subdirectory_structure( *, directory: pathlib.Path, expected_structure: dict[pathlib.Path, dict[str, set[str]]], ) -> None: """ Assert that the subdirectory structure matches the expected structure. Parameters ---------- directory : directory path The path to the directory whose structure is to be checked. expected_structure : dict A dictionary representing the expected structure of the subdirectory. Keys are the full paths per expected subdirectory. Values are dictionaries with required 'directories' and 'files' keys whose values are sets of string names for all expected entities at that level. """ # Future TODO: adjust to pathlib.Path.walk once 3.12 is minimum for current_dir, directories, files in os.walk(top=directory): directories[:] = [d for d in directories if not d.startswith(".")] files = [f for f in files if not f.startswith(".")] current_dir_path = pathlib.Path(current_dir) expected = expected_structure.get(current_dir_path, None) assert expected is not None, ( f"\n\nUnexpected subdirectory {current_dir_path}\n\n" f"Expected subdirectories: {list(expected_structure.keys())}\n" ) assert set(expected.keys()) == {"directories", "files"}, ( f"\n\nUnexpected keys in expected structure for {current_dir_path}\n\n" f"Expected keys: 'directories', 'files'\n" f"Found keys: {set(expected.keys())}\n\n" ) assert set(directories) == set(expected["directories"]), ( f"\n\nUnexpected directories in {current_dir_path}\n\n" f"Expected: {expected['directories']}\n" f"Found: {set(directories)}\n" f"Unexpected: {set(directories) - set(expected['directories'])}\n" f"Missing: {set(expected['directories']) - set(directories)}\n\n" ) assert set(files) == set(expected["files"]), ( f"\n\nUnexpected files in {current_dir_path}\n\n" f"Expected: {expected['files']}\n" f"Found: {files}\n" f"Unexpected: {set(files) - set(expected['files'])}\n" f"Missing: {set(expected['files']) - set(files)}\n\n" )