fix: black
This commit is contained in:
parent
97bc49c785
commit
90ae5951f8
7 changed files with 211 additions and 136 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Silique (https://www.silique.fr)
|
Silique (https://www.silique.fr)
|
||||||
Copyright (C) 2025-2026
|
Copyright (C) 2025-2026
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
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
|
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
|
Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
|
@ -15,6 +15,7 @@ details.
|
||||||
You should have received a copy of the GNU Lesser General Public License
|
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/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from .display import RougailOutputDisplay
|
from .display import RougailOutputDisplay
|
||||||
from .__version__ import __version__
|
from .__version__ import __version__
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,9 +41,9 @@ def get_outputs() -> None:
|
||||||
level = obj_class.level
|
level = obj_class.level
|
||||||
if level in outputs:
|
if level in outputs:
|
||||||
raise ImportError(
|
raise ImportError(
|
||||||
_('duplicated level in rougail-output-display for output "{0}": {1} and {2}').format(
|
_(
|
||||||
level, obj_class.name, outputs[level].name
|
'duplicated level in rougail-output-display for output "{0}": {1} and {2}'
|
||||||
)
|
).format(level, obj_class.name, outputs[level].name)
|
||||||
)
|
)
|
||||||
if obj_class.name in names:
|
if obj_class.name in names:
|
||||||
raise ImportError(
|
raise ImportError(
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,12 @@ from typing import Optional, Any
|
||||||
from ruamel.yaml import YAML
|
from ruamel.yaml import YAML
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from tiramisu.error import PropertiesOptionError, LeadershipError, ConfigError, AttributeOptionError
|
from tiramisu.error import (
|
||||||
|
PropertiesOptionError,
|
||||||
|
LeadershipError,
|
||||||
|
ConfigError,
|
||||||
|
AttributeOptionError,
|
||||||
|
)
|
||||||
from tiramisu import owners, groups
|
from tiramisu import owners, groups
|
||||||
|
|
||||||
from .config import OutPuts
|
from .config import OutPuts
|
||||||
|
|
@ -43,6 +48,7 @@ class RougailOutputDisplay:
|
||||||
) -> None:
|
) -> None:
|
||||||
if rougailconfig is None:
|
if rougailconfig is None:
|
||||||
from rougail import RougailConfig
|
from rougail import RougailConfig
|
||||||
|
|
||||||
rougailconfig = RougailConfig
|
rougailconfig = RougailConfig
|
||||||
self.rougailconfig = rougailconfig
|
self.rougailconfig = rougailconfig
|
||||||
self.config = config
|
self.config = config
|
||||||
|
|
@ -61,7 +67,7 @@ class RougailOutputDisplay:
|
||||||
if user_data_warnings is None:
|
if user_data_warnings is None:
|
||||||
user_data_warnings = []
|
user_data_warnings = []
|
||||||
self.user_data_warnings = user_data_warnings
|
self.user_data_warnings = user_data_warnings
|
||||||
# self.out = []
|
# self.out = []
|
||||||
self.nodes = None
|
self.nodes = None
|
||||||
self.yaml = YAML()
|
self.yaml = YAML()
|
||||||
self.yaml.indent(mapping=2, sequence=4, offset=2)
|
self.yaml.indent(mapping=2, sequence=4, offset=2)
|
||||||
|
|
@ -75,27 +81,36 @@ class RougailOutputDisplay:
|
||||||
errors_warnings_dict = {}
|
errors_warnings_dict = {}
|
||||||
if not errors and self.nodes is None:
|
if not errors and self.nodes is None:
|
||||||
show_secrets = self.rougailconfig["display.show_secrets"]
|
show_secrets = self.rougailconfig["display.show_secrets"]
|
||||||
self.nodes = Node(self.yaml, show_secrets, self.config, self.root_config, self.config_owner_is_path, errors)
|
self.nodes = Node(
|
||||||
|
self.yaml,
|
||||||
|
show_secrets,
|
||||||
|
self.config,
|
||||||
|
self.root_config,
|
||||||
|
self.config_owner_is_path,
|
||||||
|
errors,
|
||||||
|
)
|
||||||
if warnings:
|
if warnings:
|
||||||
level = "warnings"
|
level = "warnings"
|
||||||
#output.display_warnings(errors_warnings_dict, warnings)
|
# output.display_warnings(errors_warnings_dict, warnings)
|
||||||
for warning in warnings:
|
for warning in warnings:
|
||||||
output.error_warn_to_dict(warning, errors_warnings_dict, 'warning')
|
output.error_warn_to_dict(warning, errors_warnings_dict, "warning")
|
||||||
if errors:
|
if errors:
|
||||||
level = "errors"
|
level = "errors"
|
||||||
for error in errors:
|
for error in errors:
|
||||||
output.error_warn_to_dict(error, errors_warnings_dict, 'error')
|
output.error_warn_to_dict(error, errors_warnings_dict, "error")
|
||||||
if level:
|
if level:
|
||||||
if level == "errors":
|
if level == "errors":
|
||||||
tree = output.error_header()
|
tree = output.error_header()
|
||||||
else:
|
else:
|
||||||
tree = output.warning_header()
|
tree = output.warning_header()
|
||||||
ret = output.parse_error_warning(tree, errors_warnings_dict, output.display_error, level)
|
ret = output.parse_error_warning(
|
||||||
|
tree, errors_warnings_dict, output.display_error, level
|
||||||
|
)
|
||||||
if errors:
|
if errors:
|
||||||
return False, ret
|
return False, ret
|
||||||
ret += "\n"
|
ret += "\n"
|
||||||
else:
|
else:
|
||||||
ret = ''
|
ret = ""
|
||||||
code, run = output.run(self.nodes, self.layer_datas)
|
code, run = output.run(self.nodes, self.layer_datas)
|
||||||
return code, ret + run
|
return code, ret + run
|
||||||
|
|
||||||
|
|
@ -116,10 +131,10 @@ class Node:
|
||||||
errors,
|
errors,
|
||||||
*,
|
*,
|
||||||
node=None,
|
node=None,
|
||||||
values: Optional[dict]=None,
|
values: Optional[dict] = None,
|
||||||
level: int=0,
|
level: int = 0,
|
||||||
leader_index: Optional[int]=None,
|
leader_index: Optional[int] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.yaml = yaml
|
self.yaml = yaml
|
||||||
self.show_secrets = show_secrets
|
self.show_secrets = show_secrets
|
||||||
self.config = config
|
self.config = config
|
||||||
|
|
@ -141,7 +156,9 @@ class Node:
|
||||||
if node and node.isoptiondescription() and node.isleadership():
|
if node and node.isoptiondescription() and node.isleadership():
|
||||||
values_iter = iter(values.items())
|
values_iter = iter(values.items())
|
||||||
leader, leader_values = next(values_iter)
|
leader, leader_values = next(values_iter)
|
||||||
followers_values = {idx: {leader: value} for idx, value in enumerate(leader_values)}
|
followers_values = {
|
||||||
|
idx: {leader: value} for idx, value in enumerate(leader_values)
|
||||||
|
}
|
||||||
for follower, follower_value in values_iter:
|
for follower, follower_value in values_iter:
|
||||||
followers_values[follower.index()][follower] = follower_value
|
followers_values[follower.index()][follower] = follower_value
|
||||||
for idx, fvalues in enumerate(followers_values.values()):
|
for idx, fvalues in enumerate(followers_values.values()):
|
||||||
|
|
@ -174,25 +191,33 @@ class Node:
|
||||||
option,
|
option,
|
||||||
values,
|
values,
|
||||||
*,
|
*,
|
||||||
leader_index: Optional[int]=None,
|
leader_index: Optional[int] = None,
|
||||||
) -> 'Node':
|
) -> "Node":
|
||||||
self.children.append({"type": "node",
|
self.children.append(
|
||||||
"node": Node(
|
{
|
||||||
self.yaml,
|
"type": "node",
|
||||||
self.show_secrets,
|
"node": Node(
|
||||||
self.config,
|
self.yaml,
|
||||||
self.root_config,
|
self.show_secrets,
|
||||||
self.config_owner_is_path,
|
self.config,
|
||||||
self.errors,
|
self.root_config,
|
||||||
node=option,
|
self.config_owner_is_path,
|
||||||
values=values,
|
self.errors,
|
||||||
level=self.level + 1,
|
node=option,
|
||||||
leader_index=leader_index,
|
values=values,
|
||||||
),
|
level=self.level + 1,
|
||||||
})
|
leader_index=leader_index,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
def add_leaf(
|
def add_leaf(
|
||||||
self, option, value: Any, *, leader_index: Optional[int] = None, description: Optional[str] = None
|
self,
|
||||||
|
option,
|
||||||
|
value: Any,
|
||||||
|
*,
|
||||||
|
leader_index: Optional[int] = None,
|
||||||
|
description: Optional[str] = None,
|
||||||
):
|
):
|
||||||
properties = option.property.get()
|
properties = option.property.get()
|
||||||
if description is None:
|
if description is None:
|
||||||
|
|
@ -200,15 +225,23 @@ class Node:
|
||||||
icon = "leaf"
|
icon = "leaf"
|
||||||
else:
|
else:
|
||||||
icon = "node"
|
icon = "node"
|
||||||
self.children.append({"type": "leaf",
|
self.children.append(
|
||||||
"description": description,
|
{
|
||||||
"values": self.get_values(option, value, leader_index, properties),
|
"type": "leaf",
|
||||||
"icon": icon,
|
"description": description,
|
||||||
"hidden": "hidden" in properties,
|
"values": self.get_values(option, value, leader_index, properties),
|
||||||
},
|
"icon": icon,
|
||||||
)
|
"hidden": "hidden" in properties,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
def get_values(self, option: "Option", value: Any, leader_index: Optional[int], properties: list[str]) -> None:
|
def get_values(
|
||||||
|
self,
|
||||||
|
option: "Option",
|
||||||
|
value: Any,
|
||||||
|
leader_index: Optional[int],
|
||||||
|
properties: list[str],
|
||||||
|
) -> None:
|
||||||
if option.isoptiondescription():
|
if option.isoptiondescription():
|
||||||
return [{"is_default": True, "value": value, "loaded_from": None}]
|
return [{"is_default": True, "value": value, "loaded_from": None}]
|
||||||
values = []
|
values = []
|
||||||
|
|
@ -219,7 +252,7 @@ class Node:
|
||||||
loaded_from_key = f"loaded_from_{index}"
|
loaded_from_key = f"loaded_from_{index}"
|
||||||
else:
|
else:
|
||||||
loaded_from_key = "loaded_from"
|
loaded_from_key = "loaded_from"
|
||||||
#default = option.owner.isdefault() or not option.information.get("default_value_makes_sense", True)
|
# default = option.owner.isdefault() or not option.information.get("default_value_makes_sense", True)
|
||||||
force_store_value = "force_store_value" in properties
|
force_store_value = "force_store_value" in properties
|
||||||
is_default = option.owner.isdefault()
|
is_default = option.owner.isdefault()
|
||||||
option_path = option.path()
|
option_path = option.path()
|
||||||
|
|
@ -230,7 +263,7 @@ class Node:
|
||||||
else:
|
else:
|
||||||
true_default = is_default and meta_option.owner.get() == default_owner
|
true_default = is_default and meta_option.owner.get() == default_owner
|
||||||
added = not is_default or true_default
|
added = not is_default or true_default
|
||||||
secret_manager = option.information.get('secret_manager', False)
|
secret_manager = option.information.get("secret_manager", False)
|
||||||
while True:
|
while True:
|
||||||
if values and true_default and (value in [None, []] or secret_manager):
|
if values and true_default and (value in [None, []] or secret_manager):
|
||||||
break
|
break
|
||||||
|
|
@ -256,7 +289,9 @@ class Node:
|
||||||
if is_default and (not meta_config_path or "." not in meta_config_path):
|
if is_default and (not meta_config_path or "." not in meta_config_path):
|
||||||
# we are in root metaconfig and we have default value
|
# we are in root metaconfig and we have default value
|
||||||
break
|
break
|
||||||
new_meta_config = self.get_metaconfig_with_default_value(meta_config, meta_option)
|
new_meta_config = self.get_metaconfig_with_default_value(
|
||||||
|
meta_config, meta_option
|
||||||
|
)
|
||||||
if not new_meta_config:
|
if not new_meta_config:
|
||||||
break
|
break
|
||||||
meta_option = new_meta_config.option(option_path, index)
|
meta_option = new_meta_config.option(option_path, index)
|
||||||
|
|
@ -297,11 +332,7 @@ class Node:
|
||||||
value: Any,
|
value: Any,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""Dump variable, means transform bool, ... to yaml string"""
|
"""Dump variable, means transform bool, ... to yaml string"""
|
||||||
if (
|
if value is not None and not self.show_secrets and option.type() == "password":
|
||||||
value is not None
|
|
||||||
and not self.show_secrets
|
|
||||||
and option.type() == "password"
|
|
||||||
):
|
|
||||||
return "*" * 10
|
return "*" * 10
|
||||||
if isinstance(value, str):
|
if isinstance(value, str):
|
||||||
return value
|
return value
|
||||||
|
|
@ -322,7 +353,7 @@ class Node:
|
||||||
return self.config
|
return self.config
|
||||||
if not self.config_owner_is_path:
|
if not self.config_owner_is_path:
|
||||||
while True:
|
while True:
|
||||||
if meta_config.type() != 'metaconfig':
|
if meta_config.type() != "metaconfig":
|
||||||
return None
|
return None
|
||||||
meta_config = meta_config.parent()
|
meta_config = meta_config.parent()
|
||||||
if not meta_config.owner.isdefault():
|
if not meta_config.owner.isdefault():
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Silique (https://www.silique.fr)
|
Silique (https://www.silique.fr)
|
||||||
Copyright (C) 2022-2026
|
Copyright (C) 2022-2026
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
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
|
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
|
Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
|
@ -33,7 +33,7 @@ class OutputFamily(CommonOutput):
|
||||||
value_unmodified_color = "gold1"
|
value_unmodified_color = "gold1"
|
||||||
value_modified_color = "green"
|
value_modified_color = "green"
|
||||||
value_default_color = None
|
value_default_color = None
|
||||||
error_color = 'bright_red'
|
error_color = "bright_red"
|
||||||
error_icon = "stop_sign"
|
error_icon = "stop_sign"
|
||||||
warning_color = "bright_yellow"
|
warning_color = "bright_yellow"
|
||||||
warning_icon = "bell"
|
warning_icon = "bell"
|
||||||
|
|
@ -56,14 +56,23 @@ class OutputFamily(CommonOutput):
|
||||||
if self.variable_default_enable:
|
if self.variable_default_enable:
|
||||||
caption_line += _("Variable") + "\n"
|
caption_line += _("Variable") + "\n"
|
||||||
if self.variable_hidden_enable:
|
if self.variable_hidden_enable:
|
||||||
caption_line += self.set_color(self.variable_hidden_color, _("Unmodifiable variable")) + "\n"
|
caption_line += (
|
||||||
|
self.set_color(self.variable_hidden_color, _("Unmodifiable variable"))
|
||||||
|
+ "\n"
|
||||||
|
)
|
||||||
header_value = ""
|
header_value = ""
|
||||||
if self.value_unmodified_enable:
|
if self.value_unmodified_enable:
|
||||||
header_value += self.set_color(self.value_unmodified_color, _("Default value")) + "\n"
|
header_value += (
|
||||||
|
self.set_color(self.value_unmodified_color, _("Default value")) + "\n"
|
||||||
|
)
|
||||||
if self.value_modified_enable:
|
if self.value_modified_enable:
|
||||||
header_value += self.set_color(self.value_modified_color, _("Modified value")) + "\n"
|
header_value += (
|
||||||
|
self.set_color(self.value_modified_color, _("Modified value")) + "\n"
|
||||||
|
)
|
||||||
if self.value_default_enable:
|
if self.value_default_enable:
|
||||||
header_value += f'(:hourglass_flowing_sand: {_("Original default value")})\n'
|
header_value += (
|
||||||
|
f'(:hourglass_flowing_sand: {_("Original default value")})\n'
|
||||||
|
)
|
||||||
caption = Table.grid(padding=1, collapse_padding=True)
|
caption = Table.grid(padding=1, collapse_padding=True)
|
||||||
caption.pad_edge = False
|
caption.pad_edge = False
|
||||||
caption.add_row(caption_line[:-1], header_value[:-1])
|
caption.add_row(caption_line[:-1], header_value[:-1])
|
||||||
|
|
@ -82,7 +91,7 @@ class OutputFamily(CommonOutput):
|
||||||
f"[bold][{self.error_color}]:{self.error_icon}: {_('Caution')}[/{self.error_color}][/bold]",
|
f"[bold][{self.error_color}]:{self.error_icon}: {_('Caution')}[/{self.error_color}][/bold]",
|
||||||
guide_style=f"bold {self.error_color}",
|
guide_style=f"bold {self.error_color}",
|
||||||
)
|
)
|
||||||
# self.out.append(tree)
|
# self.out.append(tree)
|
||||||
return tree
|
return tree
|
||||||
|
|
||||||
def display_error(self, level, tree, msg, default_color):
|
def display_error(self, level, tree, msg, default_color):
|
||||||
|
|
@ -92,7 +101,7 @@ class OutputFamily(CommonOutput):
|
||||||
color = self.warning_color
|
color = self.warning_color
|
||||||
if isinstance(msg, tuple):
|
if isinstance(msg, tuple):
|
||||||
if len(msg) == 3:
|
if len(msg) == 3:
|
||||||
if msg[2] == 'error':
|
if msg[2] == "error":
|
||||||
color = self.error_color
|
color = self.error_color
|
||||||
icon = self.error_icon
|
icon = self.error_icon
|
||||||
else:
|
else:
|
||||||
|
|
@ -100,19 +109,19 @@ class OutputFamily(CommonOutput):
|
||||||
icon = self.warning_icon
|
icon = self.warning_icon
|
||||||
msg = f"{msg[0]}: [{color}]:{icon}: {msg[1]}[/{color}]"
|
msg = f"{msg[0]}: [{color}]:{icon}: {msg[1]}[/{color}]"
|
||||||
else:
|
else:
|
||||||
if msg[1] == 'error':
|
if msg[1] == "error":
|
||||||
icon = self.error_icon
|
icon = self.error_icon
|
||||||
else:
|
else:
|
||||||
color = self.warning_color
|
color = self.warning_color
|
||||||
icon = self.warning_icon
|
icon = self.warning_icon
|
||||||
msg = f"[{color}]:{icon}: {msg[0]}[/{color}]"
|
msg = f"[{color}]:{icon}: {msg[0]}[/{color}]"
|
||||||
tree.guide_style = f'bold {color}'
|
tree.guide_style = f"bold {color}"
|
||||||
return tree.add(msg, guide_style=f"bold {color}")
|
return tree.add(msg, guide_style=f"bold {color}")
|
||||||
|
|
||||||
def display(self, tree):
|
def display(self, tree):
|
||||||
console = Console(force_terminal=True, width=self.max_width)
|
console = Console(force_terminal=True, width=self.max_width)
|
||||||
with console.capture() as capture:
|
with console.capture() as capture:
|
||||||
console.print(tree)
|
console.print(tree)
|
||||||
return capture.get()
|
return capture.get()
|
||||||
|
|
||||||
def warning_header(self):
|
def warning_header(self):
|
||||||
|
|
@ -120,21 +129,27 @@ class OutputFamily(CommonOutput):
|
||||||
f"[bold][{self.warning_color}]:{self.warning_icon}: {_('Warning')}[/{self.warning_color}][/bold]",
|
f"[bold][{self.warning_color}]:{self.warning_icon}: {_('Warning')}[/{self.warning_color}][/bold]",
|
||||||
guide_style=f"bold {self.warning_color}",
|
guide_style=f"bold {self.warning_color}",
|
||||||
)
|
)
|
||||||
# self.out.append(tree)
|
# self.out.append(tree)
|
||||||
return tree
|
return tree
|
||||||
#
|
|
||||||
# def display_warning(self, level, tree, msg):
|
#
|
||||||
# if isinstance(msg, tuple):
|
# def display_warning(self, level, tree, msg):
|
||||||
# msg = f"{msg[0]}: [{self.warning_color}]:{self.warning_icon}: {msg[1]}[/{self.warning_color}]"
|
# if isinstance(msg, tuple):
|
||||||
# return tree.add(msg, guide_style=f"bold {self.warning_color}")
|
# msg = f"{msg[0]}: [{self.warning_color}]:{self.warning_icon}: {msg[1]}[/{self.warning_color}]"
|
||||||
|
# return tree.add(msg, guide_style=f"bold {self.warning_color}")
|
||||||
|
|
||||||
def add_variable(
|
def add_variable(
|
||||||
self, parent, description, value, icon, level,
|
self,
|
||||||
|
parent,
|
||||||
|
description,
|
||||||
|
value,
|
||||||
|
icon,
|
||||||
|
level,
|
||||||
):
|
):
|
||||||
if icon == 'leaf':
|
if icon == "leaf":
|
||||||
icon = 'notebook'
|
icon = "notebook"
|
||||||
else:
|
else:
|
||||||
icon = 'open_file_folder'
|
icon = "open_file_folder"
|
||||||
if isinstance(value, list):
|
if isinstance(value, list):
|
||||||
subtree = parent.add(
|
subtree = parent.add(
|
||||||
f":{icon}: " + _("{0}:").format(description),
|
f":{icon}: " + _("{0}:").format(description),
|
||||||
|
|
@ -150,13 +165,13 @@ class OutputFamily(CommonOutput):
|
||||||
return msg
|
return msg
|
||||||
return f"[{color}]{msg}[/{color}]"
|
return f"[{color}]{msg}[/{color}]"
|
||||||
|
|
||||||
|
|
||||||
def get_parent(self, parent, description, level):
|
def get_parent(self, parent, description, level):
|
||||||
if parent is None:
|
if parent is None:
|
||||||
return Tree(description,
|
return Tree(
|
||||||
guide_style=self.guide_style,
|
description,
|
||||||
)
|
guide_style=self.guide_style,
|
||||||
|
)
|
||||||
return parent.add(
|
return parent.add(
|
||||||
f":open_file_folder: {description}",
|
f":open_file_folder: {description}",
|
||||||
guide_style=self.guide_style,
|
guide_style=self.guide_style,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Silique (https://www.silique.fr)
|
Silique (https://www.silique.fr)
|
||||||
Copyright (C) 2025-2026
|
Copyright (C) 2025-2026
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
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
|
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
|
Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
|
@ -42,12 +42,18 @@ class OutputFamily(CommonOutput):
|
||||||
if self.variable_default_enable:
|
if self.variable_default_enable:
|
||||||
variables.append(_("Variable"))
|
variables.append(_("Variable"))
|
||||||
if self.variable_hidden_enable:
|
if self.variable_hidden_enable:
|
||||||
variables.append(self.set_color(self.variable_hidden_color, _("Unmodifiable variable")))
|
variables.append(
|
||||||
|
self.set_color(self.variable_hidden_color, _("Unmodifiable variable"))
|
||||||
|
)
|
||||||
values = []
|
values = []
|
||||||
if self.value_unmodified_enable:
|
if self.value_unmodified_enable:
|
||||||
values.append(self.set_color(self.value_unmodified_color, _("Default value")))
|
values.append(
|
||||||
|
self.set_color(self.value_unmodified_color, _("Default value"))
|
||||||
|
)
|
||||||
if self.value_modified_enable:
|
if self.value_modified_enable:
|
||||||
values.append(self.set_color(self.value_modified_color, _("Modified value")))
|
values.append(
|
||||||
|
self.set_color(self.value_modified_color, _("Modified value"))
|
||||||
|
)
|
||||||
if self.value_default_enable:
|
if self.value_default_enable:
|
||||||
values.append(f'(:hourglass_flowing_sand: {_("Original default value")})')
|
values.append(f'(:hourglass_flowing_sand: {_("Original default value")})')
|
||||||
if not variables and not values:
|
if not variables and not values:
|
||||||
|
|
@ -68,14 +74,14 @@ class OutputFamily(CommonOutput):
|
||||||
|
|
||||||
def title(self, msg):
|
def title(self, msg):
|
||||||
caption = "> [!NOTE]" + "\n>\n"
|
caption = "> [!NOTE]" + "\n>\n"
|
||||||
caption += f'> **{msg}**\n'
|
caption += f"> **{msg}**\n"
|
||||||
return caption
|
return caption
|
||||||
|
|
||||||
def error_header(self):
|
def error_header(self):
|
||||||
return ['> [!CAUTION]\n> ']
|
return ["> [!CAUTION]\n> "]
|
||||||
|
|
||||||
def warning_header(self):
|
def warning_header(self):
|
||||||
return ['> [!WARNING]\n> ']
|
return ["> [!WARNING]\n> "]
|
||||||
|
|
||||||
def error_end(self):
|
def error_end(self):
|
||||||
self.out[-1] += "\n"
|
self.out[-1] += "\n"
|
||||||
|
|
@ -93,7 +99,7 @@ class OutputFamily(CommonOutput):
|
||||||
color = self.warning_color
|
color = self.warning_color
|
||||||
if isinstance(msg, tuple):
|
if isinstance(msg, tuple):
|
||||||
if len(msg) == 3:
|
if len(msg) == 3:
|
||||||
if msg[2] == 'error':
|
if msg[2] == "error":
|
||||||
color = self.error_color
|
color = self.error_color
|
||||||
icon = self.error_icon
|
icon = self.error_icon
|
||||||
else:
|
else:
|
||||||
|
|
@ -101,7 +107,7 @@ class OutputFamily(CommonOutput):
|
||||||
icon = self.warning_icon
|
icon = self.warning_icon
|
||||||
msg = f"{msg[0]}: :{icon}: {self.set_color(color, msg[1])}"
|
msg = f"{msg[0]}: :{icon}: {self.set_color(color, msg[1])}"
|
||||||
else:
|
else:
|
||||||
if msg[1] == 'error':
|
if msg[1] == "error":
|
||||||
icon = self.error_icon
|
icon = self.error_icon
|
||||||
else:
|
else:
|
||||||
color = self.warning_color
|
color = self.warning_color
|
||||||
|
|
@ -111,17 +117,22 @@ class OutputFamily(CommonOutput):
|
||||||
return tree
|
return tree
|
||||||
|
|
||||||
def add_variable(
|
def add_variable(
|
||||||
self, parent, description, value, icon, level,
|
self,
|
||||||
|
parent,
|
||||||
|
description,
|
||||||
|
value,
|
||||||
|
icon,
|
||||||
|
level,
|
||||||
):
|
):
|
||||||
if parent is None:
|
if parent is None:
|
||||||
parent = []
|
parent = []
|
||||||
if icon == 'leaf':
|
if icon == "leaf":
|
||||||
icon = 'notebook'
|
icon = "notebook"
|
||||||
else:
|
else:
|
||||||
icon = 'open_file_folder'
|
icon = "open_file_folder"
|
||||||
before = " " * (level - 1) * 2 + "- "
|
before = " " * (level - 1) * 2 + "- "
|
||||||
if isinstance(value, list):
|
if isinstance(value, list):
|
||||||
description = description.replace('◀', '←')
|
description = description.replace("◀", "←")
|
||||||
subtree = parent.append(
|
subtree = parent.append(
|
||||||
f"{before}:{icon}: " + _("{0}:").format(description),
|
f"{before}:{icon}: " + _("{0}:").format(description),
|
||||||
)
|
)
|
||||||
|
|
@ -129,7 +140,9 @@ class OutputFamily(CommonOutput):
|
||||||
for val in value:
|
for val in value:
|
||||||
parent.append(before + str(val))
|
parent.append(before + str(val))
|
||||||
else:
|
else:
|
||||||
parent.append(before + f":{icon}: " + _("{0}: {1}").format(description, value))
|
parent.append(
|
||||||
|
before + f":{icon}: " + _("{0}: {1}").format(description, value)
|
||||||
|
)
|
||||||
|
|
||||||
def set_color(self, color, msg):
|
def set_color(self, color, msg):
|
||||||
if not color:
|
if not color:
|
||||||
|
|
@ -150,5 +163,7 @@ class OutputFamily(CommonOutput):
|
||||||
parent = []
|
parent = []
|
||||||
parent.append(description)
|
parent.append(description)
|
||||||
else:
|
else:
|
||||||
parent.append(" " * (level - 1) * 2 + "- " + ":open_file_folder: " + description)
|
parent.append(
|
||||||
|
" " * (level - 1) * 2 + "- " + ":open_file_folder: " + description
|
||||||
|
)
|
||||||
return parent
|
return parent
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Silique (https://www.silique.fr)
|
Silique (https://www.silique.fr)
|
||||||
Copyright (C) 2025-2026
|
Copyright (C) 2025-2026
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
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
|
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
|
Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
|
@ -32,7 +32,7 @@ class OutputFamily(GHOutputFamily):
|
||||||
def set_color(self, color, msg):
|
def set_color(self, color, msg):
|
||||||
if not color:
|
if not color:
|
||||||
return msg
|
return msg
|
||||||
return f'[{color} {msg} {color}]'
|
return f"[{color} {msg} {color}]"
|
||||||
|
|
||||||
def title(self, msg):
|
def title(self, msg):
|
||||||
return f"> [!note] {msg}" + "\n>\n"
|
return f"> [!note] {msg}" + "\n>\n"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
"""
|
"""
|
||||||
Silique (https://www.silique.fr)
|
Silique (https://www.silique.fr)
|
||||||
Copyright (C) 2022-2026
|
Copyright (C) 2022-2026
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it
|
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
|
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
|
Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
|
@ -15,6 +15,7 @@ details.
|
||||||
You should have received a copy of the GNU Lesser General Public License
|
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/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from typing import Any, Optional
|
from typing import Any, Optional
|
||||||
|
|
||||||
# from tiramisu import owners
|
# from tiramisu import owners
|
||||||
|
|
@ -28,7 +29,7 @@ class CommonOutput:
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
rougailconfig,
|
rougailconfig,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.set_config(rougailconfig)
|
self.set_config(rougailconfig)
|
||||||
self.variable_default_enable = False
|
self.variable_default_enable = False
|
||||||
self.variable_hidden_enable = False
|
self.variable_hidden_enable = False
|
||||||
|
|
@ -44,7 +45,7 @@ class CommonOutput:
|
||||||
if nodes.children:
|
if nodes.children:
|
||||||
root = self.parse(nodes)
|
root = self.parse(nodes)
|
||||||
return self._run(root)
|
return self._run(root)
|
||||||
return 0, ''
|
return 0, ""
|
||||||
|
|
||||||
def parse(self, node, parent=None, level=0):
|
def parse(self, node, parent=None, level=0):
|
||||||
if node.hidden:
|
if node.hidden:
|
||||||
|
|
@ -55,18 +56,18 @@ class CommonOutput:
|
||||||
self.variable_default_enable = True
|
self.variable_default_enable = True
|
||||||
color = self.variable_normal_color
|
color = self.variable_normal_color
|
||||||
family_output = self.colorize(
|
family_output = self.colorize(
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"value": node.description,
|
"value": node.description,
|
||||||
"color": color,
|
"color": color,
|
||||||
"loaded_from": None,
|
"loaded_from": None,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
subparent = self.get_parent(parent, family_output, level)
|
subparent = self.get_parent(parent, family_output, level)
|
||||||
for child in node.children:
|
for child in node.children:
|
||||||
if child["type"] == "node":
|
if child["type"] == "node":
|
||||||
self.parse(child["node"], subparent, level+1)
|
self.parse(child["node"], subparent, level + 1)
|
||||||
else:
|
else:
|
||||||
if child["hidden"]:
|
if child["hidden"]:
|
||||||
self.variable_hidden_enable = True
|
self.variable_hidden_enable = True
|
||||||
|
|
@ -87,15 +88,17 @@ class CommonOutput:
|
||||||
child["values"],
|
child["values"],
|
||||||
)
|
)
|
||||||
description = self.colorize(
|
description = self.colorize(
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"value": child["description"],
|
"value": child["description"],
|
||||||
"color": variable_color,
|
"color": variable_color,
|
||||||
"loaded_from": None,
|
"loaded_from": None,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
self.add_variable(subparent, description, value, child["icon"], level+1)
|
self.add_variable(
|
||||||
|
subparent, description, value, child["icon"], level + 1
|
||||||
|
)
|
||||||
return subparent
|
return subparent
|
||||||
|
|
||||||
def header(self):
|
def header(self):
|
||||||
|
|
@ -105,12 +108,14 @@ class CommonOutput:
|
||||||
if isinstance(error, dict):
|
if isinstance(error, dict):
|
||||||
for msg, subconfig in error.items():
|
for msg, subconfig in error.items():
|
||||||
description = subconfig.option.impl_get_display_name(subconfig)
|
description = subconfig.option.impl_get_display_name(subconfig)
|
||||||
self.subconfig_to_dict(subconfig, errors_dict).setdefault(None, {}).setdefault(description, []).append((msg, level))
|
self.subconfig_to_dict(subconfig, errors_dict).setdefault(
|
||||||
|
None, {}
|
||||||
|
).setdefault(description, []).append((msg, level))
|
||||||
else:
|
else:
|
||||||
errors_dict.setdefault(None, []).append(error)
|
errors_dict.setdefault(None, []).append(error)
|
||||||
|
|
||||||
def subconfig_to_dict(self, subconfig: "Subconfig", errors_dict: dict) -> dict:
|
def subconfig_to_dict(self, subconfig: "Subconfig", errors_dict: dict) -> dict:
|
||||||
#FIXME a tester : mandatories dans une arborescence (voir si ca n'ecrase pas)
|
# FIXME a tester : mandatories dans une arborescence (voir si ca n'ecrase pas)
|
||||||
parents = []
|
parents = []
|
||||||
parent = subconfig
|
parent = subconfig
|
||||||
while True:
|
while True:
|
||||||
|
|
@ -131,18 +136,26 @@ class CommonOutput:
|
||||||
def _parse_error_warning(self, tree, error, display, level, default_color):
|
def _parse_error_warning(self, tree, error, display, level, default_color):
|
||||||
if isinstance(error, list):
|
if isinstance(error, list):
|
||||||
for err in error:
|
for err in error:
|
||||||
self._parse_error_warning(tree, err, display, level+1, default_color)
|
self._parse_error_warning(tree, err, display, level + 1, default_color)
|
||||||
elif isinstance(error, dict):
|
elif isinstance(error, dict):
|
||||||
for key, value in error.items():
|
for key, value in error.items():
|
||||||
if key is None:
|
if key is None:
|
||||||
# it's variables, no more families
|
# it's variables, no more families
|
||||||
self._parse_error_warning(tree, value, display, level, default_color)
|
self._parse_error_warning(
|
||||||
|
tree, value, display, level, default_color
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
if isinstance(value, list) and len(value) == 1:
|
if isinstance(value, list) and len(value) == 1:
|
||||||
self._parse_error_warning(tree, (key, *value[0]), display, level+1, default_color)
|
self._parse_error_warning(
|
||||||
|
tree, (key, *value[0]), display, level + 1, default_color
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
sub_tree = self._parse_error_warning(tree, key, display, level+1, default_color)
|
sub_tree = self._parse_error_warning(
|
||||||
self._parse_error_warning(sub_tree, value, display, level+1, default_color)
|
tree, key, display, level + 1, default_color
|
||||||
|
)
|
||||||
|
self._parse_error_warning(
|
||||||
|
sub_tree, value, display, level + 1, default_color
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
return display(level, tree, error, default_color)
|
return display(level, tree, error, default_color)
|
||||||
|
|
||||||
|
|
@ -153,7 +166,7 @@ class CommonOutput:
|
||||||
self,
|
self,
|
||||||
family,
|
family,
|
||||||
level,
|
level,
|
||||||
) -> 'OutputFamily':
|
) -> "OutputFamily":
|
||||||
properties = family.property.get()
|
properties = family.property.get()
|
||||||
if "hidden" in properties:
|
if "hidden" in properties:
|
||||||
self.root_family.variable_hidden_enable = True
|
self.root_family.variable_hidden_enable = True
|
||||||
|
|
@ -162,20 +175,20 @@ class CommonOutput:
|
||||||
self.root_family.variable_default_enable = True
|
self.root_family.variable_default_enable = True
|
||||||
color = None
|
color = None
|
||||||
family_output = self.colorize(
|
family_output = self.colorize(
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"value": family.description(),
|
"value": family.description(),
|
||||||
"color": color,
|
"color": color,
|
||||||
"loaded_from": None,
|
"loaded_from": None,
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
return self.__class__(
|
return self.__class__(
|
||||||
family_output,
|
family_output,
|
||||||
self.get_tree(),
|
self.get_tree(),
|
||||||
self.root,
|
self.root,
|
||||||
level + 1,
|
level + 1,
|
||||||
root_family = self.root_family,
|
root_family=self.root_family,
|
||||||
)
|
)
|
||||||
|
|
||||||
def colorize(
|
def colorize(
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue