Compare commits
4 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f6a65f6243 | |||
| f83b126589 | |||
| 90ae5951f8 | |||
| 97bc49c785 |
39 changed files with 246 additions and 340 deletions
235
CHANGELOG.md
235
CHANGELOG.md
|
|
@ -1,228 +1,59 @@
|
||||||
## 0.2.0a33 (2026-06-15)
|
## 1.0.0 (2026-06-21)
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- update tests
|
|
||||||
|
|
||||||
## 0.2.0a32 (2026-06-11)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- attributeerror
|
|
||||||
|
|
||||||
## 0.2.0a31 (2026-05-04)
|
|
||||||
|
|
||||||
### Feat
|
### Feat
|
||||||
|
|
||||||
- multi layers
|
- multi layers
|
||||||
|
|
||||||
## 0.2.0a30 (2026-01-21)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- leadership with smaller default value
|
|
||||||
|
|
||||||
## 0.2.0a29 (2026-01-21)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- update tests
|
|
||||||
- secret_manager has no real default value
|
|
||||||
|
|
||||||
## 0.2.0a28 (2026-01-16)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- display with subconfig
|
|
||||||
|
|
||||||
## 0.2.0a27 (2026-01-14)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- modified value without layer
|
|
||||||
|
|
||||||
## 0.2.0a26 (2026-01-05)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- enter in layers list
|
|
||||||
|
|
||||||
## 0.2.0a25 (2026-01-01)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- better layers support
|
|
||||||
|
|
||||||
## 0.2.0a24 (2026-01-01)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- error only if default
|
|
||||||
|
|
||||||
## 0.2.0a23 (2026-01-01)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- add layers + gitlab
|
- add layers + gitlab
|
||||||
|
|
||||||
## 0.2.0a22 (2025-12-30)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- update tests
|
|
||||||
|
|
||||||
## 0.2.0a21 (2025-12-22)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- console => display
|
|
||||||
|
|
||||||
## 0.2.0a20 (2025-12-22)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- github output
|
- github output
|
||||||
- document output
|
- document output
|
||||||
|
|
||||||
## 0.2.0a19 (2025-11-21)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- undocumented_modes is now a variable
|
- undocumented_modes is now a variable
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- black
|
|
||||||
- do not display empty console
|
|
||||||
|
|
||||||
## 0.2.0a18 (2025-11-07)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- display layers if actived
|
- display layers if actived
|
||||||
|
|
||||||
## 0.2.0a17 (2025-11-06)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- support values of differents layers
|
- support values of differents layers
|
||||||
|
|
||||||
## 0.2.0a16 (2025-11-03)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- support user data layers
|
- support user data layers
|
||||||
|
|
||||||
## 0.2.0a15 (2025-10-16)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- error format
|
|
||||||
|
|
||||||
## 0.2.0a14 (2025-10-10)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- display error with tree
|
- display error with tree
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- update tests
|
|
||||||
- tests for formatter
|
|
||||||
|
|
||||||
## 0.2.0a13 (2025-09-29)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- remove console.read_write option
|
- remove console.read_write option
|
||||||
- default value for a calculated variable with an unknown optional variable
|
- default value for a calculated variable with an unknown optional variable
|
||||||
- update tests for integer type
|
- update tests for integer type
|
||||||
|
|
||||||
## 0.2.0a12 (2025-09-22)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- dictionary => structure
|
|
||||||
|
|
||||||
## 0.2.0a11 (2025-05-12)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- display loaded_from informations
|
- display loaded_from informations
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- black
|
|
||||||
|
|
||||||
## 0.2.0a10 (2025-05-09)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- the key is the description by default instead of name
|
|
||||||
|
|
||||||
## 0.2.0a9 (2025-04-30)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- remove negative_description support
|
|
||||||
- add space before ":" in french
|
|
||||||
|
|
||||||
## 0.2.0a8 (2025-04-10)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- version
|
|
||||||
|
|
||||||
## 0.2.0a7 (2025-04-09)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- version
|
|
||||||
|
|
||||||
## 0.2.0a6 (2025-04-09)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- better output for mandatories variables
|
|
||||||
|
|
||||||
## 0.2.0a5 (2025-04-09)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- better caption + do not display None value
|
|
||||||
|
|
||||||
## 0.2.0a4 (2025-04-01)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- update translation
|
|
||||||
|
|
||||||
## 0.2.0a3 (2025-02-17)
|
|
||||||
|
|
||||||
### Fix
|
|
||||||
|
|
||||||
- do not display default value with default_value_makes_sense set to False
|
|
||||||
- translate ERRORS
|
|
||||||
|
|
||||||
## 0.2.0a2 (2025-02-10)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- output return status too
|
- output return status too
|
||||||
- add tests
|
- add tests
|
||||||
|
- exporter to console
|
||||||
## 0.2.0a1 (2024-11-28)
|
|
||||||
|
|
||||||
### Fix
|
### Fix
|
||||||
|
|
||||||
|
- rougail dependencies
|
||||||
|
- black
|
||||||
|
- update tests
|
||||||
|
- attributeerror
|
||||||
|
- leadership with smaller default value
|
||||||
|
- update tests
|
||||||
|
- secret_manager has no real default value
|
||||||
|
- display with subconfig
|
||||||
|
- modified value without layer
|
||||||
|
- enter in layers list
|
||||||
|
- better layers support
|
||||||
|
- error only if default
|
||||||
|
- update tests
|
||||||
|
- console => display
|
||||||
|
- black
|
||||||
|
- do not display empty console
|
||||||
|
- error format
|
||||||
|
- update tests
|
||||||
|
- tests for formatter
|
||||||
|
- dictionary => structure
|
||||||
|
- black
|
||||||
|
- the key is the description by default instead of name
|
||||||
|
- remove negative_description support
|
||||||
|
- add space before ":" in french
|
||||||
|
- version
|
||||||
|
- version
|
||||||
|
- better output for mandatories variables
|
||||||
|
- better caption + do not display None value
|
||||||
|
- update translation
|
||||||
|
- do not display default value with default_value_makes_sense set to False
|
||||||
|
- translate ERRORS
|
||||||
- separation between run and print function
|
- separation between run and print function
|
||||||
|
|
||||||
## 0.2.0a0 (2024-11-27)
|
|
||||||
|
|
||||||
### Feat
|
|
||||||
|
|
||||||
- exporter to console
|
|
||||||
|
|
||||||
## 0.1.0 (2024-11-06)
|
## 0.1.0 (2024-11-06)
|
||||||
|
|
||||||
## 0.1.0rc1 (2024-11-06)
|
## 0.1.0rc1 (2024-11-06)
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ requires = ["flit_core >=3.8.0,<4"]
|
||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "rougail.output_display"
|
name = "rougail.output_display"
|
||||||
version = "0.2.0a33"
|
version = "1.0.0"
|
||||||
authors = [{name = "Emmanuel Garette", email = "gnunux@gnunux.info"}]
|
authors = [{name = "Emmanuel Garette", email = "gnunux@gnunux.info"}]
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
description = "Rougail output display"
|
description = "Rougail output display"
|
||||||
|
|
@ -24,7 +24,7 @@ classifiers = [
|
||||||
|
|
||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rougail >= 1.1,<2",
|
"rougail >= 1.2.0,<2",
|
||||||
"rich ~= 13.9.3",
|
"rich ~= 13.9.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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():
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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