Something went wrong on our end
-
Vincent Hatakeyama authoredVincent Hatakeyama authored
autotodo.py 3.66 KiB
#!/usr/bin/env python3
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2014, 2018, 2022 XCG Consulting
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import os
import os.path
import sys
from collections.abc import Mapping
def main():
if len(sys.argv) != 4:
print("usage: autotodo.py <folder> <exts> <tags>")
sys.exit(1)
folder = sys.argv[1]
exts = sys.argv[2].split(",")
tags = sys.argv[3].split(",")
todolist = {tag: [] for tag in tags}
path_file_length: Mapping[str, int] = {}
for root, _dirs, files in os.walk(folder):
scan_folder((exts, tags, todolist, path_file_length), root, files)
create_autotodo(folder, todolist, path_file_length)
def write_info(f, infos, folder, path_file_length: Mapping[str, int]):
# Check sphinx version for lineno-start support
import sphinx
if sphinx.version_info < (1, 3):
lineno_start = False
else:
lineno_start = True
for i in infos:
path = i[0]
line = i[1]
lines = (line - 3, min(line + 4, path_file_length[path]))
class_name = ":class:`%s`" % os.path.basename(os.path.splitext(path)[0])
f.write(
"%s\n"
"%s\n\n"
"Line %s\n"
"\t.. literalinclude:: %s\n"
"\t\t:language: python\n"
"\t\t:lines: %s-%s\n"
"\t\t:emphasize-lines: %s\n"
% (
class_name,
"-" * len(class_name),
line,
path,
lines[0],
lines[1],
4,
)
)
if lineno_start:
f.write("\t\t:lineno-start: %s\n" % lines[0])
f.write("\n")
def create_autotodo(folder, todolist, path_file_length: Mapping[str, int]):
with open("autotodo", "w+") as f:
for tag, info in list(todolist.items()):
f.write("%s\n%s\n\n" % (tag, "=" * len(tag)))
write_info(f, info, folder, path_file_length)
def scan_folder(data_tuple, dirname, names):
(exts, tags, res, path_file_length) = data_tuple
for name in names:
(root, ext) = os.path.splitext(name)
if ext in exts:
path = os.path.join(dirname, name)
file_info, length = scan_file(path, tags)
path_file_length[path] = length
for tag, info in list(file_info.items()):
if info:
res[tag].extend(info)
def scan_file(filename, tags) -> tuple[dict[str, list[tuple[str, int, str]]], int]:
res: dict[str, list[tuple[str, int, str]]] = {tag: [] for tag in tags}
line_num: int = 0
with open(filename, "r") as f:
for line_num, line in enumerate(f):
for tag in tags:
if tag in line:
res[tag].append((filename, line_num, line[:-1].strip()))
return res, line_num
if __name__ == "__main__":
main()