add script to present rules as one big file

This commit is contained in:
Sasha Hart 2015-08-26 14:21:00 -05:00 committed by Travis Briggs
parent 967c74f739
commit bd28a5482c
1 changed files with 93 additions and 0 deletions

93
tools/rulecat Executable file
View File

@ -0,0 +1,93 @@
#!/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()