# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause """ Locating YNL spec and schema files on disk. Resolves the directory holding the YAML specs (preferring an in-tree copy over the installed system path) and maps family names to spec files. """ import os SYS_SCHEMA_DIR='/usr/share/ynl' RELATIVE_SCHEMA_DIR='../../../../../Documentation/netlink' def schema_dir(): """ Return the effective schema directory, preferring in-tree before system schema directory. """ script_dir = os.path.dirname(os.path.abspath(__file__)) schema_dir_ = os.path.abspath(f"{script_dir}/{RELATIVE_SCHEMA_DIR}") if not os.path.isdir(schema_dir_): schema_dir_ = SYS_SCHEMA_DIR if not os.path.isdir(schema_dir_): raise FileNotFoundError(f"Schema directory {schema_dir_} does not exist") return schema_dir_ def spec_dir(): """ Return the effective spec directory, relative to the effective schema directory. """ spec_dir_ = schema_dir() + '/specs' if not os.path.isdir(spec_dir_): raise FileNotFoundError(f"Spec directory {spec_dir_} does not exist") return spec_dir_ def find_spec(family): """ Return the path to the YAML spec file for a family by name. """ spec = f"{spec_dir()}/{family}.yaml" if not os.path.isfile(spec): raise FileNotFoundError(f"Spec for family '{family}' not found at {spec}") return spec def list_families(): """ Return the sorted names of all families with an installed spec. """ return sorted(f.removesuffix('.yaml') for f in os.listdir(spec_dir()) if f.endswith('.yaml'))