open-cas-linux/doc/reqparse.py
Rafal Stefanowski 91f5d497ef copyright/license: Add missing file extensions
Proper file extensions help 'copyright header checker' find files
that should contain copyright info. Extensions also clearly indicate
file type, and help to fit in with the file naming convention.

Signed-off-by: Rafal Stefanowski <rafal.stefanowski@intel.com>
2022-09-07 15:23:11 +02:00

154 lines
5.3 KiB
Python
Executable File

#!/usr/bin/env python3
#
# Copyright(c) 2021 Intel Corporation
# SPDX-License-Identifier: BSD-3-Clause
#
import argparse
import enum
import glob
import io
import markdown
import os
import sys
import yaml
import yaml.scanner
def error(filename, line, column, string):
string = "\n ".join(string.split('\n'))
print(f"[ERROR] {filename}: line {line}, column {column}: {string}", file=sys.stderr)
exit(1)
class Entity:
def __init__(self):
self.header_text = ""
self.header = None
self.text = ""
class State(enum.Enum):
BEGIN = enum.auto()
GROUP_HEADER = enum.auto()
GROUP_TEXT = enum.auto()
REQ_HEADER_PRE = enum.auto()
REQ_HEADER = enum.auto()
REQ_TEXT = enum.auto()
def parse_header(entity, filename, line):
try:
entity.header = yaml.safe_load(entity.header_text)
except yaml.scanner.ScannerError as e:
error(filename, line+e.problem_mark.line+1,
e.problem_mark.column+1, f"{e.context}\n{e.problem}")
def parse_file(filename):
state = State.BEGIN
group = None
reqs = []
current_entity = None
header_line = 0
with open(filename, "r") as f:
for i, l in enumerate(f.readlines(), start=1):
if l.strip() == "---":
if state == State.BEGIN:
current_entity = Entity()
state = State.GROUP_HEADER
header_line = i
elif state == State.GROUP_HEADER:
parse_header(current_entity, filename, header_line)
state = State.GROUP_TEXT
elif state == State.GROUP_TEXT:
error(filename, i, 1, "unexpected \"---\",\n"
"expected markdown or req header marker")
elif state == State.REQ_HEADER_PRE:
error(filename, i, 1, "unexpected \"---\",\n"
"expected another line of req header marker")
elif state == State.REQ_HEADER:
parse_header(current_entity, filename, header_line)
state = State.REQ_TEXT
elif state == State.REQ_TEXT:
error(filename, i, 1, "unexpected \"---\",\n"
"expected markdown or next req header marker")
else:
error(filename, i, 1, "something went terribly wrong")
elif l.strip() == "-"*80:
if state == State.BEGIN:
error(filename, i, 1, "unexpected req header marker,\n"
"expected group header marker")
elif state == State.GROUP_HEADER:
error(filename, i, 1, "unexpected req header marker,\n"
"expected yaml or group header end marker")
elif state == State.GROUP_TEXT:
group = current_entity
current_entity = None
state = State.REQ_HEADER_PRE
elif state == State.REQ_HEADER_PRE:
current_entity = Entity()
state = State.REQ_HEADER
header_line = i
elif state == State.REQ_HEADER:
error(filename, i, 1, "unexpected req header marker,\n"
"expected markdown or req header end marker")
elif state == State.REQ_TEXT:
reqs.append(current_entity)
current_entity = None
state = State.REQ_HEADER_PRE
else:
error(filename, i, 1, "something went terribly wrong")
else:
if state == State.BEGIN:
error(filename, i, 1, "unexpected character, expected group header")
elif state == State.GROUP_HEADER:
current_entity.header_text += l
elif state == State.GROUP_TEXT:
current_entity.text += l
elif state == State.REQ_HEADER_PRE:
error(filename, i, 1, "expected another line of req header marker")
elif state == State.REQ_HEADER:
current_entity.header_text += l
elif state == State.REQ_TEXT:
current_entity.text += l
else:
error(filename, i, 1, "something went terribly wrong")
if state == State.REQ_TEXT:
reqs.append(current_entity)
return (group, reqs)
parser = argparse.ArgumentParser(prog="reqparse")
parser.add_argument(
"-o", "--output", action="store",
help="Output file"
)
parser.add_argument(
"-f", "--format", action="store",
choices=["html", "markdown"], default="markdown",
help="Output format {html|markdown}",
)
args = parser.parse_args(sys.argv[1:])
buf = ""
with io.StringIO() as output:
for filename in glob.glob("requirements/*"):
group, reqs = parse_file(filename)
output.write(f"# {group.header['group']}\n")
output.write(group.text)
for r in reqs:
output.write(f"## {r.header['title']}\n")
output.write(r.text)
buf = output.getvalue()
if args.format == "html":
buf = markdown.markdown(buf, extensions=['sane_lists'])
if args.output:
with open(args.output, "w+") as outfile:
outfile.write(buf)
else:
print(buf)