|
- #!/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()
|