#!/usr/bin/env python3 import argparse import pathlib import re def detect_misleading_indentation( toml_path: str, toml_lines: list[str], ) -> bool: issue_detected = False previous_indentation = 0 for line_number, line in enumerate(toml_lines, start=1): if match := re.match(r'^(\s*)\S', line): line_indentation = len(match.group(1)) if line_indentation < previous_indentation: # Allow de-indenting when starting a new section (`[`) or # terminating a multi-line list (`]`) if not re.match(r'^\s*(\[|\])', line): print(f'{toml_path}:{line_number}: ' f'Misleading indentation found') issue_detected = True else: line_indentation = 0 previous_indentation = line_indentation return issue_detected def main(): parser = argparse.ArgumentParser() parser.add_argument( 'toml_files', type=pathlib.Path, nargs=argparse.ZERO_OR_MORE, help='*.toml files to lint (default: src/**/ci/*.toml)', ) args = parser.parse_args() if not args.toml_files: args.toml_files = pathlib.Path('src').glob('**/ci/*.toml') error = False for path in args.toml_files: with path.open('r') as toml_file: toml_lines = toml_file.readlines() if detect_misleading_indentation(path.as_posix(), toml_lines): error = True if error: exit(1) if __name__ == '__main__': main()