#!/usr/bin/env python """Find and concatenate all the rule files into one readable output. """ # n.b.: This shows any file, not just ones committed in git, which would # require parsing output from git ls-files or something. # This doesn't show files in subdirectories. # This won't show anything that doesn't have a .md extension. # This is supposed to generate valid markdown, but that depends on the # rule files. import os import re _FILENAME_RE = re.compile(r'(\d+)_(.*)\.md') def file_paths_under(root): """Yield paths of files under the given root. """ for filename in sorted(os.listdir(root)): full_path = os.path.join(root, filename) # n.b.: lots of checks against filesystem. if os.path.isfile(full_path): yield full_path def files(file_paths): """Yield file objects for the given file paths. """ # n.b.: no error handling if files don't exist or can't be opened. for file_path in file_paths: with open(file_path, "r") as file_obj: yield file_obj def parse_path(filename): """Extract rule number and title from given path to rule file. """ basename = os.path.basename(filename) match = _FILENAME_RE.match(basename) if not match: return None number = match.group(1) words = [word.capitalize() for word in match.group(2).split("-")] title = " ".join(words) return number, title def render_dir(root): """Yield lines presenting rule files in the given directory. """ for file_obj in files(file_paths_under(root)): parsed = parse_path(file_obj.name) # n.b.: parsed may be None and fail to unpack here. number, title = parsed content = file_obj.read().rstrip() title_line = "{0}. {1}".format(number, title) yield "" yield title_line yield "-" * len(title_line) yield "" yield content def render_section(root, title): """Add a title to the output of render_dir. """ yield title yield "=" * len(title) for line in render_dir(root): yield line def main(): """What happens when the script is run """ this_file = os.path.abspath(__file__) here = os.path.dirname(this_file) parent = os.path.dirname(here) immutable_rule_dir = os.path.join(parent, 'immutable_rules') mutable_rule_dir = os.path.join(parent, 'mutable_rules') for line in render_section(immutable_rule_dir, "Immutable Rules"): print(line) print("") for line in render_section(mutable_rule_dir, "Mutable Rules"): print(line) # This is a script file, so __name__ stuff is not useful. main()