2019-11-23 08:17:35 +01:00
|
|
|
"""
|
2021-01-30 08:15:26 +01:00
|
|
|
Config file for Rougail
|
2019-11-23 08:17:35 +01:00
|
|
|
|
2021-01-30 08:15:26 +01:00
|
|
|
Created by:
|
|
|
|
|
EOLE (http://eole.orion.education.fr)
|
|
|
|
|
Copyright (C) 2005-2018
|
|
|
|
|
|
|
|
|
|
Forked by:
|
|
|
|
|
Cadoles (http://www.cadoles.com)
|
|
|
|
|
Copyright (C) 2019-2021
|
|
|
|
|
|
2022-11-02 23:00:42 +01:00
|
|
|
Silique (https://www.silique.fr)
|
2026-01-03 16:54:12 +01:00
|
|
|
Copyright (C) 2022-2026
|
2022-11-02 23:00:42 +01:00
|
|
|
|
2024-11-01 09:04:27 +01:00
|
|
|
This program is free software: you can redistribute it and/or modify it
|
|
|
|
|
under the terms of the GNU Lesser 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 Lesser General Public License for more
|
|
|
|
|
details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public License
|
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2019-11-23 08:17:35 +01:00
|
|
|
"""
|
2025-11-06 21:33:24 +01:00
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
from pathlib import Path
|
|
|
|
|
from tiramisu import Config
|
2025-12-22 09:58:44 +01:00
|
|
|
from tiramisu.error import display_list
|
2024-07-06 15:26:01 +02:00
|
|
|
from ruamel.yaml import YAML
|
2025-06-18 06:36:49 +02:00
|
|
|
from ..utils import _, load_modules
|
|
|
|
|
from ..tiramisu import normalize_family
|
|
|
|
|
from ..convert import RougailConvert
|
|
|
|
|
from ..convert.object_model import get_convert_option_types
|
2024-07-06 15:26:01 +02:00
|
|
|
|
|
|
|
|
|
2024-10-29 11:01:30 +01:00
|
|
|
RENAMED = {
|
2025-09-22 14:36:32 +02:00
|
|
|
"dictionaries_dir": "main_structural_directories",
|
|
|
|
|
"main_dictionaries": "main_structural_directories",
|
2024-10-29 11:01:30 +01:00
|
|
|
"variable_namespace": "main_namespace",
|
|
|
|
|
"functions_file": "functions_files",
|
|
|
|
|
}
|
|
|
|
|
NOT_IN_TIRAMISU = {
|
|
|
|
|
"custom_types": {},
|
|
|
|
|
}
|
2024-07-06 15:26:01 +02:00
|
|
|
SUBMODULES = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_sub_modules():
|
|
|
|
|
global SUBMODULES
|
|
|
|
|
if SUBMODULES is None:
|
|
|
|
|
SUBMODULES = {}
|
2025-06-18 06:36:49 +02:00
|
|
|
for submodule in Path(__file__).parent.parent.iterdir():
|
2024-10-29 11:01:30 +01:00
|
|
|
if submodule.name.startswith("_") or not submodule.is_dir():
|
2024-07-06 15:26:01 +02:00
|
|
|
continue
|
2024-10-29 11:01:30 +01:00
|
|
|
config_file = submodule / "config.py"
|
2024-07-06 15:26:01 +02:00
|
|
|
if config_file.is_file():
|
2024-10-29 11:01:30 +01:00
|
|
|
SUBMODULES[submodule.name] = load_modules(
|
|
|
|
|
"rougail." + submodule.name + ".config", str(config_file)
|
|
|
|
|
)
|
2024-07-06 15:26:01 +02:00
|
|
|
return SUBMODULES
|
2024-10-29 11:01:30 +01:00
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
|
|
|
|
|
def get_level(module):
|
2025-01-02 21:06:13 +01:00
|
|
|
return float(module["level"]) + {
|
|
|
|
|
"structural": 0.1,
|
|
|
|
|
"user data": 0.2,
|
|
|
|
|
"output": 0.3,
|
|
|
|
|
}.get(module["process"])
|
2024-07-06 15:26:01 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class _RougailConfig:
|
2025-03-19 11:43:04 +01:00
|
|
|
def __init__(self, backward_compatibility: bool, add_extra_options: bool):
|
2024-07-06 15:26:01 +02:00
|
|
|
self.backward_compatibility = backward_compatibility
|
2025-02-10 10:32:48 +01:00
|
|
|
self.add_extra_options = add_extra_options
|
|
|
|
|
self.root = None
|
|
|
|
|
|
2025-12-22 08:43:37 +01:00
|
|
|
def copy(self, backward_compatibility=None):
|
|
|
|
|
if not self.root:
|
|
|
|
|
self.generate_config()
|
|
|
|
|
config = self.config.config.copy()
|
|
|
|
|
config.value.importation(self.config.value.exportation())
|
|
|
|
|
config.property.importation(
|
|
|
|
|
self.config.property.exportation()
|
2025-02-10 10:32:48 +01:00
|
|
|
)
|
2025-12-22 08:43:37 +01:00
|
|
|
config.property.read_only()
|
|
|
|
|
if backward_compatibility is None:
|
|
|
|
|
backward_compatibility = self.backward_compatibility
|
|
|
|
|
rougailconfig = _RougailConfig(backward_compatibility, self.add_extra_options)
|
|
|
|
|
rougailconfig.root = self.root
|
|
|
|
|
rougailconfig.config = config
|
|
|
|
|
rougailconfig.extra_vars = self.extra_vars.copy()
|
|
|
|
|
rougailconfig.not_in_tiramisu = NOT_IN_TIRAMISU | rougailconfig.extra_vars
|
|
|
|
|
for variable in self.not_in_tiramisu:
|
|
|
|
|
value = getattr(self, variable)
|
|
|
|
|
if not isinstance(value, str):
|
|
|
|
|
value = value.copy()
|
|
|
|
|
setattr(rougailconfig, variable, value)
|
2025-02-10 10:32:48 +01:00
|
|
|
return rougailconfig
|
|
|
|
|
|
|
|
|
|
def generate_config(self):
|
2025-12-22 08:43:37 +01:00
|
|
|
self.root, extra_vars = _rougail_config(
|
2025-03-19 11:43:04 +01:00
|
|
|
self.backward_compatibility, self.add_extra_options
|
|
|
|
|
)
|
2024-07-06 15:26:01 +02:00
|
|
|
self.config = Config(
|
2024-10-29 11:01:30 +01:00
|
|
|
self.root,
|
|
|
|
|
)
|
2024-10-06 15:09:52 +02:00
|
|
|
self.extra_vars = extra_vars
|
|
|
|
|
self.not_in_tiramisu = NOT_IN_TIRAMISU | extra_vars
|
|
|
|
|
for variable, default_value in self.not_in_tiramisu.items():
|
2024-07-06 15:26:01 +02:00
|
|
|
if not isinstance(default_value, str):
|
|
|
|
|
default_value = default_value.copy()
|
|
|
|
|
setattr(self, variable, default_value)
|
2025-02-10 10:32:48 +01:00
|
|
|
self.config.property.read_only()
|
2024-07-06 15:26:01 +02:00
|
|
|
|
2024-10-29 11:01:30 +01:00
|
|
|
def __setitem__(
|
|
|
|
|
self,
|
|
|
|
|
key,
|
|
|
|
|
value,
|
|
|
|
|
) -> None:
|
2025-02-10 10:32:48 +01:00
|
|
|
if self.root is None:
|
|
|
|
|
self.generate_config()
|
2024-10-06 15:09:52 +02:00
|
|
|
if key in self.not_in_tiramisu:
|
2024-07-06 15:26:01 +02:00
|
|
|
setattr(self, key, value)
|
|
|
|
|
else:
|
|
|
|
|
self.config.property.read_write()
|
|
|
|
|
key = RENAMED.get(key, key)
|
|
|
|
|
option = self.config.option(key)
|
|
|
|
|
if option.isoptiondescription() and option.isleadership():
|
2025-10-29 12:11:55 +01:00
|
|
|
if isinstance(value, RConfigLeadership):
|
|
|
|
|
leader = value.leader
|
|
|
|
|
followers = value.followers
|
|
|
|
|
else:
|
|
|
|
|
leader = list(value)
|
|
|
|
|
followers = value.values()
|
2024-10-06 15:09:52 +02:00
|
|
|
option.leader().value.reset()
|
2024-07-06 15:26:01 +02:00
|
|
|
option.leader().value.set(leader)
|
|
|
|
|
follower = option.followers()[0]
|
2025-10-29 12:11:55 +01:00
|
|
|
for idx, val in enumerate(followers):
|
2024-07-06 15:26:01 +02:00
|
|
|
self.config.option(follower.path(), idx).value.set(val)
|
|
|
|
|
else:
|
|
|
|
|
option.value.set(value)
|
|
|
|
|
self.config.property.read_only()
|
|
|
|
|
|
2024-10-29 11:01:30 +01:00
|
|
|
def __getitem__(
|
|
|
|
|
self,
|
|
|
|
|
key,
|
|
|
|
|
) -> None:
|
2025-02-10 10:32:48 +01:00
|
|
|
if self.root is None:
|
|
|
|
|
self.generate_config()
|
2024-10-06 15:09:52 +02:00
|
|
|
if key in self.not_in_tiramisu:
|
2024-07-06 15:26:01 +02:00
|
|
|
return getattr(self, key)
|
|
|
|
|
option = self.config.option(key)
|
|
|
|
|
if option.isoptiondescription() and option.isleadership():
|
|
|
|
|
return self.get_leadership(option)
|
|
|
|
|
ret = self.config.option(key).value.get()
|
|
|
|
|
return ret
|
|
|
|
|
|
2025-10-05 21:41:26 +02:00
|
|
|
def __contains__(
|
2025-11-06 21:33:24 +01:00
|
|
|
self,
|
|
|
|
|
key,
|
2025-10-05 21:41:26 +02:00
|
|
|
) -> None:
|
|
|
|
|
try:
|
|
|
|
|
self.__getitem__(key)
|
|
|
|
|
except AttributeError:
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
2024-10-29 11:01:30 +01:00
|
|
|
def get_leadership(self, option) -> dict:
|
2024-08-25 12:23:06 +02:00
|
|
|
leader = None
|
|
|
|
|
followers = []
|
|
|
|
|
for opt, value in option.value.get().items():
|
|
|
|
|
if opt.issymlinkoption():
|
|
|
|
|
continue
|
|
|
|
|
if leader is None:
|
|
|
|
|
leader = value
|
|
|
|
|
else:
|
|
|
|
|
followers.append(value)
|
2025-10-29 12:11:55 +01:00
|
|
|
return RConfigLeadership(self.config, option, leader, followers)
|
2024-07-06 15:26:01 +02:00
|
|
|
|
2024-08-25 12:23:06 +02:00
|
|
|
def parse(self, config) -> str:
|
|
|
|
|
for option in config:
|
|
|
|
|
if option.isoptiondescription():
|
|
|
|
|
yield from self.parse(option)
|
|
|
|
|
elif not option.issymlinkoption():
|
2024-10-29 11:01:30 +01:00
|
|
|
yield f"{option.path()}: {option.value.get()}"
|
2024-08-25 12:23:06 +02:00
|
|
|
|
|
|
|
|
def __repr__(self):
|
2025-09-22 14:36:32 +02:00
|
|
|
if self.root is None:
|
|
|
|
|
self.generate_config()
|
2024-08-25 12:23:06 +02:00
|
|
|
self.config.property.read_write()
|
|
|
|
|
try:
|
|
|
|
|
values = "\n".join(self.parse(self.config))
|
|
|
|
|
except Exception as err:
|
|
|
|
|
values = str(err)
|
|
|
|
|
self.config.property.read_only()
|
|
|
|
|
return values
|
|
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
|
2025-11-06 21:33:24 +01:00
|
|
|
class RConfigLeadership:
|
2025-10-29 12:11:55 +01:00
|
|
|
def __init__(self, config, option, leader, followers):
|
|
|
|
|
self.config = config
|
|
|
|
|
self.option = option
|
|
|
|
|
self.leader = leader
|
|
|
|
|
self.followers = followers
|
|
|
|
|
|
|
|
|
|
def items(self):
|
|
|
|
|
return dict(zip(self.leader, self.followers)).items()
|
|
|
|
|
|
|
|
|
|
def __setitem__(
|
|
|
|
|
self,
|
|
|
|
|
key,
|
|
|
|
|
value,
|
|
|
|
|
) -> None:
|
|
|
|
|
self.config.property.read_write()
|
2025-11-06 21:33:24 +01:00
|
|
|
names = self.option.option("names")
|
2025-10-29 12:11:55 +01:00
|
|
|
leader = names.value.get()
|
|
|
|
|
leader.append(key)
|
|
|
|
|
names.value.set(leader)
|
2025-11-06 21:33:24 +01:00
|
|
|
directories = self.option.option("directories", len(leader) - 1)
|
2025-10-29 12:11:55 +01:00
|
|
|
directories.value.set(value)
|
|
|
|
|
self.leader.append(key)
|
|
|
|
|
self.followers.append(value)
|
|
|
|
|
self.config.property.read_only()
|
|
|
|
|
|
|
|
|
|
def __getitem__(self, key):
|
|
|
|
|
option = self.option.option(key)
|
|
|
|
|
if option.isleader():
|
|
|
|
|
return option.value.get()
|
|
|
|
|
return [option.index(idx).value.get() for idx in range(option.value.len())]
|
|
|
|
|
|
|
|
|
|
def __repr__(self):
|
|
|
|
|
return dict(zip(self.leader, self.followers))
|
|
|
|
|
|
|
|
|
|
|
2025-12-29 11:13:17 +01:00
|
|
|
class StaticRougailConvert(RougailConvert):
|
2024-10-29 11:01:30 +01:00
|
|
|
def __init__(
|
|
|
|
|
self,
|
|
|
|
|
add_extra_options: bool,
|
2025-12-29 11:13:17 +01:00
|
|
|
rougailconfig: dict={},
|
2024-10-29 11:01:30 +01:00
|
|
|
) -> None:
|
2024-08-08 09:04:49 +02:00
|
|
|
self.add_extra_options = add_extra_options
|
2025-12-29 11:13:17 +01:00
|
|
|
super().__init__(rougailconfig)
|
2024-08-08 09:04:49 +02:00
|
|
|
|
2024-10-06 15:09:52 +02:00
|
|
|
def load_config(self) -> None:
|
2025-09-22 14:36:32 +02:00
|
|
|
self.sort_structural_files_all = False
|
2024-07-06 15:26:01 +02:00
|
|
|
self.main_namespace = None
|
2024-10-29 11:01:30 +01:00
|
|
|
self.suffix = ""
|
2024-07-06 15:26:01 +02:00
|
|
|
self.custom_types = {}
|
|
|
|
|
self.functions_files = []
|
|
|
|
|
self.modes_level = []
|
|
|
|
|
self.extra_annotators = []
|
|
|
|
|
self.base_option_name = "baseoption"
|
|
|
|
|
self.export_with_import = True
|
|
|
|
|
self.internal_functions = []
|
2024-11-08 08:12:33 +01:00
|
|
|
self.force_optional = False
|
2025-01-02 21:06:13 +01:00
|
|
|
self.structurals = ["commandline"]
|
2025-12-22 08:43:37 +01:00
|
|
|
self.user_data = []
|
2024-12-11 20:54:03 +01:00
|
|
|
self.output = None
|
2025-01-02 21:06:13 +01:00
|
|
|
self.tiramisu_cache = False
|
2025-12-22 08:43:37 +01:00
|
|
|
# self.tiramisu_cache = "a.py"
|
2025-01-02 21:06:13 +01:00
|
|
|
self.load_unexist_redefine = False
|
2024-07-06 15:26:01 +02:00
|
|
|
|
|
|
|
|
|
2025-12-22 08:43:37 +01:00
|
|
|
def get_common_rougail_config(
|
|
|
|
|
*,
|
|
|
|
|
backward_compatibility=True,
|
|
|
|
|
) -> str:
|
2025-09-22 14:36:32 +02:00
|
|
|
rougail_options = f"""default_structural_format_version:
|
2025-12-22 08:43:37 +01:00
|
|
|
description: {_('Default version of the structural file format')}
|
|
|
|
|
help: {_('This value is only used if the version is not set in the structural file')}
|
2024-07-06 15:26:01 +02:00
|
|
|
alternative_name: v
|
|
|
|
|
choices:
|
|
|
|
|
- '1.0'
|
|
|
|
|
- '1.1'
|
|
|
|
|
mandatory: false
|
2024-10-06 15:09:52 +02:00
|
|
|
|
2025-12-29 11:13:17 +01:00
|
|
|
types:
|
|
|
|
|
description: {_("File with personalize types")}
|
|
|
|
|
help: {_("This file contains personalize types in Rougail format for structure files")}
|
|
|
|
|
type: unix_filename
|
|
|
|
|
params:
|
|
|
|
|
allow_relative: true
|
|
|
|
|
test_existence: true
|
|
|
|
|
multi: true
|
|
|
|
|
mandatory: false
|
|
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
functions_files:
|
2025-01-02 21:06:13 +01:00
|
|
|
description: {_("File with functions")}
|
2025-12-22 08:43:37 +01:00
|
|
|
help: {_("This file contains filters and additional Jinja2 functions usable in structure files")}
|
2024-07-06 15:26:01 +02:00
|
|
|
type: unix_filename
|
|
|
|
|
params:
|
|
|
|
|
allow_relative: true
|
|
|
|
|
test_existence: true
|
|
|
|
|
types:
|
|
|
|
|
- file
|
|
|
|
|
multi: true
|
|
|
|
|
mandatory: false
|
2024-10-06 15:09:52 +02:00
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
modes_level:
|
2025-01-02 21:06:13 +01:00
|
|
|
description: {_("All modes level available")}
|
2024-10-25 08:13:52 +02:00
|
|
|
multi: true
|
|
|
|
|
mandatory: false
|
|
|
|
|
"""
|
|
|
|
|
if backward_compatibility:
|
2025-01-02 21:06:13 +01:00
|
|
|
rougail_options += """ default:
|
2024-07-06 15:26:01 +02:00
|
|
|
- basic
|
|
|
|
|
- standard
|
|
|
|
|
- advanced
|
2024-10-25 08:13:52 +02:00
|
|
|
"""
|
2025-01-02 21:06:13 +01:00
|
|
|
rougail_options += f"""
|
2024-07-06 15:26:01 +02:00
|
|
|
default_family_mode:
|
2025-01-02 21:06:13 +01:00
|
|
|
description: {_("Default mode for a family")}
|
2024-07-06 15:26:01 +02:00
|
|
|
default:
|
|
|
|
|
jinja: |
|
2025-01-02 21:06:13 +01:00
|
|
|
{{% if modes_level %}}
|
|
|
|
|
{{{{ modes_level[0] }}}}
|
|
|
|
|
{{% endif %}}
|
2025-12-22 08:43:37 +01:00
|
|
|
description: {_('the first one defined in "modes_level"')}
|
2024-10-25 08:13:52 +02:00
|
|
|
disabled:
|
|
|
|
|
jinja: |
|
2025-01-02 21:06:13 +01:00
|
|
|
{{% if not modes_level %}}
|
2024-10-25 08:13:52 +02:00
|
|
|
No mode
|
2025-01-02 21:06:13 +01:00
|
|
|
{{% endif %}}
|
2025-12-22 08:43:37 +01:00
|
|
|
description: {_('when no mode is defined in "modes_level"')}
|
2024-07-06 15:26:01 +02:00
|
|
|
validators:
|
|
|
|
|
- type: jinja
|
|
|
|
|
jinja: |
|
2025-01-02 21:06:13 +01:00
|
|
|
{{% if default_family_mode not in modes_level %}}
|
|
|
|
|
not in modes_level ({{modes_level}})
|
|
|
|
|
{{% endif %}}
|
2025-12-22 08:43:37 +01:00
|
|
|
description: {_('this mode must be available in "modes_level"')}
|
2024-07-06 15:26:01 +02:00
|
|
|
commandline: false
|
2024-10-06 15:09:52 +02:00
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
default_variable_mode:
|
2025-01-02 21:06:13 +01:00
|
|
|
description: {_("Default mode for a variable")}
|
2024-07-06 15:26:01 +02:00
|
|
|
default:
|
|
|
|
|
jinja: |
|
2025-01-02 21:06:13 +01:00
|
|
|
{{% if modes_level %}}
|
|
|
|
|
{{% if modes_level | length == 1 %}}
|
|
|
|
|
{{{{ modes_level[0] }}}}
|
|
|
|
|
{{% else %}}
|
|
|
|
|
{{{{ modes_level[1] }}}}
|
|
|
|
|
{{% endif %}}
|
|
|
|
|
{{% endif %}}
|
2025-12-22 08:43:37 +01:00
|
|
|
description: {_('if the variable "modes_level" is defined, the default value is the second available element, otherwise, the first')}
|
2024-10-25 08:13:52 +02:00
|
|
|
disabled:
|
|
|
|
|
jinja: |
|
2025-01-02 21:06:13 +01:00
|
|
|
{{% if not modes_level %}}
|
2024-10-25 08:13:52 +02:00
|
|
|
No mode
|
2025-01-02 21:06:13 +01:00
|
|
|
{{% endif %}}
|
2025-12-22 08:43:37 +01:00
|
|
|
description: {_('when no mode is defined in "modes_level"')}
|
2024-07-06 15:26:01 +02:00
|
|
|
validators:
|
|
|
|
|
- type: jinja
|
|
|
|
|
jinja: |
|
2025-01-02 21:06:13 +01:00
|
|
|
{{% if default_variable_mode not in modes_level %}}
|
|
|
|
|
not in modes_level ({{modes_level}})
|
|
|
|
|
{{% endif %}}
|
2025-12-22 08:43:37 +01:00
|
|
|
description: {_('this mode must be available in "modes_level"')}
|
2024-07-06 15:26:01 +02:00
|
|
|
commandline: false
|
2024-10-06 15:09:52 +02:00
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
base_option_name:
|
2025-01-02 21:06:13 +01:00
|
|
|
description: {_("Option name for the base option")}
|
2024-07-06 15:26:01 +02:00
|
|
|
default: baseoption
|
|
|
|
|
commandline: false
|
2024-10-06 15:09:52 +02:00
|
|
|
|
2025-12-22 08:43:37 +01:00
|
|
|
export_with_import:
|
2025-01-02 21:06:13 +01:00
|
|
|
description: {_("In cache file, do not importation of Tiramisu and other dependencies")}
|
2025-12-22 08:43:37 +01:00
|
|
|
default: true
|
2024-07-06 15:26:01 +02:00
|
|
|
commandline: false
|
2024-10-06 15:09:52 +02:00
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
tiramisu_cache:
|
2025-12-22 08:43:37 +01:00
|
|
|
description: {_("Store Tiramisu cache filename")}
|
|
|
|
|
help: "{_("This file contains the Tiramisu instructions used internally to load the variables.\n\nThis file can be used for debugging")}"
|
2024-07-06 15:26:01 +02:00
|
|
|
alternative_name: t
|
|
|
|
|
type: unix_filename
|
|
|
|
|
mandatory: false
|
2026-02-11 19:40:59 +01:00
|
|
|
commandline: false
|
2024-07-06 15:26:01 +02:00
|
|
|
params:
|
|
|
|
|
allow_relative: true
|
2025-12-22 08:43:37 +01:00
|
|
|
types:
|
|
|
|
|
- file
|
2024-10-06 15:09:52 +02:00
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
internal_functions:
|
2025-01-02 21:06:13 +01:00
|
|
|
description: {_("Name of internal functions that we can use as a function")}
|
2024-07-06 15:26:01 +02:00
|
|
|
multi: true
|
|
|
|
|
mandatory: false
|
|
|
|
|
commandline: false
|
2024-10-06 15:09:52 +02:00
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
extra_annotators:
|
2025-01-02 21:06:13 +01:00
|
|
|
description: {_("Name of extra annotators")}
|
2024-10-06 15:09:52 +02:00
|
|
|
multi: true
|
|
|
|
|
mandatory: false
|
|
|
|
|
commandline: false
|
|
|
|
|
|
2024-07-06 15:26:01 +02:00
|
|
|
suffix:
|
2025-02-17 09:20:38 +01:00
|
|
|
description: {_("Suffix add to generated options name")}
|
2024-07-06 15:26:01 +02:00
|
|
|
default: ''
|
|
|
|
|
mandatory: false
|
|
|
|
|
commandline: false
|
2024-11-08 08:12:33 +01:00
|
|
|
|
|
|
|
|
force_optional:
|
2025-02-17 09:20:38 +01:00
|
|
|
description: {_("Every variables in calculation are optionals")}
|
2025-01-02 21:06:13 +01:00
|
|
|
default: False
|
|
|
|
|
|
|
|
|
|
load_unexist_redefine:
|
2025-02-17 09:20:38 +01:00
|
|
|
description: {_("Loads redefine variables even if there don't already exists")}
|
2025-01-02 21:06:13 +01:00
|
|
|
commandline: false
|
2024-11-08 08:12:33 +01:00
|
|
|
default: False
|
2025-01-02 21:06:13 +01:00
|
|
|
|
2025-12-22 08:43:37 +01:00
|
|
|
secret_manager: # {_("The secret manager")}
|
2025-03-19 11:43:04 +01:00
|
|
|
|
|
|
|
|
pattern:
|
2025-12-22 08:43:37 +01:00
|
|
|
description: {_("The secret pattern to constructing the name of the item searched for in the secret manager")}
|
|
|
|
|
help: {_("The pattern is in Jinja2 format")}
|
2025-03-19 11:43:04 +01:00
|
|
|
default: "{{{{ project }}}} - {{{{ environment }}}} - {{{{ service }}}} - {{{{ user }}}}"
|
|
|
|
|
|
2024-10-25 08:13:52 +02:00
|
|
|
"""
|
2024-10-29 11:01:30 +01:00
|
|
|
processes = {
|
|
|
|
|
"structural": [],
|
|
|
|
|
"user data": [],
|
2025-01-02 21:06:13 +01:00
|
|
|
"output": [],
|
2024-10-29 11:01:30 +01:00
|
|
|
}
|
2025-12-22 08:43:37 +01:00
|
|
|
processes_tr = {"structural": _("structural"),
|
|
|
|
|
"user data": _("user datas"),
|
|
|
|
|
"output": _("output"),
|
|
|
|
|
}
|
2025-02-17 09:20:38 +01:00
|
|
|
processes_empty = []
|
2024-07-06 15:26:01 +02:00
|
|
|
for module in get_sub_modules().values():
|
2025-01-02 21:06:13 +01:00
|
|
|
data = module.get_rougail_config(backward_compatibility=backward_compatibility)
|
2025-02-17 09:20:38 +01:00
|
|
|
if data["process"]:
|
|
|
|
|
processes[data["process"]].append(data)
|
|
|
|
|
else:
|
|
|
|
|
processes_empty.append(data["options"])
|
2024-07-06 15:26:01 +02:00
|
|
|
# reorder
|
|
|
|
|
for process in processes:
|
|
|
|
|
processes[process] = list(sorted(processes[process], key=get_level))
|
2025-01-02 21:06:13 +01:00
|
|
|
rougail_process = "step: # Load and exporter steps"
|
2024-07-06 15:26:01 +02:00
|
|
|
for process in processes:
|
2024-11-05 08:31:46 +01:00
|
|
|
if processes[process]:
|
2024-07-06 15:26:01 +02:00
|
|
|
objects = processes[process]
|
2025-05-08 22:10:28 +02:00
|
|
|
process_name = normalize_family(process)
|
2025-12-22 08:43:37 +01:00
|
|
|
tr_process_name = processes_tr[process]
|
2025-05-08 22:10:28 +02:00
|
|
|
rougail_process += f"""
|
2025-01-02 21:06:13 +01:00
|
|
|
|
2025-05-08 22:10:28 +02:00
|
|
|
{process_name}:
|
|
|
|
|
description: {_('Select for {0}').format(tr_process_name)}
|
|
|
|
|
"""
|
2025-03-19 11:43:04 +01:00
|
|
|
if process != "structural":
|
2025-12-22 08:43:37 +01:00
|
|
|
rougail_process += """ alternative_name: {NAME[0]}
|
2025-03-19 11:43:04 +01:00
|
|
|
""".format(
|
2025-05-12 08:45:39 +02:00
|
|
|
NAME=normalize_family(process),
|
|
|
|
|
)
|
2025-12-22 08:43:37 +01:00
|
|
|
rougail_process += """ choices:
|
2025-03-19 11:43:04 +01:00
|
|
|
"""
|
2024-07-06 15:26:01 +02:00
|
|
|
for obj in objects:
|
|
|
|
|
rougail_process += f" - {obj['name']}\n"
|
2024-10-29 11:01:30 +01:00
|
|
|
if process == "structural":
|
2025-03-30 18:42:13 +02:00
|
|
|
rougail_process += """ commandline: false
|
|
|
|
|
multi: true
|
2025-01-02 21:06:13 +01:00
|
|
|
default:
|
|
|
|
|
- directory
|
|
|
|
|
"""
|
2024-10-29 11:01:30 +01:00
|
|
|
elif process == "user data":
|
2024-08-08 09:04:49 +02:00
|
|
|
rougail_process += """ multi: true
|
2025-01-02 21:06:13 +01:00
|
|
|
mandatory: false"""
|
2024-10-29 11:01:30 +01:00
|
|
|
hidden_outputs = [
|
|
|
|
|
process["name"]
|
|
|
|
|
for process in processes["output"]
|
|
|
|
|
if not process.get("allow_user_data", True)
|
|
|
|
|
]
|
2024-07-06 15:26:01 +02:00
|
|
|
if hidden_outputs:
|
2025-01-02 21:06:13 +01:00
|
|
|
rougail_process += """
|
2025-05-02 08:12:03 +02:00
|
|
|
disabled:
|
2024-07-06 15:26:01 +02:00
|
|
|
type: jinja
|
|
|
|
|
jinja: |
|
|
|
|
|
"""
|
|
|
|
|
for hidden_output in hidden_outputs:
|
2025-03-19 11:43:04 +01:00
|
|
|
rougail_process += """ {% if _.output is not propertyerror and _.output == 'NAME' %}
|
2025-12-22 09:58:44 +01:00
|
|
|
Cannot load user data for NAME output
|
2025-12-22 08:43:37 +01:00
|
|
|
{% endif %}
|
2025-12-22 09:58:44 +01:00
|
|
|
""".replace(
|
2024-11-01 09:45:54 +01:00
|
|
|
"NAME", hidden_output
|
|
|
|
|
)
|
2025-12-22 11:47:35 +01:00
|
|
|
rougail_process += f""" description: {_('outputs {0} did not allow user data')}
|
2025-12-22 09:58:44 +01:00
|
|
|
""".format(display_list(hidden_outputs, add_quote=True, separator="or"))
|
2024-10-29 12:02:27 +01:00
|
|
|
elif objects:
|
2024-10-29 11:01:30 +01:00
|
|
|
rougail_process += " default: {DEFAULT}".format(
|
|
|
|
|
DEFAULT=objects[0]["name"]
|
|
|
|
|
)
|
2024-07-06 15:26:01 +02:00
|
|
|
else:
|
2025-01-02 21:06:13 +01:00
|
|
|
if process == "output":
|
|
|
|
|
prop = "hidden"
|
2024-11-05 08:31:46 +01:00
|
|
|
else:
|
2025-01-02 21:06:13 +01:00
|
|
|
prop = "disabled"
|
2024-07-06 15:26:01 +02:00
|
|
|
rougail_process += """
|
|
|
|
|
{NAME}:
|
|
|
|
|
description: Select for {NAME}
|
2024-08-05 18:09:13 +02:00
|
|
|
mandatory: false
|
2024-11-05 08:31:46 +01:00
|
|
|
{PROP}: true
|
2024-08-05 18:09:13 +02:00
|
|
|
multi: true
|
2024-11-05 08:31:46 +01:00
|
|
|
default: ["You haven't installed \\\"{NAME}\\\" package for rougail"]
|
|
|
|
|
validators:
|
|
|
|
|
- jinja: Please install a rougail-{NAME}-* package.
|
2024-10-29 11:01:30 +01:00
|
|
|
""".format(
|
|
|
|
|
NAME=normalize_family(process),
|
2024-11-05 08:31:46 +01:00
|
|
|
PROP=prop,
|
2024-10-29 11:01:30 +01:00
|
|
|
)
|
2025-02-10 10:32:48 +01:00
|
|
|
rougail_process += f"""
|
2025-12-22 08:43:37 +01:00
|
|
|
|
2025-05-08 22:10:28 +02:00
|
|
|
define_default_params: false # {_('Override default parameters for option type')}
|
|
|
|
|
|
2025-02-10 10:32:48 +01:00
|
|
|
default_params:
|
|
|
|
|
description: {_("Default parameters for option type")}
|
2025-05-08 22:10:28 +02:00
|
|
|
disabled:
|
|
|
|
|
variable: _.define_default_params
|
|
|
|
|
when: false
|
2025-02-10 10:32:48 +01:00
|
|
|
|
|
|
|
|
"""
|
2025-12-22 08:43:37 +01:00
|
|
|
for typ, typ_description, params in get_convert_option_types():
|
2025-02-10 10:32:48 +01:00
|
|
|
rougail_process += f"""
|
2025-12-22 08:43:37 +01:00
|
|
|
{typ}: # {typ_description}
|
2025-02-10 10:32:48 +01:00
|
|
|
"""
|
2025-12-22 08:43:37 +01:00
|
|
|
for key, key_type, description, multi, value, choices in params:
|
2025-02-10 10:32:48 +01:00
|
|
|
rougail_process += f"""
|
|
|
|
|
{key}:
|
2025-12-22 08:43:37 +01:00
|
|
|
"""
|
|
|
|
|
if description:
|
|
|
|
|
rougail_process += f""" description: "{description}"
|
|
|
|
|
"""
|
|
|
|
|
rougail_process += f""" type: {key_type}
|
2025-02-10 10:32:48 +01:00
|
|
|
multi: {multi}
|
|
|
|
|
mandatory: false
|
|
|
|
|
default: {value}
|
|
|
|
|
"""
|
2025-12-22 08:43:37 +01:00
|
|
|
if choices:
|
|
|
|
|
rougail_process += " choices:\n"
|
|
|
|
|
for choice in choices:
|
|
|
|
|
rougail_process += f" - {choice}\n"
|
2024-07-06 15:26:01 +02:00
|
|
|
rougail_options += rougail_process
|
2025-12-22 08:43:37 +01:00
|
|
|
return processes, processes_empty, rougail_options
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _rougail_config(
|
|
|
|
|
backward_compatibility: bool = True,
|
|
|
|
|
add_extra_options: bool = True,
|
|
|
|
|
) -> "OptionDescription":
|
|
|
|
|
processes, processes_empty, rougail_options = get_common_rougail_config(backward_compatibility=backward_compatibility)
|
2025-12-29 11:13:17 +01:00
|
|
|
convert = StaticRougailConvert(add_extra_options)
|
2025-01-02 21:06:13 +01:00
|
|
|
convert.init()
|
2024-07-06 15:26:01 +02:00
|
|
|
convert.namespace = None
|
|
|
|
|
convert.parse_root_file(
|
2025-12-29 11:13:17 +01:00
|
|
|
["rougail.config"],
|
2024-10-29 11:01:30 +01:00
|
|
|
"",
|
|
|
|
|
"1.1",
|
2024-07-06 15:26:01 +02:00
|
|
|
YAML().load(rougail_options),
|
|
|
|
|
)
|
2025-03-19 11:43:04 +01:00
|
|
|
for process_empty in processes_empty:
|
|
|
|
|
convert.parse_root_file(
|
2025-12-29 11:13:17 +01:00
|
|
|
["rougail.config"],
|
2025-03-19 11:43:04 +01:00
|
|
|
"",
|
|
|
|
|
"1.1",
|
|
|
|
|
YAML().load(process_empty),
|
|
|
|
|
)
|
2024-10-06 15:09:52 +02:00
|
|
|
extra_vars = {}
|
2025-01-02 21:06:13 +01:00
|
|
|
objects = []
|
|
|
|
|
for obj in sorted(
|
|
|
|
|
[obj for objects in processes.values() for obj in objects], key=get_level
|
|
|
|
|
):
|
|
|
|
|
if "extra_vars" in obj:
|
|
|
|
|
extra_vars |= obj["extra_vars"]
|
|
|
|
|
if not "options" in obj:
|
|
|
|
|
continue
|
|
|
|
|
if not isinstance(obj["options"], list):
|
|
|
|
|
options = [obj["options"]]
|
|
|
|
|
else:
|
|
|
|
|
options = obj["options"]
|
|
|
|
|
for option in options:
|
|
|
|
|
convert.parse_root_file(
|
2025-12-29 11:13:17 +01:00
|
|
|
[f'rougail.config.{obj["name"]}'],
|
2025-01-02 21:06:13 +01:00
|
|
|
"",
|
|
|
|
|
"1.1",
|
|
|
|
|
YAML().load(option),
|
|
|
|
|
)
|
2024-10-29 11:01:30 +01:00
|
|
|
|
2025-01-02 21:06:13 +01:00
|
|
|
tiram_obj = convert.save()
|
2024-07-06 15:26:01 +02:00
|
|
|
optiondescription = {}
|
|
|
|
|
exec(tiram_obj, {}, optiondescription) # pylint: disable=W0122
|
2025-02-10 10:32:48 +01:00
|
|
|
return optiondescription["option_0"], extra_vars
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_rougail_config(
|
|
|
|
|
*,
|
|
|
|
|
backward_compatibility: bool = True,
|
|
|
|
|
add_extra_options: bool = True,
|
|
|
|
|
) -> _RougailConfig:
|
2024-10-29 11:01:30 +01:00
|
|
|
return _RougailConfig(
|
|
|
|
|
backward_compatibility,
|
2025-02-10 10:32:48 +01:00
|
|
|
add_extra_options,
|
2024-10-29 11:01:30 +01:00
|
|
|
)
|
2024-07-06 15:26:01 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
RougailConfig = get_rougail_config()
|