#!/usr/bin/env python3
"""Generate an HTML tree of all files
"""
import hashlib
import json
import os
import sys
import warnings
from subprocess import check_output as check_cmd_output
from typing import List, Tuple
warnings.filterwarnings("error", category=Warning)
IGNORE_FILES: Tuple[str] = ("netlify.toml",)
INDEX_TEMPLATE: str = f"""
%s
"""
def generate_tree(path: str, html: str = "") -> Tuple[str, List[str]]:
"""Generate a tree in HTML of files in specified path
Parameters
----------
path (str): The path
html (str): Starting HTML
Returns
-------
html (str): The HTML tree
files l(ist[str]): List of all files
"""
files: List[str] = []
for file in os.listdir(path):
if file.startswith(".") or file in IGNORE_FILES:
continue
rel = path + "/" + file
if os.path.isdir(rel):
html += f"
{file}/
"
_generated: Tuple[str, List[str]] = generate_tree(rel)
files.extend(_generated[1])
html += _generated[0]
html += "
"
else:
files.append(rel.removeprefix("./"))
html += f'
'
return html, files
def main() -> int:
"""Entry/main function"""
generated_tree: Tuple[str, List[str]] = generate_tree(".")
with open("index.html", "w", encoding="utf-8") as index:
index.write(INDEX_TEMPLATE % (generated_tree[0]))
with open("files.json", "w") as api_json:
json.dump(generated_tree[1], api_json)
with open("files.json", "rb") as api_json:
with open("files_json_hash.txt", "w") as api_hash:
api_hash.write(hashlib.sha256(api_json.read()).hexdigest())
return 0
if __name__ == "__main__":
assert main.__annotations__.get("return") is int, "main() should return an integer"
sys.exit(main())