fix: black

This commit is contained in:
egarette@silique.fr 2026-06-21 16:54:18 +02:00
parent 97bc49c785
commit 90ae5951f8
7 changed files with 211 additions and 136 deletions

View file

@ -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__

View file

@ -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(

View file

@ -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():

View file

@ -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,
) )

View file

@ -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

View file

@ -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"

View file

@ -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(