forked from breadpunk/nomic
add script to present rules as one big file
This commit is contained in:
parent
967c74f739
commit
bd28a5482c
|
@ -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()
|
Loading…
Reference in New Issue