rougail-user-data-yaml/tests/test_tutorial.py

111 lines
5.2 KiB
Python
Raw Permalink Normal View History

2026-05-01 09:12:28 +02:00
from pathlib import Path
from rougail import Rougail, RougailConfig
from rougail.user_data_yaml import RougailUserDataYaml
from rougail.user_data import mandatories
from json import load, dump, loads, dumps
import shutil
from rougail_tests.utils import config_to_dict
TUTORIAL_ROUGAIL = "../rougail-tutorials_builder/examples/"
TMP = Path("tutorial_tmp")
RESULT = Path("tests") / "result_tutorial"
def test_tutorial():
tmp_structural_files = TMP / "structural"
tmp_types_files = TMP / "types"
if TMP.is_dir():
shutil.rmtree(TMP)
tmp_structural_files.mkdir(parents=True)
tmp_types_files.mkdir()
namespace_support = False
tmp_structural_files.mkdir(exist_ok=True)
for src_exercice in sorted(Path(TUTORIAL_ROUGAIL).iterdir()):
result_files = RESULT / src_exercice.name
result_files.mkdir(parents=True, exist_ok=True)
if (src_exercice / "namespace").is_file():
namespace_support = True
src_types = src_exercice / "types"
if src_types.is_dir():
for types in src_types.iterdir():
for t in types.iterdir():
shutil.copy(t, tmp_types_files / t.name)
for src_namespace in (src_exercice / "structural_files").iterdir():
if not src_namespace.is_dir():
continue
structure_directory = tmp_structural_files / src_namespace.name
structure_directory.mkdir(exist_ok=True)
for filename in src_namespace.iterdir():
if not filename.name.endswith('.yml'):
continue
shutil.copyfile(filename, structure_directory / filename.name)
src_configs = src_exercice / "config"
if not src_configs.is_dir():
continue
rougailconfig = RougailConfig.copy()
if namespace_support:
rougailconfig['main_namespace'] = 'firefox'
rougailconfig['main_structural_directories'] = [str(tmp_structural_files / "firefox")]
if (tmp_structural_files / 'foxyproxy').is_dir():
rougailconfig['extra_namespaces'] = {"foxyproxy": [str(tmp_structural_files / "foxyproxy")]} # extra_namespaces
else:
rougailconfig['main_namespace'] = None
rougailconfig['main_structural_directories'] = [str(structure_directory)]
types = [str(t) for t in tmp_types_files.iterdir()]
if types:
rougailconfig['types'] = types
tiramisu_tmp = TMP / "tiramisu.py"
try:
rougailconfig['tiramisu_cache'] = str(tiramisu_tmp)
except:
rougailconfig['cli.tiramisu_cache'] = str(tiramisu_tmp)
rougailconfig['step.user_data'] = ['yaml']
for src_config in src_configs.iterdir():
if src_config.is_file():
continue
result_errors = result_files / f"errors_{src_config.name}.json"
rougailconfig['yaml.filename'] = [str(f) for f in src_config.iterdir() if str(f).endswith('.yml')]
#
rougail = Rougail(rougailconfig)
config = rougail.run()
generated_user_data = RougailUserDataYaml(config, rougailconfig=rougailconfig).run()
errors = rougail.user_data(generated_user_data)
for l, data in errors.items():
for i, d in enumerate(data):
if isinstance(d, dict):
data[i] = [[l, v.path, v.index] for l, v in d.items()]
if not result_errors.is_file():
with result_errors.open('a') as json_file:
dump(errors, json_file, indent=4)
with result_errors.open() as json_file:
expected_errors = load(json_file)
assert expected_errors == errors, result_errors
#
for read_write in [True, False]:
if read_write:
config.property.read_write()
result_file = result_files / f"{src_config.name}_rw.json"
else:
config.property.read_only()
result_file = result_files / f"{src_config.name}_ro.json"
config_dict = []
mandatories(config, config_dict)
if config_dict:
for i, d in enumerate(config_dict):
if isinstance(d, dict):
config_dict[i] = [[l, v.path, v.index] for l, v in d.items()]
else:
config_dict = dict(config_to_dict(config.value.get()))
if src_exercice.name in ['181', '182'] and src_config.name in ['02', '03']:
config_dict['foxyproxy.proxies.title'][0]['foxyproxy.proxies.color'] = '#9b3677'
if src_exercice.name in ['210', '211'] and src_config.name in ['02', '03']:
config_dict['foxyproxy.proxies.title'][1]['foxyproxy.proxies.color'] = '#9b3677'
if not result_file.is_file():
with result_file.open('a') as json_file:
dump(config_dict, json_file, indent=4)
with result_file.open() as json_file:
expected = load(json_file)
assert expected == config_dict, result_file
shutil.rmtree(TMP)