rougail-tutorials_builder/build.py

224 lines
9.9 KiB
Python
Raw Normal View History

2024-07-21 11:27:47 +02:00
#!/usr/bin/env python3
2025-05-05 18:21:57 +02:00
import sys
2025-11-03 18:01:10 +01:00
from json import dump, loads
2024-07-21 11:27:47 +02:00
from pathlib import Path
from ruamel.yaml import YAML
from ansi2html import Ansi2HTMLConverter
2025-11-09 14:20:04 +01:00
from bs4 import BeautifulSoup
2024-07-21 11:27:47 +02:00
2025-05-05 18:21:57 +02:00
from rougail import Rougail
from rougail.config import get_rougail_config
2025-11-02 20:39:39 +01:00
from rougail.output_console import RougailOutputConsole
from rougail.user_data_yaml import RougailUserDataYaml
2024-07-21 11:27:47 +02:00
from rougail.output_doc import RougailOutputDoc
if __name__ == "__main__":
2025-11-08 10:37:28 +01:00
builder_dir = sys.argv[1]
previous = Path(builder_dir) / "previous.yml"
2025-11-09 14:20:04 +01:00
with Path("install.txt").open() as fh:
cmd = fh.read()
2025-11-08 10:37:28 +01:00
commit_id = sys.argv[2]
2025-05-05 18:21:57 +02:00
# rougailconfig = RougailConfig.copy()
rougailconfig = get_rougail_config(backward_compatibility=False, add_extra_options=False)
2025-11-02 20:39:39 +01:00
rougailconfig['main_structural_directories'] = ['firefox']
2025-05-05 18:21:57 +02:00
if Path('config/namespace').is_file():
has_namespace = True
2024-07-21 11:27:47 +02:00
has_foxyproxy = False
2025-05-05 18:21:57 +02:00
elif Path('foxyproxy').is_dir():
has_foxyproxy = True
has_namespace = True
2024-07-21 11:27:47 +02:00
rougailconfig['main_namespace'] = 'Firefox'
2025-11-02 20:39:39 +01:00
rougailconfig['extra_namespaces'] = {'FoxyProxy': ['foxyproxy']}
2024-07-21 11:27:47 +02:00
else:
2025-05-05 18:21:57 +02:00
has_foxyproxy = False
has_namespace = False
2024-07-21 11:27:47 +02:00
rougailconfig['main_namespace'] = None
# rougailconfig['tiramisu_cache'] = "cache.py"
2025-05-05 18:21:57 +02:00
if Path('mode').is_file():
rougailconfig['modes_level'] = ['basic', 'standard', 'advanced']
has_mode = True
else:
has_mode = False
2025-11-08 10:37:28 +01:00
rougailconfig['step.output'] = 'doc'
2025-11-02 20:39:39 +01:00
rougail = Rougail(rougailconfig)
config = rougail.run()
# print(config.value.get())
rougailconfig['doc.output_format'] = 'github'
rougailconfig['doc.title_level'] = 3
2025-11-10 08:20:56 +01:00
inventory = RougailOutputDoc(config, rougailconfig=rougailconfig)
2025-11-02 20:39:39 +01:00
inventory.load_formatter()
2025-11-03 18:01:10 +01:00
inv_formatter = inventory.formatter
2025-11-02 20:39:39 +01:00
rougailconfig['step.output'] = 'console'
2025-05-05 18:21:57 +02:00
summary = Path('summary_before.md')
if summary.is_file():
with summary.open('r') as sfh:
doc = sfh.read() + '\n\n'
else:
doc = ''
2024-07-21 11:27:47 +02:00
yaml = YAML()
namespace = 'firefox'
if rougailconfig['main_namespace']:
2025-11-09 14:20:04 +01:00
dirname = "foxyproxy"
2024-07-21 11:27:47 +02:00
else:
2025-11-09 14:20:04 +01:00
dirname = "firefox"
2025-11-03 18:01:10 +01:00
doc += inv_formatter.title('Screenshot', 2) + '\n'
2025-05-05 18:21:57 +02:00
doc += f'<img src="{namespace}.png" width=50% height=50% alt="{namespace.capitalize()} Proxy setting"/>\n\n'
# with doc_file.open('r') as docfh:
# doc += docfh.read()
2025-11-09 14:20:04 +01:00
doc += '\n' + inv_formatter.title('Clone and install', 2) + '\n\n'
doc += "To test this tutorial, you need to download this repository and install Rougail:\n\n"
doc += f'```shell\n{cmd}```\n\n'
doc += "Then switch to the tutorial page:\n\n"
doc += f"```shell\ngit switch --detach {commit_id}\n```\n"
tree = Path('tree.html')
display_yml = None
if tree.is_file():
doc += '\n' + inv_formatter.title('Structure', 2) + '\n\n'
with tree.open() as fh:
soup = BeautifulSoup(fh.read(), features="lxml")
doc += str(soup.find('p')) + "\n\n"
2025-11-10 08:20:56 +01:00
for f in Path(".").iterdir():
2025-11-09 14:20:04 +01:00
if f.name.startswith('DISPLAY_'):
2025-11-10 08:20:56 +01:00
filename = f.name[8:]
2025-11-09 14:20:04 +01:00
display_yml = Path(dirname) / filename
break
else:
files = list(Path(dirname).iterdir())
files.sort()
for f in reversed(files):
if not f.name.endswith('.yml'):
continue
display_yml = f
break
if display_yml:
doc += f"Contents of the {str(display_yml)} file"
doc += '\n\n```yml\n'
with display_yml.open(encoding="utf8") as file_fh:
doc += file_fh.read()
doc += '\n```\n'
2025-11-02 20:39:39 +01:00
rougailconfig['step.output'] = 'doc'
2025-11-08 10:37:28 +01:00
rougailconfig["doc.title_level"] = 4
2025-11-02 20:39:39 +01:00
inv_doc = inventory.run()[1]
2025-11-09 14:20:04 +01:00
CMD = "rougail -m firefox/ "
2025-11-08 10:37:28 +01:00
if has_namespace:
CMD += "-s Firefox "
if has_foxyproxy:
CMD += "-xn FoxyProxy -xd 0 foxyproxy/ "
if has_mode:
CMD += "--modes_level basic standard advanced "
2025-11-09 14:20:04 +01:00
if inv_doc:
2025-11-08 10:37:28 +01:00
doc += inv_formatter.title("Let's generate the documentation", 3)
cmd = CMD + "-o doc"
2025-11-09 14:20:04 +01:00
doc += f'```shell\n{cmd}\n```\n'
2025-05-05 18:21:57 +02:00
doc += inv_doc
2025-11-08 10:37:28 +01:00
if previous.is_file():
2025-11-03 18:01:10 +01:00
rougailconfig["doc.contents"] = ["changelog"]
2025-11-08 10:37:28 +01:00
rougailconfig["doc.previous_json_file"] = str(previous)
2025-11-10 08:20:56 +01:00
inv_doc = inventory.run()[1]
if inv_doc:
doc += inv_formatter.title("Let's generate the changelog", 3)
cmd = CMD + "-o doc --doc.contents changelog"
doc += f'```shell\n{cmd}\n```\n'
doc += inv_doc + "\n"
2025-11-03 18:01:10 +01:00
# save PREVIOUS
rougailconfig["doc.contents"] = ["variables"]
rougailconfig['doc.output_format'] = 'json'
data = inventory.run()[1]
if data:
2025-11-08 10:37:28 +01:00
with previous.open('w') as fh:
2025-11-03 18:01:10 +01:00
dump(loads(data), fh)
2024-07-21 11:27:47 +02:00
#
2025-11-03 18:01:10 +01:00
rougailconfig['step.output'] = 'console'
2024-07-21 11:27:47 +02:00
config = Path('config')
if config.is_dir():
2025-11-08 10:37:28 +01:00
doc += inv_formatter.title('User datas', 2)
2024-07-21 11:27:47 +02:00
configs = list(config.iterdir())
configs.sort()
for idx, dirname in enumerate(configs):
2025-05-05 18:21:57 +02:00
if dirname.is_file():
continue
2024-07-21 11:27:47 +02:00
for filename in dirname.iterdir():
if filename.name.endswith('.yml') or filename.name.endswith('.yaml'):
2025-11-03 18:01:10 +01:00
doc += inv_formatter.title(f'Example {idx + 1}', 3)
doc += inv_formatter.title(str(filename), 4)
2025-05-05 18:21:57 +02:00
doc += '\n```yml\n'
2024-07-21 11:27:47 +02:00
with filename.open(encoding="utf8") as file_fh:
2025-05-05 18:21:57 +02:00
doc += file_fh.read()
2025-11-09 14:20:04 +01:00
doc += '```\n'
2024-07-21 11:27:47 +02:00
rougail = Rougail(rougailconfig)
2025-11-02 20:39:39 +01:00
tiramisu_config = rougail.run()
rougailconfig['step.user_data'] = ['yaml']
2025-11-03 18:01:10 +01:00
rougailconfig['yaml.filename'] = [str(filename)]
2025-11-02 20:39:39 +01:00
data = RougailUserDataYaml(tiramisu_config, rougailconfig=rougailconfig)
2025-05-05 18:21:57 +02:00
ret = data.run()
errors = rougail.user_datas(ret)
2025-11-02 20:39:39 +01:00
export = RougailOutputConsole(tiramisu_config,
rougailconfig=rougailconfig,
user_data_errors=errors['errors'],
user_data_warnings=errors['warnings'],
)
console = export.run()[1]
2024-07-21 11:27:47 +02:00
conv = Ansi2HTMLConverter(inline=True)
2025-11-03 18:01:10 +01:00
doc += inv_formatter.title('Output', 4)
2025-11-09 14:20:04 +01:00
cmd = CMD + f"-u yaml -yf {filename}"
with (dirname / "cmd_ro.txt").open("w") as fh:
fh.write(cmd)
doc += f"```shell\n{cmd}\n```\n"
2025-11-02 20:39:39 +01:00
conv_data = '<pre>' + conv.convert(console, full=False) + "</pre>\n"
2025-05-05 18:21:57 +02:00
doc += conv_data
with open(dirname / 'output_ro.html', 'w') as fh_output:
fh_output.write(conv_data)
2025-11-09 14:20:04 +01:00
if (dirname / 'invalid').is_file():
errors2 = rougail.user_datas(ret, invalid_user_datas_error=True)
2025-11-02 20:39:39 +01:00
export = RougailOutputConsole(tiramisu_config,
rougailconfig=rougailconfig,
2025-11-09 14:20:04 +01:00
user_data_errors=errors2['errors'],
user_data_warnings=errors2['warnings'],
)
console = export.run()[1]
conv = Ansi2HTMLConverter(inline=True)
doc += inv_formatter.title('Output when invalid user datas is an error', 4)
cmd2 = cmd + " --cli.invalid_user_datas_error"
with (dirname / "cmd_invalid.txt").open("w") as fh:
fh.write(cmd2)
doc += f"```shell\n{cmd2}\n```\n"
conv_data = '<pre>' + conv.convert(console, full=False) + "</pre>\n"
doc += conv_data
with open(dirname / 'output_invalid.html', 'w') as fh_output:
fh_output.write(conv_data)
if (dirname / 'read_write').is_file():
trougailconfig = rougailconfig.copy()
trougailconfig["console.mandatory"] = False
tiramisu_config.property.read_write()
errors2 = rougail.user_datas(ret, invalid_user_datas_error=True)
export = RougailOutputConsole(tiramisu_config,
rougailconfig=trougailconfig,
user_data_errors=errors2['errors'],
user_data_warnings=errors2['warnings'],
2025-11-02 20:39:39 +01:00
)
console = export.run()[1]
2024-07-21 11:27:47 +02:00
conv = Ansi2HTMLConverter(inline=True)
2025-11-03 18:01:10 +01:00
doc += inv_formatter.title('Output in read write mode', 4)
2025-11-09 14:20:04 +01:00
cmd2 = cmd + " --cli.read_write"
with (dirname / "cmd_rw.txt").open("w") as fh:
fh.write(cmd2)
doc += f"```shell\n{cmd2}\n```\n"
conv_data = '<pre>' + conv.convert(console, full=False) + "</pre>\n"
doc += conv_data
2025-05-05 18:21:57 +02:00
with open(dirname / 'output_rw.html', 'w') as fh_output:
fh_output.write(conv_data)
2025-11-10 08:20:56 +01:00
tiramisu_config.property.read_only()
2025-05-05 18:21:57 +02:00
#
summary = Path('summary_after.md')
if summary.is_file():
with summary.open('r') as sfh:
doc += '\n\n' + sfh.read()
2024-07-21 11:27:47 +02:00
#
2025-05-05 18:21:57 +02:00
doc_file = Path('README.md')
2024-07-21 11:27:47 +02:00
with doc_file.open('w') as docfh:
docfh.write(doc)
with doc_file.open('w') as docfh:
docfh.write(doc)