111 lines
5.2 KiB
Python
111 lines
5.2 KiB
Python
|
|
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)
|